Niedawno kupiłem klawiaturę Unicomp, która jest dostarczana z zamienionymi klawiszami right-alt i klawiszami Windows. Klawiatura identyfikuje się w następujący sposób na lsusb:
Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc
Czy istnieje sposób, aby jądro (tj. Nie oparte na xmodmap) zamieniało klawisze right-alt i Windows, aby każda aplikacja widziała je w zamienionych miejscach, nawet jeśli otrzymają surowe dane z klawiatury (zamiana rzeczy za pomocą xmodmap tego nie zrobi) ? Czy istnieje sposób, aby mieć to tylko dla tej jednej klawiatury?
linux
keyboard-layout
FUZxxl
źródło
źródło
Odpowiedzi:
Tak, jest to możliwe przy użyciu XKB. W przeciwieństwie do xmodmap, XKB może mapować klucze dla poszczególnych urządzeń.
Uwaga: Upewnij się, że masz xkbcomp> 1.2.0
Najpierw wypisz swoje urządzenia za pomocą:
xinput list
Otrzymasz coś takiego:
Zidentyfikuj ciąg urządzenia i edytuj poniższy skrypt powłoki, zmieniając linię sed na taką, która pasuje do nazwy twojego urządzenia. Następnie zmień klucze, które musisz ponownie przypisać.
Przykład: Załaduj
xev
i naciśnij klawisz, który chcesz ponownie przypisać. Załóżmy, że dowiadujesz się, że jest to kod 84. Wyszukaj 84 w https://gist.github.com/zoqaeski/3880640 . Jest tam kluczowa nazwa<KP5>
. Następnie wyszukaj klucz, który chcesz zastąpić (w tym samym linku, dalej poniżej ) i skopiuj to, co jest w nawiasach. Powtórz proces dla wszystkich wymaganych kluczy.Następnie zdobądź go (możesz dodać go do swojego .xinitrc). Wszystko gotowe! Teraz naciśnięcie klawiszy powinno wygenerować pożądane wyjście, tylko dla określonego urządzenia.
Edycja : Ostatnio zauważyłem, że z jakiegoś powodu nowa konfiguracja nie jest stosowana natychmiast. Najpierw musisz nacisnąć klawisz na drugiej klawiaturze, a następnie przetestować skonfigurowane klawisze na zmodyfikowanej klawiaturze. Nie wiem, dlaczego tak się dzieje, może jakiś bufor.
źródło
sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p'
c) Tak, zdecydowanie powinieneś najpierw przetestować, zastępując$remote_id
go numerem identyfikacyjnym. Uwaga: są tam dwa odniesienia$remote_id
, czy zmieniłeś oba?$remote_id
, upewnij się, że skomentowałeś linię,[ "$remote_id" ] || exit
jeśli jeszcze tego nie zrobiłeś, po prostu wyskoczy.$9
nie będzie działać, miałeś na myśli9
?Dla każdego, kto przychodzi tutaj z Google i chce odpowiedzi bardziej zgodnej z tym, czego pierwotnie oczekiwał pytający, znam dwa sposoby ponownego mapowania zdarzeń na
evdev
poziomie, aby zmiana dotyczyła wszystkich aplikacji:udev zapewnia interfejs API do modyfikowania wpisów w bazie danych sprzętu, które kontrolują odwzorowania między scancodes i kodami klawiszy. Ta strona ArchiWiki , która zawiera instrukcje, wyraźnie mówi, że będzie działać zarówno dla X11, jak i konsoli.
Istotą jest utworzenie niestandardowego wpisu, w
/etc/udev/hwdb.d/
którego skład wchodzą wzorzec dopasowania urządzenia i niektóre definicje odwzorowania kodu scancode-na-keycode, a następnie uruchomić,systemd-hwdb update
aby odbudować bazę danych iudevadm trigger
zastosować ją bez ponownego uruchamiania.Biorąc pod uwagę, że Wayland nie używa podsystemu klawiatury X11, a główne komponenty Wayland, takie jak GNOME Shell i Weston, nie implementują interfejsów użytkownika w celu skonfigurowania odpowiednich aspektów libinput, ktoś napisał demona o nazwie evdevremapkeys, który rozwiązuje problem podobnie do sterownika przestrzeni użytkownika G15Daemon dla Logitech Klawiatury do gier G15.
(Przełyka zdarzenia, które zamierza ponownie odwzorować, więc nic innego nasłuchującego na urządzeniu ich nie widzi, a następnie emituje poprawione zdarzenia za pośrednictwem
uinput
interfejsu API do tworzenia urządzeń wejściowych na poziomie jądra z przestrzeni użytkownika).źródło
Dla tych, którym się nie udało z opcją @Watcom, po prostu włóż nowy plik mapowania, coś w stylu:
do / usr / share / X11 / xkb / symbols / jak może root (ubuntu, może różnić się w zależności od dystrybucji), nazwij plik „niestandardowy”. Zapytaj o bieżący ciąg układu za pomocą
setxkbmap -device <device id> -print | grep xkb_symbols
i dodaj+custom
do niego. Ustaw nowy układ za pomocą mapowanych klawiszy i zmodyfikowanego ciągu układu:Efekt nie jest trwały i niestety resetuje się, gdy podłączona jest inna klawiatura, jeszcze nie wymyśliłem, jak to naprawić. Możesz dodać powyższe polecenie do swojego
.bashrc
, więc klucze są zamieniane przy ponownym uruchomieniu, jeśli to konieczne.źródło