Próbuję użyć xmodmap
do mapowania Alt/ Superklawiszy na klawiaturze Dell L100 i mam problem z uzyskaniem kodów.
Na przykład użycie xev
nie daje mi kodu dostępu dlaAlt
FocusOut event, serial 36, synthetic NO, window 0x4a00001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 36, synthetic NO, window 0x4a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 36, synthetic NO, window 0x0,
keys: 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Dla Right Superklucza xev
i showkey
podaj różne kody dostępu - 134
i 126
odpowiednio.
Co się dzieje z tymi kluczami?
Próbowałem pobrać kody showkey -k
i użyć xmodmap
pliku poniżej, ale dało to dziwną mapę, która odwzorowała bklucz:
clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R
Odpowiedzi:
Istnieje wiele graczy między klawiaturą a procesem, który ostatecznie obsługuje zdarzenie związane z klawiaturą. Wśród głównych elementów krajobrazu znajduje się fakt, że system X ma własną warstwę obsługi klawiatury, a X kojarzy różne „kody klawiszy” z klawiszami niż system podstawowy Linux.
showkey
Polecenia pokazujące keycodes w Linux-base-system slangu. Do tegoxmodmap
potrzebujesz kodów X, które sąxev
wyświetlane. Tak długo, jak planujesz pracować w X i ponownie powiązać kluczxmodmap
, zignorujshowkeys
i po prostu słuchaj tegoxev
, co mówi.To, czego chcesz szukać w
xev
wynikach, to bloki takie jak to:xev
ma tendencję do generowania dużej ilości danych wyjściowych, zwłaszcza gdy poruszasz myszą. Może być konieczne przewinięcie do tyłu, aby znaleźć wyjście, którego szukasz. W poprzednim wyjściu, widzimy, żekeysym Alt_L
jest związany z X-kod64
.źródło
xev -event keyboard
wystarczyłoby pozbyć się większości hałasu.Xev powinien działać
Dziwne, mój xev daje zdarzenie KeyPress i KeyRelease dla alt (i dla klawisza Windows, tutaj nazywanego „super”):
I po prawej:
Widzę dwie możliwości:
xinit -- :1
, co powinno dać ci X serwer tylko z xterm - nawet nie będzie działał menedżer okien. Wyjście z xterm zamknie sesję).Łatwy sposób, jeśli znasz nazwę klucza
Inna możliwość: po prostu pobierz kody klawiszy z xmodmap:
Znów są 64 i 108.
xmodmap -pm
pokaże tylko mapę modyfikatora, która daje również liczby (tym razem w postaci szesnastkowej).źródło
W twoim pytaniu „wykrywam” trzy problemy:
xev
ishowkey
zgłaszać różne kody kluczy?xev
nie wyświetla Altsię poprawnie naciśnięty?Odnośnie pierwszego pytania: w dzisiejszych czasach, gdy „sterownik” klawiatury w X tak naprawdę nie napędza sprzętu, może po prostu przekazywać kody klawiszy z jądra do rdzenia X, ale tak nie jest. Dodaje 8 do kodu przed przekazaniem go.
Po drugie: coś w twojej sesji X chwyta to Altwydarzenie. Inne odpowiedzi już to obejmują. (Tj.
xev
Nie dostaje wydarzenia, które chciałbyś zobaczyć). Sprawca może być powiązany z menedżerem okien. Wypróbuj bardziej nagą sesję X.Po trzecie: nie używaj
xmodmap
. To jest przestarzałe od dekady. Nowi ludzie to XKB i jego narzędziesetxkbmap
.Do wymiany, Alta WinXKB ma już przygotowaną opcję. Po prostu dodaj:
źródło
setxkbmap
zmiana była trwała?~/.xinitrc
.Jako root uruchom:
... aby zobaczyć, czym jest scancode dla twojego tajemniczego klucza. Mam coś takiego:
Nie jestem pewien, dlaczego wydaje się, że jeden klucz generuje dwa skancody. To nie jest keydown / keyup, tak blisko, jak mogłem stwierdzić na podstawie wzoru. Zwróć uwagę na ostrzeżenie, więc możesz chcieć uruchomić to w trybie pojedynczego użytkownika.
Domyślam się, że 0x46 był moim skancode.
Następnie znajdź nieużywany kod dostępu za pomocą:
Tutaj widać, że kod 97 nie jest używany w moim systemie:
Kod X, którego używa X, i kod, którego używa jądro, są wyłączone BY 8 z „powodów historycznych”. Więc weź 97 - 8 = 89 i użyj 89 z poleceniem setkeycodes (ponownie jako root):
I powinieneś być ustawiony. Potwierdź za pomocą xev, że otrzymujesz zdarzenie Keypress z kodem klucza 97. (chociaż raz powiedziałem plikowi kluczy Fluxboksa, aby używał tego kodu, nie dostałem już zdarzeń KeyPress - może dlatego, że Fluxbox połyka je, gdy z nich korzysta?)
Zauważ, że „setkeycodes” nie przetrwają restartu, więc musisz dodać go do skryptów inicjujących (np. W /etc/rc.local)
źródło
Próbowałem to rozwiązać dla siebie i właśnie to rozgryzłem.
Głównym problemem jest to, że nie otrzymujesz zdarzenia dla naciśnięcia klawisza. Patrząc na opublikowany dziennik, widać powód.
Można zobaczyć, że
Focus{In,Out}
wydarzenia mająmode
odNotify{Grab,Ungrab}
. Wskazuje to, że klucz był obsługiwany przez inny proces (prawdopodobnie aplikację skrótu / klawisza).W moim przypadku były to klawisze xbindkeys, ale jeśli używasz środowiska graficznego, prawdopodobnie mają one system przypisywania klawiszy. Aby zobaczyć te zdarzenia, należy zatrzymać / wyłączyć inny program.
Jeśli nie możesz ustalić, który program kradnie kluczowe zdarzenia, najlepszym rozwiązaniem jest rozpoczęcie kolejnej sesji X bez jej uruchamiania. Uruchom następującą komendę, aby rozpocząć kolejną sesję X na wyświetlaczu
:1
, jeśli jest już zajęta, po prostu zwiększ liczbę na końcu. Możesz oczywiście zmienić terminal na dowolny, który wolisz lub zainstalowałeś w systemie.Następnie uruchom
xev
ponownie. To powinno dać wynik bez przechwytywania przez inne programy. Zauważ, że menedżer okien, który się uruchamia, jest najechaniem kursorem, więc będziesz musiał umieścić kursor nad oknem xev, aby klucze mogły zostać przechwycone.Jak powiedziano w tej doskonałej odpowiedzi dubiousjima , kod klucza jest inny, ponieważ istnieje wiele warstw między xev a jądrem.
źródło
Miałem ten sam problem ze
Alt_L
zniknięciem w XUbuntu 14.04 (Alt_R
było w porządku). Po długim graniu zauważyłem, żeshowkey
zarejestrowałem naciśnięcie klawisza, alexev
nie zrobiłem tego - to musi być coś w systemie okiennym. Przeszukałem wszystkie ustawienia „Window Manager” i „Window Manager Tweaks” i niczego nie znalazłem. Wreszcie znalazłem błądAlt_L
na liście skrótów klawiaturowych (xfce4-keyboard-shortcuts
) w „Edytorze ustawień”. „Zresetowałem” to i mamAlt_L
plecy! ZbłąkanyAlt_L
skrót nie pojawił się nigdzie indziej niż w „Edytorze ustawień”.źródło