Keyboard-Konfiguration unter X

Vorwort

Der folgende Artikel beschreibt wie man mehrere Tastaturkonfigurationen unter X konfiguriert.
In der Regel (in Desktopumgebungen) übernehmen das Dienste der Desktopumgebung, die dafür entsprechend auch grafische Werkzeuge mitbringen - in der Regel lässt sich dort aber nicht zwischen mehreren Tastaturen unterscheiden.

Da das Ganze ein paar Nachteile hat (und ich auch nicht das damit erreichen konnte was ich eigentlich wollte), hier ein paar Einschränkungen vorweg:

  • die Konfiguration gilt für alle Benutzer auf dem System

  • die Konfiguration kann zwar auf das einstecken einer Tastatur reagieren, aber nicht auf das Entfernen

Letzteres war eigentlich was ich wollte, das X die Tastaturkonfiguration ändert wenn man eine Tastatur steckt und sie auf eine andere ändert wenn man sie wieder entfernt.

Übersicht Konfiguration

/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
    Identifier "Common"
    MatchIsKeyboard   "on"

    Option "XkbModel" "pc105"
    Option "XkbLayout" "de"
    Option "XkbVariant" "neo"
    Option "XKbOptions" "grp:alt_shift_toggle"
EndSection

Section "InputClass"
    Identifier "ZSA Voyager"
    MatchIsKeyboard   "on"
    MatchUSBID "3297:1977"

    Option "XkbModel" "pc105"
    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"
    Option "XKbOptions" "grp:alt_shift_toggle"
EndSection

Section "InputClass"
    Identifier "ASIX"
    MatchIsKeyboard   "on"
    MatchUSBID "0b95:6804"

    Option "XkbModel" "pc105"
    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"
    Option "XKbOptions" "grp:alt_shift_toggle"
EndSection

Section "InputClass"
    Identifier "ASIX2"
    MatchIsKeyboard   "on"
    MatchUSBID "d005:ad0e"

    Option "XkbModel" "pc105"
    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"
    Option "XKbOptions" "grp:alt_shift_toggle"
EndSection

Eine Keyboard-Konfiguration (praktisch eigentlich jede Custom-Konfiguration in X, z.B. für Maus) ist eine Datei in xorg.conf.d.
Der genaue Pfad ist von Distribution zu Distribution etwas verschieden, aber in der Regel heißt das Unterverzeichnis so.
Die Datei folgt dem Schema <2-Ziffern>-<ein Name>.conf - praktisch werden sie in lexikalischer Reihenfolge abgearbeitet.

Eine Datei kann mehrerere Sektionen enthalten, diese werden von oben nach unten abgearbeitet.

💡

Unter Umständen registrieren sich Docking-Stations oder Umschalter die man zwischen Tastatur und Computer hat ebenfalls als Tastaturen, es ist dabei nicht gesagt wer zuerst erkannt wird.
Das kann zur Folge haben das zuerst die eigentliche Tastatur erkannt wird, die gewünschte Konfiguration angewendet wird und dann Umschalter/Docking-Station erkannt wird und die generische Konfiguration angewendet wird - also prakitsch wieder auf die Standard-Konfiguration zurückgewechselt wird.
In diesen Fällen sollte man mehrere InputClass-Sektionen anlegen und beim erkennen des Docks/Umschalters die gleiche Konfiguration wie bei der externen Tastatur anwenden

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Section "InputClass"
    Identifier "ZSA Voyager"
    MatchIsKeyboard   "on"
    MatchUSBID "3297:1977"

    Option "XkbModel" "pc105"
    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"
    Option "XKbOptions" "grp:alt_shift_toggle"
EndSection

