Erfassen der Tasteneingabe vom Ereignisgerät und Zuordnen (Umschalten der TouchPad-Taste ist nicht zugeordnet)

10

Ich habe ein Lenovo IdeaPad Yoga 13 mit Ubuntu 13.10 installiert. Das Gerät verfügt über eine Schaltfläche "TouchPad umschalten" auf der Tastatur ( F5). Die Tasten der Tastatur F*sind vertauscht (um dies zu erreichen F5, muss ich Fn+ drücken F5und F5ist eigentlich die Umschalttaste).

Ich habe herausgefunden, dass die Taste tatsächlich von der Tastatur gelesen wird (und nicht wie bei bestimmten Geräten vom TouchPad) /dev/input/event3. Mit konnte sudo input-events 3ich also herausfinden, dass die Schaltfläche den Scan-Code 190 sendet:

Ausgabe von 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

Ausgabe von 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

Keine anderen Programme (wie xev) scheinen in der Lage zu sein, es zu lesen, außer input-events. Gibt es eine Möglichkeit, diese Schaltfläche zuzuordnen, um das TouchPad auf meinem Laptop umzuschalten? Wenn ja, wie kann ich das tun?

Hosh Sadiq
quelle

Antworten:

7

Wie sich herausstellte, hat der Kernel es zwar aufgenommen, sich aber immer wieder beschwert, dass es nicht erkannt wird.

Wenn Sie dieses Problem haben oder einen Schlüssel zuordnen möchten, der nicht vom Betriebssystem gelesen wird, lesen Sie weiter.

Öffnen Sie ein Terminal und führen Sie es aus dmesg | grep -A 1 -i setkeycodes. Dadurch erhalten Sie mehrere Einträge wie folgt:

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

Was uns interessiert, ist der Hexadezimalwert nach "setkeycodes", in diesem Fall ist dies e03e. Wenn Sie mehrere davon haben, können Sie ausführen tail -f /var/log/kern.log. Sobald Sie dies getan haben, können Sie auf die Schaltfläche tippen, nach der Sie suchen. Dadurch erhalten Sie dieselbe Zeile wie oben. Auch hier benötigen wir nur den Hexadezimalwert. Notieren Sie sich dies.

Führen xmodmap -pke | lessSie nun die entsprechende Zuordnung aus und suchen Sie sie. In meinem Fall musste ich dies zuordnen, um mein Touchpad umzuschalten, was bedeutet, dass ich an der folgenden Zeile interessiert war:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Wenn Sie nicht finden können, woran Sie interessiert sind, lesen Sie auch die Antwort von @Gilles, da Sie auch benutzerdefinierte Zuordnungen definieren können, und lesen Sie dann weiter (wenn der Kernel sie liest, müssen Sie sie nicht zu xorg.conf hinzufügen. d)

Jetzt habe ich den folgenden Befehl ausgeführt: sudo setkeycodes [hexadecimal] [keycode]In meinem Fall wurde das : setkeycodes e03e 199.

Jetzt können Sie die folgende Zeile verwenden, um zu testen, ob es funktioniert hat und / oder ob Sie die richtige Zuordnung haben:

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

Wenn Sie diesen Befehl ausführen, müssen Sie sich auf das neu geöffnete Fenster ( xev) konzentrieren und die Konsolenausgabe überprüfen. In meinem Fall lautete es wie folgt:

207 NoSymbol

Dies war offensichtlich falsch, da ich den Schlüsselcode angefordert habe 199, also ist er zugeordnet XF86TouchpadToggle. Ich habe es xmodmap -pkeerneut überprüft und festgestellt, dass keycode 207es tatsächlich zugeordnet ist NoSymbol, und ich habe festgestellt, dass es einen Versatzunterschied von 8 gibt. Deshalb habe ich den setkeycodesBefehl erneut versucht , aber der Schlüssel ist zugeordnet keycode 191.

sudo setkeycodes e03e 191

Das hat perfekt funktioniert.

BEARBEITEN - die Lösung, die ich bereitgestellt habe, um am Start arbeiten zu müssen, funktioniert nicht. Ich werde das morgen herausfinden und diese Antwort aktualisieren. Im Moment können Sie dies vermutlich beim Start manuell ausführen.

Hosh Sadiq
quelle
1
wie man es auf schöne Weise dauerhaft macht? (dh nach dem Zurücksetzen / Booten)
vak
4

Wie es aussieht, ist das Gerät eine Tastatur (in der Software als von der „Kerntastatur“ getrennt erkannt), aber der X-Server hört nicht darauf.

Versuchen Sie , einen Eingabebereich unter hinzuzufügen/etc/X11/xorg.conf.d . Erstellen Sie also ein Verzeichnis, /etc/X11/xorg.conf.dfalls es noch nicht vorhanden ist, und erstellen Sie eine Datei extra-keyboard-buttonsin diesem Verzeichnis, die Folgendes enthält

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

Ich bin mir bei dieser MatchProductZeile nicht sicher . Wenn es nicht funktioniert, versuchen Sie, mit den MatchXXXAnweisungen herumzuspielen .

Sobald diese Datei korrekt eingerichtet ist, sollte sie beim Starten des X-Servers Ereignisse über diese Tastatur verarbeiten und Ereignisse in xevund an anderer Stelle anzeigen. Notieren Sie sich den Schlüsselcode (ich bin nicht sicher, ob der X11-Schlüsselcode in diesem Fall mit dem Hardware-Schlüsselcode übereinstimmt) und ordnen Sie ihm einen Schlüssel zu. Sie können dies über eine Datei tun, die .Xmodmapin Ihrem Home-Verzeichnis aufgerufen wird und Folgendes enthält

keycode 190 = XF86_Launch5

Mit diesen Tasten können Sie jetzt Tastaturkürzel definieren .

Verwenden Sie den Befehl, um das Touchpad umzuschalten xinput. Führen xinput listSie den Befehl aus, um festzustellen, welche Eingabegeräte verfügbar sind, und notieren Sie sich den Namen Ihres Touchpads (ich werde ihn Touchpadunten nennen). Ausführen, xinput list-props Touchpadum die Eigenschaften aufzulisten. Einer von ihnen sollte "Gerät aktiviert" mit einer Nummer daneben heißen (z. B. 135). Das folgende Skript schaltet das Touchpad um:

#!/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"

Speichern Sie dies in einer Datei ~/bin/toggle-touchpadund machen Sie es ausführbar ( chmod +x ~/bin/toggle-touchpad). Um es an einen Schlüssel zu binden, installieren Sie xbindkeys und konfigurieren Sie es so, dass Ihr Skript ausgeführt wird, indem Sie die folgenden Zeilen einfügen~/.xbindkeysrc :

"toggle-touchpad"
  XF86_Launch5
Gilles 'SO - hör auf böse zu sein'
quelle
Danke für die Antwort. Das hat leider nicht funktioniert. Ich habe es aber zum Laufen gebracht, also schauen Sie sich meine eigene Antwort an! :)
Hosh Sadiq