Catturare l'immissione dei tasti dal dispositivo eventi e mapparlo (il tasto di attivazione / disattivazione del TouchPad non è mappato)


10

Ho un Lenovo IdeaPad Yoga 13 con Ubuntu 13.10 installato. Il dispositivo ha un pulsante "Attiva TouchPad" sulla tastiera ( F5). I F*pulsanti della tastiera sono invertiti (quindi per ottenere F5, devo premere Fn+ F5, ed F5è in realtà il tasto di attivazione / disattivazione).

Ho scoperto che il pulsante viene effettivamente letto dalla tastiera (anziché dal TouchPad come alcuni dispositivi), che è disponibile /dev/input/event3. Quindi usando sudo input-events 3sono stato in grado di capire che il pulsante invia il codice di scansione 190:

Uscita di 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

Uscita di 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

Nessun altro programma (come xev) sembra essere in grado di leggerlo tranne input-events. Esiste un modo per mappare questo pulsante per abilitare / disabilitare il TouchPad sul mio laptop? In tal caso, come posso farlo?

Risposte:


7

A quanto pare il kernel lo raccolse, ma continuò a lamentarsi del fatto che non fosse riconosciuto.

Per chiunque abbia questo problema o voglia mappare una chiave che non viene letta dal sistema operativo, continua a leggere.

Apri un terminale ed esegui dmesg | grep -A 1 -i setkeycodes. Questo ti darà più voci come questa:

[    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.

Ciò che ci interessa è il valore esadecimale dopo "setkeycodes", in questo caso lo è e03e. Se ne hai diversi, puoi eseguire tail -f /var/log/kern.log. Una volta fatto, puoi toccare il pulsante che stai cercando, e questo ti darà la stessa linea di cui sopra, e ancora, abbiamo solo bisogno del valore esadecimale. Prendi nota di questo.

Ora esegui xmodmap -pke | lesse trova la mappatura appropriata. Nel mio caso, dovevo mapparlo per attivare il touchpad, il che significa che ero interessato alla seguente riga:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Se non riesci a trovare quello che ti interessa, leggi anche la risposta di @Gilles, poiché puoi anche definire mappature personalizzate, quindi continua a leggere (se il kernel lo legge, non dovrai aggiungerlo a xorg.conf. d)

Ora ho eseguito il seguente comando: sudo setkeycodes [hexadecimal] [keycode], quindi nel mio caso che è diventato: setkeycodes e03e 199.

Ora puoi utilizzare la seguente riga per verificare se ha funzionato e / o hai la mappatura corretta:

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

Quando si esegue questo comando, è necessario concentrarsi sulla finestra appena aperta ( xev) e controllare l'output della console. Nel mio caso si legge come segue:

207 NoSymbol

Questo ovviamente era sbagliato, come ho richiesto il codice chiave 199, quindi è mappato XF86TouchpadToggle. Ho controllato xmodmap -pkedi nuovo, e notato che keycode 207in realtà è mappato NoSymbol, e ho notato che c'era una differenza offset 8, così ho provato il setkeycodesnuovo comando, ma la chiave viene mappato keycode 191.

sudo setkeycodes e03e 191

Questo ha funzionato perfettamente.

EDIT - la soluzione che ho fornito per lavorare all'avvio no. Lo scoprirò domani e aggiornerò questa risposta. Per ora suppongo che tu possa eseguirlo manualmente all'avvio.


1
come renderlo permanente nel modo giusto? (cioè dopo il reset / avvio)
vak

4

A quanto pare, il dispositivo è una tastiera (riconosciuta nel software come separata dalla tastiera "core") ma il server X non lo ascolta.

Prova ad aggiungere una sezione di input sotto/etc/X11/xorg.conf.d . Cioè, crea una directory /etc/X11/xorg.conf.dse non esiste già e crea un file extra-keyboard-buttonsin quella directory contenente

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

Non sono sicuro di quella MatchProductlinea; se non funziona, prova a giocherellare con le MatchXXXdirettive .

Una volta che questo file è impostato correttamente, quando avvii il server X, dovrebbe elaborare gli eventi da questa tastiera e dovresti vedere gli eventi dentro xeve altrove. Nota il codice chiave (non sono sicuro se il codice chiave X11 sarà lo stesso del codice chiave hardware in questo caso) e associa un keyym ad esso. Puoi farlo tramite un file chiamato .Xmodmapnella tua home directory contenente

keycode 190 = XF86_Launch5

Ora puoi definire le scorciatoie da tastiera usando questi tasti.

Per commutare il touchpad, utilizzare il comando xinput. Corri xinput listper vedere quali dispositivi di input sono disponibili e annota il nome del tuo touchpad (lo chiamerò di Touchpadseguito). Esegui xinput list-props Touchpadper elencare le sue proprietà; uno di questi dovrebbe essere chiamato "Dispositivo abilitato" con un numero accanto (ad es. 135). Il seguente script attiva o disattiva il 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"

Salvalo in un file ~/bin/toggle-touchpade rendilo eseguibile ( chmod +x ~/bin/toggle-touchpad). Per associarlo a una chiave, installare xbindkeys e configurarlo per eseguire lo script inserendo le seguenti righe ~/.xbindkeysrc:

"toggle-touchpad"
  XF86_Launch5

Grazie per la risposta. Questo purtroppo non ha funzionato. Ho funzionato però, quindi sentiti libero di dare un'occhiata alla mia risposta! :)
Hosh Sadiq,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.