Letzte Änderung 09.04.2013
English Version

Multimedia Tasten


Ausgangssituation

Als Ausgangspunkt dient ein Notebook Dell Inspiron 9400 ("portables Kino"), auf dem Opensuse 10.1 läuft, und das sehr gut. Eines der wenigen Ärgernisse waren die sieben Multimedia-Tasten des Geräts, die sich an der Vorderseite befinden (siehe Bild).

Die Tasten auf der Vorderseite
Dell Inspiron 9400 Frontansicht. Die Tasten funktionierten anfangs bei keiner Linux-Distribution out-of-the-box
Bei Einsatz des von den meisten Notebook Herstellern "empfohlenen" Betriebsystem aus Redmond reicht es, einen Treiber zu installieren, und schon kann man den Audioplayer über diese Tasten bedienen. Nach der Installation von Opensuse 10.1 (oder einer beliebigen anderen Linux-Distribution aus 2006) leuchten sie zwar hübsch auf, mehr aber nicht.

Als Desktop kommt KDE in der Version 3.5 zum Einsatz, mein bevorzugter mp3-Player ist amarok, Dieses Programm soll über die Tasten bedient werden.

Was ist zu tun?

Um jetzt diese Tasten dazu zu bringen, den mp3-Player anzusteuern, müssen folgende Schritte geschehen:

  1. Die Tastencodes müssen festgestellt werden
  2. Diese Codes müssen an X11 bekannt gegeben werden (sie bekommen Namen)
  3. In KDE muss eine Zuordnung (KDE key mapping) getroffen werden, sodass KDE einen Tastendruck an den Audioplayer weiterleitet.

Tastencodes

Das xev Fenster
xev, das Programm, das X11 Events protokolliert

Das Programm der Wahl heißt xev. Es ist ein sehr hilfreiches Testprogramm für X11, denn es protokolliert auf stdout alle Events, die von X11 registriert werden. Dazu zählt auch das Drücken und Loslassen einer Taste. Sein Output sieht auf den ersten Blick kryptisch aus, doch mit den folgenden Zeilen kann man die für unsere Zwecke uninteressanten Informationen ausblenden:

xev | awk '
   {split($0,f,/[()]/);
    if (f[2]!~/^keysym/) next;
    c=split(f[2],g,", ");
    print $4,g[2]}'

Nach dem Aufruf des abgebildeten Scripts drückt man alle Tasten, deren keycode man ermitteln will. Eventuell muss man den Mauscursor am Ende in das schwarz umrandete Quadrat bewegen, um xev zur Ausgabe zu bewegen.

Der Output sollte in etwa so aussehen:

162 None
164 None
...

Namen an die Tasten zuweisen

Jetzt können diesen Tasten symbolische Namen zugeordnet werden. Für die 7 Tasten des Inspiron 9400 stellt X11 passende Konstanten zur Verfügung, etwa XF86AudioPlay für die Taste "Play". Zusammen mit den ermittelten keycodes kann man eine Datei ~/.Xmodmap erstellen, in der die Zuordnungen zwischen den Multimediatasten und den symbolischen Namen festgeschrieben wird. Für den Inspiron 9400 sieht die so aus:

  
keycode 162 = XF86AudioPlay
keycode 164 = XF86AudioStop
keycode 144 = XF86AudioPrev
keycode 153 = XF86AudioNext
keycode 176 = XF86AudioRaiseVolume
keycode 174 = XF86AudioLowerVolume
keycode 160 = XF86AudioMute


Zum Testen kann man einfach

xmodmap ~/.Xmodmap
aufrufen. Ein neuerlicher Lauf von xev sollte nun anstatt "None" den symbolischen Namen liefern.

Wenn X11 gestartet wird, werden von xmodmap diese 7 Tasten nun eingebunden. Funktion haben sie aber noch keine, das ist die Aufgabe von KDE.

KDE mapping

Der Mechanismus, mit dem KDE einem Programm Kommandos übergibt, ist DCOP: Das Desktop COmmunication Protocol. Damit werden Nachrichten zwische KDE, der aktuellen Session und den laufenden Applikationen ausgetauscht. In unserem Fall hätten wir gerne, dass KDE z.B. das Tastenereignis XF86AudioPlay in einen Befehl an das (KDE-)Programm amarok übersetzt.

