Próbuję wymusić włączenie kapsla. xset
nie działa dla mnie, więc próbuję użyć setleds
.
W konsoli graficznej to polecenie zwraca:
> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?
W terminalu wirtualnym działa, jednak efekt jest lokalny dla tego terminalu wirtualnego. Z tego co rozumiem, bieganie
> setleds -L +caps < /dev/tty1
z wirtualnego terminala (mój serwer X siedzi na tty1) powinien działać. Wymaga to jednak dostępu do konta root.
Czy istnieje sposób na wysłanie polecenia do konsoli leżącej u podstaw serwera X, czy to ze wspomnianego serwera Xserver, czy z innego VT bez roota?
Edycja: Na podstawie sugestii Marka Plotnika i na podstawie znalezionego tutaj kodu napisałem i skompilowałem:
#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;
}
Z tego, o czym pisał Gilles xset
, nie spodziewałem się, że zadziała, ale działa ... w pewnym sensie: ustawia led, ale także ustawia stan Capslock. Nie do końca rozumiem cały powyższy kod, więc mogłem popełnić głupi błąd. Najwyraźniej linia XChangeKeyboardControl...
nie zmienia zachowania programu i XkbLockModifiers
jest tym, co określa status diody LED i stanu Capslock.
xterm
źródło, a ono używa wywołania XChangeKeyboardControl (), aby ustawić lub rozbroić diody LED bez wpływu na stan Caps Lock itp. Więc jeśli możesz skompilować kod C, to jest jedno podejście.
xterm
wpływa na diody LED? Brzmi jak dobry pomysł, zedytuję pytanie z moimi wynikami.
xterm
zapalić diodę ScrollLock, wysyłając sekwencję Escape ESC [3 q, zgodnie z plikiem ctlseqs.txt
dostarczonym ze źródłem, ale nie udało mi się zapalić diod Num lub CapsLock za pomocą parametrów 1 i 2. Może potrzebuję wykonaj konfigurację XKB wymienioną w odpowiedzi. xterm
dzwoni XChangeKeyboardControl
do xtermShowLED
i xtermClearLEDs
, ale nigdzie nie dzwoni XkbLockModifiers
.
xdotool key Caps_Lock
z autoryzowanego klienta X, chociaż w rzeczywistości spowoduje to włączenie Caps Lock.