Często pracuję na parujących stacjach, na których jest zainstalowanych wiele klawiatur. Mogę użyć za setxkbmap
pomocą, -device <ID>
aby ustawić układ dla określonej klawiatury (używając identyfikatora zxinput
), ale często nie jest oczywiste, na której klawiaturze jestem. Lepiej byłoby uniknąć próbowania obu klawiatur, więc chciałbym napisać szybkie narzędzie do uzyskania tych informacji setxkbmap
. Oczekiwałbym typowego przypadku użycia takiego jak ten:
$ setxkbmap -device "$(get-keyboard-id)" -layout gb
Press Enter to detect keyboard ID
Który interfejs udostępnia te informacje w systemie Linux? Idealnie powinno działać bez X, ale nie jest to wymagane (wydaje się, że nie ma wielu narzędzi, które obsługują to bez X).
Dotychczasowe ustalenia:
- Linux musi wiedzieć, na której klawiaturze piszę, aby obsługiwać różne układy wielu klawiatur jednocześnie.
xinput
→ lista. C →list_xi2
→XIQueryDevice
zapewnia identyfikatory urządzeń, których można używaćsetxkbmap
.showkey
ixev
nie drukuj identyfikatorów klawiatury.xinput list-props $ID
pokazuje, gdzie wysyłane są zdarzenia z klawiatury . Jednak przy użyciu kodu z innej odpowiedzi wydaje się, że to urządzenie nie drukuje niczego, aby zidentyfikować klawiaturę.Jednym prawie możliwym rozwiązaniem jest uruchomienie
xinput --test <ID> &
dla każdego identyfikatora klawiatury i sprawdzenie, który z nich coś zwraca jako pierwszy. Problem polega na tym, aby dowiedzieć się, które „klawiatury” są tak naprawdę klawiaturami:$ xinput | grep keyboard ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Video Bus id=7 [slave keyboard (3)] ↳ Power Button id=8 [slave keyboard (3)] ↳ Sleep Button id=9 [slave keyboard (3)] ↳ WebCam SC-13HDL10931N id=10 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
less -f /dev/input/eventX
klawisz na odpowiedniej klawiaturze, powinieneś zobaczyć „śmieci”, więc twoje naciśnięcia klawiszy są rzeczywiście skierowane do jednego pliku programisty, a nie do innych.Odpowiedzi:
Wyłącz urządzenie
Oto jeden pomysł na określenie, która klawiatura jest która. Możesz użyć polecenia xinput, aby włączyć lub wyłączyć urządzenia.
Przykład
Powyższe dane wyjściowe pokazują różne urządzenia, które mam na moim laptopie Thinkpad. Mam tylko 1 klawiaturę, w tym:
Teraz spójrz na właściwości dostępne za pośrednictwem tego urządzenia:
Z powyższego widać, że jest włączony, więc wyłączmy go:
Aby to włączyć:
Pomysł?
Możesz włączyć wyłączenie jednej z klawiatur za pomocą tego polecenia, aby określić, na której jesteś.
Bibliografia
źródło
Pytanie brzmi trochę sprzecznie, ponieważ cytujesz narzędzia X, ale pytasz o rozwiązanie, które „idealnie powinno działać bez X”.
O swojej 4 -tego stwierdzenia:
xinput
daje korespondencjiprzynajmniej z następującą wersją
Pierwszy krok: wykrycie klawiaturowego urządzenia zdarzeń w C
Wielkie dzięki za tę stronę . Usunąłem większość kontroli bezpieczeństwa z kodu, który tam pożyczyłem, dla jasności, w prawdziwym kodzie prawdopodobnie ich potrzebujesz.
Zauważ, że naciśnięcia klawiszy są powtarzane, więc możesz chcieć uprzejmie poprosić użytkownika o naciśnięcie klawisza modyfikującego (Shift, Control ...) zamiast jakiegokolwiek klawisza.
Drugi krok: użyj xinput, aby uzyskać identyfikator X z nazwy urządzenia
Skompiluj powyższe źródło C i użyj tego:
xinput list --id-only "keyboard:$(sudo ./a.out /dev/input/event*)"
źródło
/dev/input/by-id
/dev/input/event*
- Próbowałemtail
ting ale bezskutecznie.Dalsze kopanie ujawniło inne rozwiązanie przy użyciu zwykłego Bash i zwykłego konta użytkownika. Skrypt :
źródło