Próbuję wymusić włączenie kapsla. xsetnie 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 XkbLockModifiersjest 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.
xtermwpływa na diody LED? Brzmi jak dobry pomysł, zedytuję pytanie z moimi wynikami.
xtermzapalić diodę ScrollLock, wysyłając sekwencję Escape ESC [3 q, zgodnie z plikiem ctlseqs.txtdostarczonym 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. xtermdzwoni XChangeKeyboardControldo xtermShowLEDi xtermClearLEDs, ale nigdzie nie dzwoni XkbLockModifiers.
xdotool key Caps_Lockz autoryzowanego klienta X, chociaż w rzeczywistości spowoduje to włączenie Caps Lock.