Eine Sektion/Keyboard-Konfiguration besteht aus folgenden Elementen:

  • Zeile 1: Section "InputClass" → zeigt an das hier eine Sektion beginnt und das es sich um die Konfiguration von einem Eingabegerät handelt

  • Zeile 2: Identifier → Name der Sektion, der String in " kann beliebig gewählt werden

  • Zeile 3: MatchIsKeyboard "on" → Bedingung; die Sektion wird nur ausgeführt wenn es sich um ein Keyboard handelt

  • MatchUSBID "3297:1977" → Bedingung; die Sektion wird nur ausgeführt wenn es sich um ein Gerät mit der USB-ID "3297:1977" (Hersteller:Geräte-ID) handelt

  • Option "XkbModel" "pc105" → Definiert das Modell von Tastatur (welche Tasten/Funktionen sind vorhanden

    • die meisten Tastaturen sind mit pc105 abgedeckt, für die meisten modernen Tastaturen gibt es hier kein spezifisches Modell

  • Option "XkbLayout" "de" → Layout der Tastatur; praktisch die Sprache

  • Option "XkbVariant" ",neo" → Variante des Layouts; ", steht hier für keine Variante

Wie man am Anfang gesehen hat, habe ich mehrere Sektionen, hier noch mal auf das wesentliche reduziert:

Section "InputClass"
    Identifier "Common"

    Option "XkbLayout" "de"
    Option "XkbVariant" "neo"
EndSection

Section "InputClass"
    Identifier "ZSA Voyager"
    MatchUSBID "3297:1977"

    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"
EndSection

Section "InputClass"
    Identifier "ASIX"
    MatchUSBID "0b95:6804"

    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"
EndSection

Section "InputClass"
    Identifier "ASIX2"
    MatchUSBID "d005:ad0e"

    Option "XkbModel" "pc105"
    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"
EndSection

Wird jetzt eine Tastatur eingesteckt bzw. X gestartet wird diese Liste von Oben nach Unten abgearbeitet.
Die erste Sektion hat keine Bedingung (außer das es eine Tastatur sein muss), das heißt sie würde bei jeder gefundenen Tastatur angewendet werden.
Sie würde das Layout (die Sprache) auf Deutsch setzen und die Variante auf "neo".
Die darauffolgenden Sektionen werden jeweils ausgeführt wenn die USB-ID des erkannten Gerätes zutrifft (MatchUSBID).

Details

Im folgenden gehe ich auf einige Konfigurationsdetails ein.

Match/MatchUSBID

Eine Sektion kann Kriterien haben die einschränken unter welchen Umständen sie ausgeführt wird.
Das wird über Match-Keywords gemacht:

    MatchIsKeyboard   "on"

Prüft ob es sich bei dem Gerät um ein Keyboard handelt.

    MatchUSBID "3297:1977"

Prüft ob das Gerät eine bestimmte USB-ID hat.

Es gibt noch mehr Match-Kriterien die man verwenden kann, eine Liste findet man hier: https://www.x.org/releases/current/doc/man/man5/xorg.conf.5.xhtml Sektion "INPUTCLASS SECTION"

Die USB-ID kann man u.a. ermitteln in dem man in eine Konsole lsusb eingibt.
Man bekommt dann eine Liste von USB-Geräten, die in etwa so aussehen:

Bus 007 Device 023: ID 3297:1977 ZSA Technology Labs Voyager

Am Ende steht jeweils der Name des Gerätes, was es in der Regel ermöglicht zu erkennen welches es ist.
Kann man es nicht eindeutig identifizieren/ ist man sich nicht sicher, kann man auch einfach die Tastatur rausziehen, lsusb ausführen, sie wieder stecken und es erneut ausführen und sieht dann welches Gerät hinzugekommen ist.
Die USB-ID in obigem Beispiel ist: 3297:1977

Layout und Variante

Das Layout (die konfigurierte Sprache) und die Variante werden über die folgenden Optionen gesetzt

    Option "XkbLayout" "de"
    Option "XkbVariant" ",neo"

Wobei für beides mehrere Möglichkeiten durch Komma getrennt angegeben werden können.

Also zum Beispiel so:

    Option "XkbLayout" "de, us"
    Option "XkbVariant" ",neo"

Es gibt in diesem Fall dann die Keyboard-Konfiguration Deutsch (de) in den Varianten "Normal" (",) und "Neo" ("neo") und die Keboard-Variante "us".
Aktiv per Default immer die erste Kombination aus Layout und Variante, also hier dann "Deutsch" "Normal"

💡

Es empfiehlt sich wenn man in mehreren Sektionen das gleiche Layout, aber verschiedene Varianten benutzt ("Deutsch-Normal" und "Deutsch-Neo") die Varianten immer explizit zu setzen in allen Sektionen.
Weil sonst passiert es das die Variante die vormals gesetzt war, gesetzt bleibt.
Um die Normalvariante eines Layouts zu setzen (und keine Varianten), setzt man XkbVariant einfach auf "leer":

    Option "XkbVariant" ","

Zwischen den Kombinationen kann umgeschaltet werden über die Tastenkombination die hier angegeben wurde:

Option "XKbOptions" "grp:alt_shift_toggle"

Um die aktuell gesetzten Daten zu erhalten (und damit ein Beispiel zu haben) kann man:

setxkbmap -print -verbose 10 -> zeigt die bisherige Konfiguration (aktiv an)

Das gibt etwa sowas aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules:      evdev
model:      pc105
layout:     de
variant:    neo
options:    grp:alt_shift_toggle
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwertz)
types:      complete
compat:     complete+caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
symbols:    pc+de(neo)+inet(evdev)+group(alt_shift_toggle)
geometry:   pc(pc105)
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwertz)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete+caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)"	};
	xkb_symbols   { include "pc+de(neo)+inet(evdev)+group(alt_shift_toggle)"	};
	xkb_geometry  { include "pc(pc105)"	};
};

