Я пытаюсь заставить загнанный капслок. xset
не работает для меня, поэтому я пытаюсь использовать setleds
.
В графической консоли эта команда возвращает:
> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?
В виртуальном терминале это работает, однако эффект является локальным для этого виртуального терминала. Из того, что я понимаю, работает
> setleds -L +caps < /dev/tty1
с виртуального терминала (мой X-сервер сидит на tty1) должен работать. Однако для этого требуется root-доступ.
Есть ли способ отправить команду на консоль, лежащую в основе X-сервера, будь то с указанного сервера xserver или с другого VT, без рута?
Изменить: По предложению Марка Плотника и на основе кода, найденного здесь , я написал и скомпилировал следующее:
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#define SCROLLLOCK 1
#define CAPSLOCK 2
#define NUMLOCK 16
void setLeds(int leds) {
Display *dpy = XOpenDisplay(0);
XKeyboardControl values;
values.led_mode = leds & SCROLLLOCK ? LedModeOn : LedModeOff;
values.led = 3;
XChangeKeyboardControl(dpy, KBLedMode, &values);
XkbLockModifiers(dpy, XkbUseCoreKbd, CAPSLOCK | NUMLOCK,
leds & (CAPSLOCK | NUMLOCK) );
XFlush(dpy);
XCloseDisplay(dpy);
}
int main() {
setLeds(CAPSLOCK);
return 0;
}
Из того, о чем писал Жиль xset
, я не ожидал, что это сработает, но это работает ... в некотором смысле: он устанавливает светодиод, но также устанавливает статус capslock. Я не до конца понимаю весь приведенный выше код, поэтому, возможно, я сделал глупую ошибку. Видимо, строка XChangeKeyboardControl...
не меняет поведение программы, а XkbLockModifiers
именно то, что задает светодиод и статус колпачка.
xdotool key Caps_Lock
авторизованного X-клиента, хотя на самом деле это включит caps lock.xterm
источник, и он использует вызов XChangeKeyboardControl () для установки или сброса светодиодов, не влияя на состояние блокировки заглавных букв и т. Д. Поэтому, если вы можете скомпилировать код на C, это один из подходов.xterm
на светодиоды? Звучит как хорошая идея, я отредактирую вопрос своими результатами.xterm
включил светодиод ScrollLock, отправив escape-последовательность ESC [3 q, в соответствии с файлом,ctlseqs.txt
который поставляется с источником, но не смог заставить светодиоды Num или CapsLock загореться с параметрами 1 и 2. Возможно, мне нужно сделайте конфигурацию XKB, упомянутую в ответе.xterm
звонкиXChangeKeyboardControl
вxtermShowLED
иxtermClearLEDs
, но не вызываетXkbLockModifiers
вообще нигде.Ответы:
В принципе, вы должны быть в состоянии сделать это с почтенной
xset
командой.или
xset led 4
установить светодиод № 4, если ваша система не распознает светодиоды по названию.Тем не менее, это не работает надежно. На моей машине я могу только установить Scroll Lock, и я не единственный . Это , кажется, вопрос конфигурации XKB .
Должен работать следующий обходной путь на уровне пользователя (по большей части):
Извлеките текущую конфигурацию xkb:
Отредактируйте файл
myconf.xkb
, заменяя!allowExplicit
сallowExplicit
в соответствующих блоках:Загрузите новый файл
Теперь включение и выключение светодиодов
xset
должно работать. Согласно отчету об ошибке, вы не сможете отключить светодиоды, когда они должны быть включены (например, если включен CapsLock).источник
xset
раньше, и это действительно не работает. Я не видел этот отчет об ошибке, хотя. В любом случае, «Status: Resolved Wontfix» на самом деле не обнадеживает ... Обход,allowExplicit
вероятно, будет работать для меня (мне не нужно выключать индикатор ), но для его изменения все еще требуется root.xkbcomp
в любое время. Я не достаточно знаком с XKB, чтобы точно сказать, что вам нужно изменить (установка определенного аспекта, а не полной предопределенной карты с помощью XKB - это немного больно), но unix.stackexchange.com/questions/166844/mapping -key-bindings /… должно иметь несколько указателей.xkbcomp $DISPLAY output.xkb
, а затем заменить!allowExplicit
наallowExplicit
вindicator "Caps Lock"
секции, затем загрузить файл сxkbcomp output.xkb
. Предупреждений много, а потом xset не работает лучше. Я прочитаю еще немного о xkb./usr/share/X11/xkb/compat/ledcaps
и ... / lednum, и это сделало его постоянным.С помощью
sed
После выхода и повторного входа Caps Lockсветодиод теперь можно контролировать без каких-либо
root
привилегий с помощью команд:источник
sudo
а затем никогда больше. Чтобы понять, почему это может быть так важно для определенных пользователей, просмотрите этоvim
приложение .sed
одну строчку.Комбинация безрукого подхода @Gilles с идеей полной автоматизации @Serge_Stroobandt.
Чтобы включить управление индикаторами Caps Lock , Num Lock и Shift Lock :
Чтобы включить и выключить светодиод:
источник