KDE stellt ein Werkzeug zur Konfiguration bereit: kcontrol, das Kontrollzentrum. Damit kann man KDE überreden, Tastenereignisse als DCOP-Kommandos an Programme weiter zu reichen. Auf einer (deutschen) Suse 10.1 befindet es sich unter dem nichtssagenden Menu-Punkt Persönliche Einstellungen. In älteren Versionen heißt es schlicht Kontrollcenter.

Unter Regionaleinstellungen & Zugangshilfen/Tastenkombinationen können mit dem Menu-Punkt Neue Aktion Zuordnungen zwischen Tastenereignissen und DCOP-Aktionen getroffen werden (siehe Bild).

Kontrollcenter
KDE Kontrollcenter mit bereits eingetragenen Tasten; rechts sieht man die DCOP-Aktionen
  1. Unter Allgemein tragen Sie einen Aktionsnamen ein, und stellen den Aktionstyp auf "Tastenkürzel auf DCOP-Aufruf (einfach)".
  2. Unter Tastenkürzel klickt man auf das Feld, in dem noch "Keiner" steht. Danach bewegt man den Cursor in das Feld neben Primäre Tastenkürzel und drückt die gewünschte Taste; Es sollte der vorher in .Xmodmap festgelegt symbolische Namen erscheinen.
  3. Unter Einstellungen zu DCOP-Aufrufen können jetzt die DCOP-Aktionen eingetragen werden. Bei unserem Beispiel bleibt das Feld Argumente leer.

Wenn man mittels Versuchen die eingetragenen Aktionen auslöst, sollte sich amarok melden. Wenn nicht, ist einer der Einträge falsch. Sollte der Test funktionieren, die Taste aber nicht den gewünschten Effekt zeitigen, fehlt wahrscheinlich die Tastenzuordnung.

Nachtrag

In der Praxis ergeben sich dann noch ein paar Unzulänglichkeiten:

  1. Aus unerfindlichen Gründen schafft es KDE bei mir nicht, beim Start xmodmap aufzurufen. Die einfache Abhilfe ist ein Startscript im Verzeichnis ~/.kde/Autostart, das diese Aufgabe übernimmt. Null Punkte für Eleganz, aber es funktioniert.

  2. Die Ansteuerung der Lautstärke über amarok hat Nachteile: Wenn amarok nicht läft, gehen die DCOP-Befehle ins Leere, damit funktionieren die Tasten nicht. Ausserdem müsste man die Lautstärke am System auf mindestens 80% stellen, das beschert aber unverhältnismäßig laute akustische Events. Besser ist es daher, die Lautstärke mit kmix oder über amixer zu steuern. Ersteres Programm registriert sich ebenso wie amarok am DCOP und kann daher mit Events wie
    kmix Mixer0 increaseVolume 1
    gefüttert werden.

    Für die Ansteuerung von amixer muss man ein kleines Wrapper-Script schreiben:

    #!/bin/bash
    
    if [ $# = 0 ] ; then
    ADD="+1"
    else
    ADD="$1";
    fi
    
    NEWVAL=$(amixer -c 0 get Master | \
    awk '$1=="Front"&&$2~/Left|Right/ {
    	val[c++]=$4; next}
    END	{ printf "%d,%d\n",
    	    val[0]'$ADD',val[1]'$ADD'}')
    amixer -c 0 sset Master 0 $NEWVAL
    

    Wenn dieses Script verwendet werden soll, muss man im kcontrol den Aktionstyp auf Tastenkürzel -> Befehl/Adresse (einfach) umstellen. Unter dem Tabreiter Befehl/Adresse-Einstellungen muss dann der Name dieses Script stehen, versehen mit dem Parameter +1 für Lautstärke erhöhen oder -1 fürs Reduzieren.

  3. Programme, die alle X-Events abfischen, wie z.B. der Bildschirmschoner, verhindern das Durchreichen der Tastenereignisse. In der Defaulteinstellung funktionieren die Multimediatasten daher nicht bei zugeklappten Deckel des Laptops.