In den Zeilen 8-11 findet man das Model, das Layout, die Variante (Eintrag existiert nicht wenn keine gesetzt ist), so wie wie man zwischen Layouts umschalten kann.

Konfiguration aktivieren

Die Konfiguration kann nur aktiviert werden in dem man den X-Server neustartet.

Troubleshooting

Nach dem Ändern der Konfiguration kann es sein das auf Grund eines Parser-Fehlers der X-Server gar nicht mehr startet (man landet auf einem Terminal) oder das es nicht wie gewünscht funktioniert.

Die erste Anlaufstelle ist dann das Log, das findet man unter /var/log/Xorg.0.log .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[    90.562] (II) config/udev: Adding input device ZSA Technology Labs Voyager (/dev/input/event15)
[    90.562] (**) ZSA Technology Labs Voyager: Applying InputClass "libinput keyboard catchall"
[    90.562] (**) ZSA Technology Labs Voyager: Applying InputClass "Common"
[    90.562] (**) ZSA Technology Labs Voyager: Applying InputClass "ZSA Voyager"
[    90.562] (II) Using input driver 'libinput' for 'ZSA Technology Labs Voyager'
[    90.562] (**) ZSA Technology Labs Voyager: always reports core events
[    90.562] (**) Option "Device" "/dev/input/event15"
[    90.563] (II) event15 - ZSA Technology Labs Voyager: is tagged by udev as: Keyboard
[    90.563] (II) event15 - ZSA Technology Labs Voyager: device is a keyboard
[    90.563] (II) event15 - ZSA Technology Labs Voyager: device removed
[    90.573] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:08.3/0000:c6:00.4/usb7/7-1/7-1.1/7-1.1.3/7-1.1.3.1/7-1.1.3.1.2/7-1.1.3.1.2:1.0/0003:3297:1977.0003/input/input20/event15"
[    90.573] (II) XINPUT: Adding extended input device "ZSA Technology Labs Voyager" (type: KEYBOARD, id 22)
[    90.573] (**) Option "xkb_model" "pc105"
[    90.573] (**) Option "xkb_layout" "de"
[    90.573] (**) Option "xkb_variant" "neo"
[    90.573] (**) Option "xkb_options" "grp:alt_shift_toggle"
  • Zeile 2-4: Anwenden der InputSections

    • zuerst wird eine generische ausgeführt

    • anschließend die die aus der Beispielkonfiguration "Common" die keine MatchUSB-Regel hat und damit für alle Keyboards gilt

    • danach die "ZSA Voyager"

  • Zeile 13-16: Enthalten die Optionen, die auf Grund der InputSections die zutrafen, angewendet werden

Besteht das Problem das scheinbar Sachen nicht richtig angewendet werden (also nicht wenn der X-server gar nicht startet) empfiehlt es sich das Log von Unten nach Oben - also beginnend mit den letzten Aktionen - zu lesen. +
Eventuell wurden die gewünschten Aktionen ausgeführt, aber durch später erkannte Geräte (z.B. Docking-Station, Umschalter) überschrieben.