Przechwytywanie klucza z urządzenia zdarzeń i mapowanie go (klawisz TouchPad nie jest mapowany)

10

Mam zainstalowaną Lenovo IdeaPad Yoga 13 z systemem Ubuntu 13.10. Urządzenie ma przycisk „Przełącz panel dotykowy” na klawiaturze ( F5). Przyciski klawiatury F*są odwrócone (aby uzyskać F5, muszę nacisnąć Fn+ F5, a F5tak naprawdę jest to klawisz przełączania).

Dowiedziałem się, że przycisk jest w rzeczywistości odczytywany przez klawiaturę (zamiast płytki dotykowej TouchPad jak niektóre urządzenia), która jest dostępna /dev/input/event3. Dzięki temu sudo input-events 3mogłem dowiedzieć się, że przycisk wysyła kod skanowania 190:

Wyjście sudo lsinput:

/dev/input/event3
   bustype : BUS_I8042
   vendor  : 0x1
   product : 0x1
   version : 43907
   name    : "AT Translated Set 2 keyboard"
   phys    : "isa0060/serio0/input0"
   bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

Wyjście sudo input-events 3:

23:13:03.849392: EV_MSC MSC_SCAN 190
23:13:03.849392: EV_SYN code=0 value=0
23:13:03.855413: EV_MSC MSC_SCAN 190
23:13:03.855413: EV_SYN code=0 value=0

Żadne inne programy (takie jak xev) wydają się być w stanie odczytać je wyjątkiem input-events. Czy jest jakiś sposób na zmapowanie tego przycisku, aby przełączał touchpada na moim laptopie? Jeśli tak, jak mogę to zrobić?

Hosh Sadiq
źródło

Odpowiedzi:

7

Jak się okazuje, jądro go podniosło, ale ciągle narzekało, że nie zostało rozpoznane.

Dla każdego, kto ma ten problem lub chce zmapować klucz, który nie jest odczytywany przez system operacyjny, czytaj dalej.

Otwórz terminal i uruchom dmesg | grep -A 1 -i setkeycodes. To da ci wiele takich wpisów:

[    9.307463] atkbd serio0: Unknown key pressed (translated set 2, code 0xbe on isa0060/serio0).
[    9.307476] atkbd serio0: Use 'setkeycodes e03e <keycode>' to make it known.

Interesuje nas wartość szesnastkowa po „setkeycodes”, w tym przypadku tak jest e03e. Jeśli masz ich wiele, możesz uruchomić tail -f /var/log/kern.log. Gdy to zrobisz, możesz dotknąć przycisku, którego szukasz, a to da ci tę samą linię, jak powyżej, i znów potrzebujemy tylko wartości szesnastkowej. Zanotuj to.

Teraz uruchom xmodmap -pke | lessi znajdź odpowiednie mapowanie. W moim przypadku musiałem zmapować to, aby przełączyć touchpad, co oznacza, że ​​byłem zainteresowany następującą linią:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Jeśli nie możesz znaleźć tego, co Cię interesuje, przeczytaj również odpowiedź @Gilles, ponieważ możesz również zdefiniować niestandardowe mapowania, a następnie czytaj dalej (jeśli jądro to czyta, nie musisz dodawać go do xorg.conf. re)

Teraz wpadłem następujące polecenie: sudo setkeycodes [hexadecimal] [keycode], więc w moim przypadku, że stała: setkeycodes e03e 199.

Teraz możesz użyć następującego wiersza, aby sprawdzić, czy zadziałał i / lub masz prawidłowe odwzorowanie:

xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'

Po uruchomieniu tego polecenia musisz skupić się na nowo otwartym oknie ( xev) i sprawdzić dane wyjściowe konsoli. W moim przypadku brzmi on następująco:

207 NoSymbol

To było oczywiście złe, ponieważ poprosiłem o kod 199, więc jest mapowany na XF86TouchpadToggle. xmodmap -pkePonownie sprawdziłem i zauważyłem, że keycode 207jest to mapowane NoSymbol, i zauważyłem różnicę przesunięcia wynoszącą 8, więc spróbowałem setkeycodesponownie, ale klucz jest mapowany keycode 191.

sudo setkeycodes e03e 191

To działało idealnie.

EDYCJA - rozwiązanie, które zapewniłem, aby pracować przy uruchomieniu, nie działa. Rozwiążę to jutro i zaktualizuję tę odpowiedź. Na razie przypuszczam, że możesz uruchomić to ręcznie podczas uruchamiania.

Hosh Sadiq
źródło
1
jak zrobić to na stałe w miły sposób? (tj. po zresetowaniu / uruchomieniu)
vak
4

Wygląda na to, że urządzenie to klawiatura (rozpoznawana w oprogramowaniu jako oddzielna od klawiatury „rdzeniowej”), ale serwer X nie słucha jej.

Spróbuj dodać sekcję Input pod/etc/X11/xorg.conf.d . To znaczy, stwórz katalog, /etc/X11/xorg.conf.djeśli jeszcze nie istnieje, i stwórz plik extra-keyboard-buttonsw tym katalogu zawierający

Section "InputClass"
    Identifier "extra-keyboard-buttons"
    Driver "kbd"
    MatchProduct "AT Translated Set 2 keyboard"
EndSection

Nie jestem pewien co do tej MatchProductlinii; jeśli to nie działa, spróbuj majstrować przy MatchXXXdyrektywach .

Po prawidłowym skonfigurowaniu tego pliku, po uruchomieniu serwera X powinien on przetwarzać zdarzenia z tej klawiatury, a zdarzenia powinny być widoczne w xevinnym miejscu. Zanotuj kod (nie jestem pewien, czy kod X11 będzie w tym przypadku taki sam jak klucz sprzętowy) i skojarz z nim klucz. Możesz to zrobić za pomocą pliku o nazwie .Xmodmapw katalogu domowym zawierającym

keycode 190 = XF86_Launch5

Możesz teraz definiować skróty klawiaturowe za pomocą tych klawiszy.

Aby przełączyć touchpad, użyj polecenia xinput. Uruchom, xinput listaby zobaczyć, jakie urządzenia wejściowe są dostępne, i zanotuj nazwę twojego touchpada (nazywam to Touchpadponiżej). Uruchom, xinput list-props Touchpadaby wyświetlić listę jego właściwości; jeden z nich powinien nosić nazwę „Device Enabled”, a obok niego numer (np. 135). Poniższy skrypt przełącza touchpad:

#!/bin/sh
device_name='Touchpad'
property=135
flipped_state=$(xinput list-props "$device_name" |
                awk "/\\($property\\)/ {print 1 - \$NF}")
xinput set-prop "$device_name" "$property" "$flipped_state"

Zapisz to w pliku ~/bin/toggle-touchpadi ustaw jako plik wykonywalny ( chmod +x ~/bin/toggle-touchpad). Aby powiązać go z kluczem, zainstaluj xbindkeys i skonfiguruj go do uruchamiania skryptu, wstawiając następujące wiersze ~/.xbindkeysrc:

"toggle-touchpad"
  XF86_Launch5
Gilles „SO- przestań być zły”
źródło
Dziękuję za odpowiedź. To niestety nie zadziałało. Udało mi się jednak działać, więc nie wahaj się rzucić okiem na własną odpowiedź! :)
Hosh Sadiq