HOWTO: Multimedia-Keys unter Linux

Autor: Stefan Haun <mail@tuxathome.de>

ACHTUNG: Einige Schritte dieses Dokuments beinhalten tiefe Eingriffe in das Linux-System, die die Stabilität gefährden können. Ich übernehme keine Haftung für mittelbar oder unmittelbar entstandene Schäden.
Jeder, der an seinem System bastelt, sollte wissen, was er tut. Dazu gibt es entsprechende Dokumentationen.

0. Einleitung: Was sind Multimedia-Keys?

Multimedia-Keys sind die Zusatztasten, die viele Hersteller heutzutage auf den Tastaturen unterbringen: Lautstärkeregelung, Browser öffnen, Fotos mit der Webcam schießen und so weiter.
Unter Windows(tm) installiert man einfach den Treiber, der mit der Tastatur mitgeliefert wird, und schon sind diese Tastaten einsatzbereit. Für Linux gibt es solche Treiber nicht oder selten.

Wie es trotzdem geht, beschreibt dieses Dokument.

1. Multimedia-Keys unter X - LinEAK

Zuerst die einfachere Variante: Multimedia-Keys unter einem X-System. Eine Lösung stellt das Projekt "LinEAK" (Linux support for Easy Access and Internet Keyboards) bereit. Zu finden ist es unter der URLhttp://lineak.sourceforge.net und auch ein Blick in die Package list der Distribution kann sich lohnen.

Kernstück ist ein Daemon, der im X-System die Scan-Codes der Zusatztasten abfängt und in vom Benutzer definierte Kommandos umwandelt. Der Daemon (lineakd) wird beim Start des X-Systems oder bei der Benutzer-Anmeldung geladen.
Multimedia-Keys werden von diesem Daemon nur behandelt, wenn sie im X-System betätigt werden.

1.1 Installation

Entweder installiert man das Paket der Distribution, die man verwendet (so vorhanden), oder man lädt das Quellpaket herunter, entpackt es und führt die klassischen Kommandos aus:

 ./configure make make install

Das letzte Kommando ist als root auszuführen, wenn man nicht perconfigure die Pfade umgestellt hat. Anschließend ist der lineakd verfügbar.

1.2 Konfiguration "von Hand"

Die Konfiguration des lineakd ist relativ simpel. Vor der ersten Verwendung muss man zuerst mit lineakd -l seine Tastatur aus dort angezeigten Liste herausfinden. Anschließend ruft man einmal

 lineakd -c <code>

auf, wobei <code> die Kennung ist, die man vorher aus der Liste herausgesucht hat.

