Hallo in die Runde,
nachdem ich nun einige Jahre mit dem unter Kurzanleitung: Hotkeys auf Multimedia-Tastaturen benutzen beschriebenen Vorgehen die Programmstart-Tasten meines [daten]"USB Productivity Option Keyboard( has the hub in # 1 )"[/daten] genutzt habe, ist dieses Vorgehen anscheinend seit einem jüngst eingespielten Update auf systemd-210-40.1 und das gleich versionierte udev nicht mehr möglich. Somit musste eine neue Lösung her
Meine Aussagen beziehen sich auf die openSuSE 13.1 mit allen aktuellen Patches.
Die 8 Sondertasten generieren nun keine Mausbutton-, sondern normale Tastatur-Keyevents. Zwei dieser Events sind standardmäßig jedoch Keycodes > 255 zugeordnet, welche somit nicht an den X-Server weitergeleitet werden. Die Aufgabe besteht nun also "nur noch" darin, die betreffenden Keycodes umzumappen. Hierzu kann man folgendes tun:
1) Identifikation der Tastatur hinsichtlich PID und VID, z.B. mittels
liefert u.a.:
[daten]
Vendor: usb 0x04b3 "IBM Corp."
Device: usb 0x301b "USB Productivity Option Keyboard( has the hub in # 1 )"
Device File: /dev/input/event4
[/daten]
2) Identifikation der (problematischen) Tastendrücke mittels
(warum ich hier event5 statt event4 wie oben ausgegeben nehmen muss weiß der Kuckuck)
[daten]Event: time 1454848917.625413, type 4 (Misc), code 4 (ScanCode), value 90004
Event: time 1454848917.625413, type 1 (Key), code 421 (?), value 1
Event: time 1454848917.625413, -------------- Report Sync ------------
Event: time 1454848917.753419, type 4 (Misc), code 4 (ScanCode), value 90004
Event: time 1454848917.753419, type 1 (Key), code 421 (?), value 0
Event: time 1454848917.753419, -------------- Report Sync ------------
Event: time 1454848920.953422, type 4 (Misc), code 4 (ScanCode), value 90005
Event: time 1454848920.953422, type 1 (Key), code 423 (?), value 1
Event: time 1454848920.953422, -------------- Report Sync ------------
Event: time 1454848921.209424, type 4 (Misc), code 4 (ScanCode), value 90005
Event: time 1454848921.209424, type 1 (Key), code 423 (?), value 0
[/daten]
Meine beiden Problemtasten generieren also die Scancodes 90004 und 90005; udev macht daraus die Keycodes 421 und 423, mit welchen der X-Server nichts anfangen kann - dieser kennt nur die aus
ersichtlichen Werte bis maximal 255.
Aus dieser Liste sucht man sich nun nicht benötigte Werte heraus, z.B. "XF86Launch2" und "XF86Launch3".
3) Anpassung von udev's Hardwaredatenbank
Hierzu legt man eine Datei unter /etc/udev/hwdb.d an, z.B. /etc/udev/hwdb.d/90-mykeyboard.hwdb. Die Ablage der Datei unter /etc/udev/hwdb.d bewirkt, dass ggfs. abweichende Standardvorgaben aus /usr/lib/udev/hwdb.d übergangen werden. Meine *.hwdb-Datei sieht so aus:
keyboard:usb:v04B3p301B*
KEYBOARD_KEY_90001=prog1
KEYBOARD_KEY_90002=screenlock
KEYBOARD_KEY_90003=file
KEYBOARD_KEY_90004=prog2
KEYBOARD_KEY_90005=prog3
KEYBOARD_KEY_90006=calc
KEYBOARD_KEY_90007=mail
KEYBOARD_KEY_90008=www
Somit ordnet man dem Scancode 90004 die Taste prog2 und 90005 die Taste prog3 - genauer: den jeweiligen keycode - zu. Wichtig ist, hierbei die Codebezeichnungen aus
zu verwenden.
In der ersten Zeile stehen außerdem die Werte aus Schritt 1), d.h. die Änderungen beziehen sich NUR auf genau dieses Tastaturmodell.
4) Aktivierung der Änderungen
Dies erfolgt über
Hierdurch baut udev seine Hardwaredatenbank gemäß der zuvor vorgenommenen Einstellungen neu auf und bindet anschließend die betreffenden Geräte neu ein, sodass die neuen Einstellungen sofort wirksam sind. Ein Startscript o.Ä. ist NICHT mehr notwendig
Mittels
kann man sodann die Übernahme der Änderungen verifizieren:
[daten]E: ID_INPUT_KEY=1
E: KEYBOARD_KEY_90001=prog1
E: KEYBOARD_KEY_90002=screenlock
E: KEYBOARD_KEY_90003=file
E: KEYBOARD_KEY_90004=prog2
E: KEYBOARD_KEY_90005=prog3
E: KEYBOARD_KEY_90006=calc
E: KEYBOARD_KEY_90007=mail
E: KEYBOARD_KEY_90008=www[/daten]
5) Test unter X
Als nächstes ist es sinnvoll, auch die Weitergabe an den X-Server noch kurz zu testen.
liefert nun bei Druck der entsprechenden Tasten:
[daten]
KeyRelease event, serial 41, synthetic NO, window 0x4c00001,
root 0x7e, subw 0x0, time 4319170, (-715,702), root:(727,725),
state 0x10, keycode 157 (keysym 0x1008ff42, XF86Launch2), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 41, synthetic NO, window 0x4c00001,
root 0x7e, subw 0x0, time 4322882, (-564,83), root:(878,106),
state 0x10, keycode 210 (keysym 0x1008ff43, XF86Launch3), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
[/daten]
6) Finale Einrichtung
Nachdem das Mapping erfolgt ist und alle Tastendrücke korrekt erkannt werden, stehen die Tasten nun in beliebigen Anwendungen zur Verfügung. Die Einrichtung von Programmstarts, D-Bus-Aufrufen etc. kann nun z.B. über K->Systemeinstellungen->Kurzbefehle und Gestensteuerung erfolgen.