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:
- Zeilen, die mit einer Raute (
#) beginnen, werden ignoriert - Kommandos werden in der Form
<keycode> <kommando>
abgelegt. Dabei muss der Keycode hexadezimal angegeben werden (das heißt: umrechnen). Das Kommando ist beliebig und darf Leerzeichen enthalten.
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:
- http://lineak.sourceforge.net
- http://tunah.net/index.php?section=linuxevo-funkeys
- http://rick.vanrein.org/linux/funkey
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.