Anschließend befindet sich in ~/.lineak eine Dateilineak.conf, in der man die gewünschten Kommandos einstellen kann. Die Konfigfurations-Datei ist eigentlich selbsterklärend:
Kommentare beginnen mit einer Raute (#), jede Zeile nimmt eine Einstellung auf, wobei jede Einstellung das Format <Variable> = <Wert> hat.

Die Variablen für CD- und Mixer-Device sind festgelegt, alle übrigen Variablen stammen aus /etc/lineakkb.def und sind vom ausgewählten Tastaturtyp abhängig.

Als Werte sind Kommandos zulässig (die unter dem User ausgeführt werden, der Besitzer der X-Session ist) sowie folgende built-in-Kommandos:

EAK_EJECT CD auswerfen
EAK_VOLUP Lautstärke erhöhen
EAK_VOLDOWN Lautstärke verringern
EAK_MUTE Stummschalten
EAK_SLEEP Rechner in den Standby-Modus versetzen

1.3 Konfiguration mit klineakconfig

Dieses Tool wurde für den Einsatz im KDE-Desktop-Environment entwickelt und stellt neben dem Konfigurations-Tool für die lineakd.conf auch ein Tool zur Verfügung, mit dem man die Codes der einzelnen Keys herausfinden kann. (Nach meiner Erfahrung werden die wohl vom Hersteller festgelegt, sind also nicht standardisiert. Bei Logitech scheinen sie aber eindeutig zu sein, d.h der Volup-Button wird auf jeder Logitech-Tastatur gleich erkannt). Dieses Tool wird benötigt, wenn die eigene Tastatur nicht oder nicht vollständig unterstützt wird.

1.4 Konfiguration mit lineakconfig

lineakconfig ist ein gtk-Tool, mit dem sich die lineakd.conf komfortabler editieren lässt. Allerdings bietet es nicht die Möglichkeit, Tastencodes herauszufinden.

1.5 Meine Tastatur wird nicht unterstützt

Alles kein Problem und eine gute Möglichkeit, seinen Beitrag zu Open Source zu leisten.

Als erstes sucht man sich aus der /etc/lineakkb.def die Tastatur heraus, die der eigenen am nächsten kommt. Das ist nicht zwingen nötig, spart aber einige Arbeit. Außerdem sollte man sich einen überblick verschaffen, wie die Tasten benannt wurden und versuchen, vorhandene Bezeichnung zu übernehmen.

Das größte Problem ist, herauszufinden, wie die Tasten auf Keycodes abgebildet werden. Das ist mir bisher nur mit demklineakconfig-Tool gelungen.

Hat man diese Abbildung, erstellt man sich nach dem Muster der Definitionen in /etc/lineakkb.def eine eigene Tastaturdefinition, gibt ihr eine eindeutige Bezeichnung, einen eindeutigen Code und fügt nach dem Muster <variable>=<keycode> seine eigenen Keycodes ein.

Da man später nur noch die Namen sieht, sollten diese schlüssig gewählt werden. Nach einem SIGHUP oder Neustart des lineakd lässt sich diese Definition verwenden. Um sie auch anderen Benutzern verfügbar zu machen, sollte man sie per email an den Admin des lineakd-Projekts schicken.

1.6 Weiterführende Informationen

Erste Adresse sind die man-pages, auf denen die Funktion und Kommandozeilen-Parameter noch einmal zusammengefasst sind. Ein Blick lohnt auf alle Fälle, nicht alle Funktionen sind hier beschrieben.

Das Projekt findet man unter http://lineak.sourceforge.net. Dort gibt es auch die offizielle Dokumentation.

2. Multimedia Keys auf Kernel-Ebene

Wer seine Multimedia-Tasten nicht nur im X-System, sondern auch auf den Konsolen benutzen möchte, muss sich ein wenig tiefer in das System wagen.

Um die hier beschriebenen Schritte auszuführen, benötigt man root-Rechte auf der entsprechenden Maschine.

2.1 Scan-Codes ermitteln

Auf der Tastatur sind Multimedia-Keys Tasten wie jede andere auch. Das heißt, jeder Multimedia-Taste ist ein Scan-Code zugeordnet, der zum Kernel gesendet und dort weiterverarbeitet wird.

Deswegen gilt es als erstes, die entsprechenden Scan-Codes herauszufinden. Das kann zum Beispiel mit dem Tool showkey geschehen, indem man unter einer echten Konsole den Befehl showkey -seingibt. Anschließend werden alle empfangenen Scan-Codes ausgegeben. Der erste Scan-Code, der angezeigt wird, gehört schon zur losgelassenen Enter-Taste. Ein Scan-Code besteht dabei aus zwei Hexadezimal-Zahlen, die beide gebraucht werden.
Das Programm beendet sich automatisch, wenn ca. 10 Sekunden lang kein Scan-Code empfangen wurde.

Als nächstes ermittelt man mit

 dumpkeys | grep =$

die noch freien Keycodes und wählt je einen Code für jede Taste aus, die belegt werden soll.

Nun müssen nur noch die Scan-Codes auf die Key-Codes abgebildet werden. Das passiert mit dem Programm setkeycodes, das immer abwechselnd einen Scan-Code und den dazugehörenden Key-Code erwartet. Das kann z.B. so aussehen:

 #volume up setkeycodes e030 120 #volume down
			setkeycodes e02e 121 #mute setkeycodes e020 122 #skip back
			setkeycodes e03f 123

Diese Abbildung muss bei jedem Systemstart erneuert werden, deswegen schreibt man sie am besten in ein entsprechendes Script. Die meisten Systeme haben z.B. ein Script, um die Keymap zu laden.

2.2 auf Unicode-Zeichen abbilden

Die Abbildung von Key-Codes auf Zeichencodes geschieht mit der Keymap, die beim Systemstart geladen wird oder in den Kernel eingebunden ist. Dieses HOWTO geht von dem Normalfall aus, dass eine separate Keymap vorliegt.

Als erstes wird eine Kopie der aktuell benutzten Keymap erstellt. Diese kann sich z.B. im Verzeichnis /usr/share/keymaps/i386/qwertz befinden. Es bietet sich an, dem aktuellen Namen ein -funkey (von FUNction key) hinzuzufügen. Z.B:

 cp de-latin1-nodeadkeys.kmap.gz de-latin1-nodeadkeys-funkey.kmap.gz

Mit einem gzip-fähigen Editor (wenn man den nicht hat, muss man auspacken, editieren und wieder einpacken) werden nun die Abbildungen für die Multimedia-Tasten eingefügt. Die Zeilen werden nach folgender Regel gebildet:

 keycode <code> = U+fe<AB>

wobei <code> der Keycode der Multimedia-Taste und<AB> eine Hexadezimalzahl zwischen 00 undFF ist. Z.B:

 keycode 120 = U+fe00 keycode 121 = U+fe01

Die Änderungen kann man mit

 kbd_mode -u loadkeys de-latin1-nodeadkeys-funkey.kmap.gz

Überprüfen (Dateinamen anpassen). Wenn kein Fehler auftritt, kann man diese Tabelle als Standard-Keymap installieren (wie das geht, ist von der Distribution abhängig).

Anschließend ist das Init-Script für die Tastatur noch so zu ändern, dass das Kommando

 kbd_mode -u

ausgeführt wird, bevor die keymap geladen wird. (Ansonsten gibt es keinen Unicode und das Ganze funktioniert einfach nicht.)

2.3 Den Kernel patchen

Unter http://rick.vanrein.org/linux/funkey gibt es ein Patch, das den Tastaturtreiber so erweitert, dass alle Zeichen zwischen 0xfe00 und 0xfeff an ein spezielles Device gesendet werden.

Dazu muss man den Patch passend zum Kernel von der angegebenen URL herunterladen, im Verzeichnis der Kernel-Quellen ausführen und unterconsole options die Option enable funkey support auswählen.

Nun den Kernel neu compilieren, austauschen, neustarten. Fast ein bisschen wie bei Windows (tm), aber in diesem Fall leider unumgänglich.

2.4 Device anlegen

Der neue Kernel stellt unter der Major-Number 254 einen Treiber zur Verfügung, mit dem sich im User-Space die Multimedia-Tasten abfragen lassen. Um ihn verfügbar zu machen, legt man mit

 mknod /dev/funkey c 254 0

eine entsprechende Spezialdatei an. Der Funkey-Daemon wird sie brauchen.

2.5 Der Daemon

Funkeyd ist der Daemon, der an /dev/funkey lauscht und entsprechende Kommandos ausführt.

Herunterladen kann man ihn ebenfalls unter der URL http://rick.vanrein.org/linux/funkey in verschiedenen Versionen. Ich benutze die Version, die eine separate Konfigurationsdatei verwendet.

Das Programm wird mit

 gcc -o funkeyd funkeyd.c

compiliert (wenn man es geschafft hat, den Kernel neu zu bauen, ist das kein Problem mehr) und in ein Verzeichnis verschoben, das beim Starten des Systems verfügbar ist.

Es bietet sich an, das Init-Script der Tastatur so zu erweitern, dass der Daemon automatisch gestartet wird.

Wenn man die Variante mit Init-Datei gewählt hat, lädt der Daemon beim Start die gewünschten Kommandos aus der Datei/etc/funkeyd.conf.
Diese Datei (muss angelegt werden) hat einen sehr einfachen Aufbau:

Damit ist das Linux in der Lage, auch die Multimedia-Tasten zu bedienen und damit z.B. die Lautstärke zu regeln oder den Lieblingsbrowser zu öffnen.

2.6 Ein Sicherheitsaspekt

Der funkeyd führt die angegebenen Kommandos als root aus, wenn man nicht explizit beim Start des Daemons einen anderen User angibt. Das heißt, dass sämltliche angegebenen Kommandos per Tastendruck (und ohne vorherige Anmeldung!) ausgeführt werden.
Deswegen sollte man sich genau im Klaren sein, was man mit den Multimedia-Keys ermöglicht und was nicht.

3. Tipps zur Konfiguration

3.1 Kommandos an einen Benutzer binden

Kann man mit

 su <benutzername> <kommando>

Wo ist das wichtig? Wenn z.B. für jeden Nutzer eine eigene Sessions des Programms läuft oder eine bestimmte UID für den Befehl notwendig ist.

3.2 XMMS steuern

Der xmms stellt eine Reihe von Kommandozeilen-Parametern zur verfügung, die es erlauben, per shell eine bereits laufende Sitzung zu steuern. Die genauen Parameter lassen sich mit

 man xmms

erfragen. Hier ist es wichtig, den Befehl unter genau dem Benutzer auszuführen, der auch den xmms gestartet hat. Sonst pasiert ganz einfach gar nichts.

3.3 Lautstärke regeln

Dazu gibt es das näztliche Tool setmixer, das über Kommandozeilen-Parameter und ohne weitere Interaktion Manipulationen des Mixers zulässt. So kann man die Gesamtlautstärke mit

 setmixer vol +10 setmixer vol -10

stufenweise regeln. Das ist auch ziemlich genau das, was man mit einem Lautstärkeregler erreichen will.

4. Abschließende Bemerkung

Ich habe dieses HOWTO geschrieben, um meine Erfahrungen mit Multimedia-Keys unter Linux zusammenzufassen. Die Informationen stammen von folgenden Seiten:

Die verwendeten Kommandos sind nur so weit erklärt, wie es für dieses Dokument notwendig ist. Nähere Informationen sind in den man-pages bzw auf den angegebenen Seiten zu finden.

Anregungen zur Verbesserung dieses Dokuments sind jederzeit willkommen.