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.
xdotool key Caps_Lock
z autoryzowanego klienta X, chociaż w rzeczywistości spowoduje to włączenie Caps Lock.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 plikiemctlseqs.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
dzwoniXChangeKeyboardControl
doxtermShowLED
ixtermClearLEDs
, ale nigdzie nie dzwoniXkbLockModifiers
.Odpowiedzi:
Zasadniczo powinieneś być w stanie to zrobić za pomocą czcigodnego
xset
polecenia.lub
xset led 4
ustawić LED numer 4, jeśli system nie rozpoznaje LED po nazwie.Nie wydaje się to jednak działać niezawodnie. Na moim komputerze mogę ustawić Scroll Lock tylko w ten sposób i nie jestem jedyny . To wydaje się być kwestia konfiguracji XKB .
Poniższe obejście na poziomie użytkownika powinno działać (w przeważającej części):
Wyodrębnij bieżącą konfigurację xkb:
Edytuj plik
myconf.xkb
, zastępując!allowExplicit
goallowExplicit
w odpowiednich blokach:Załaduj nowy plik
Teraz włączanie i wyłączanie diod LED
xset
powinno działać. Według raportu o błędzie nie będzie można wyłączyć diod LED, gdy powinny one być włączone (na przykład, jeśli włączona jest funkcja CapsLock).źródło
xset
wcześniej i rzeczywiście to nie działa. Jednak nie widziałem tego zgłoszenia błędu. W każdym razie „Status: Resolved Wontfix” nie jest zbyt zachęcające ... Obejście problemuallowExplicit
prawdopodobnie by dla mnie zadziałało (nie muszę wyłączać diody LED), ale zmiana go nadal wymaga rootowania.xkbcomp
w dowolnym momencie. Nie jestem wystarczająco zaznajomiony z XKB, aby powiedzieć ci dokładnie, co musisz zmienić (ustawienie konkretnego aspektu zamiast pełnej wstępnie zdefiniowanej mapy za pomocą XKB jest trochę uciążliwe), ale unix.stackexchange.com/questions/166844/mapping -key-bindings /… powinien mieć kilka wskaźników.xkbcomp $DISPLAY output.xkb
zastąpiłem!allowExplicit
jąallowExplicit
windicator "Caps Lock"
sekcji, a następnie ponownie załadowałem plikxkbcomp output.xkb
. Jest wiele ostrzeżeń, a później xset nie działa lepiej. Przeczytam trochę więcej o xkb./usr/share/X11/xkb/compat/ledcaps
i ... / lednum i to sprawiło, że stał się trwały.Za pomocą
sed
Po wylogowaniu i ponownym zalogowaniu Caps Lockmożna teraz sterować diodą LED bez żadnych
root
uprawnień za pomocą poleceń:źródło
sudo
a potem nigdy więcej. Aby dowiedzieć się, dlaczego może to być tak ważne dla niektórych użytkowników, zobacz tęvim
aplikację .sed
jedno-linijkę.Połączenie podejścia opartego na braku rootowania przez @Gilles z ideą pełnej automatyzacji przez @Serge_Stroobandt.
Aby włączyć sterowanie diodami Caps Lock , Num Lock i Shift Lock :
Aby włączyć lub wyłączyć diodę LED:
źródło