Tastenbelegung geht nach Umschalten mit KVM-Switch verloren

  • Ich habe meinen Monitor, Tastatur und Maus über einen KVM-Switch für HDMI und USB an vier verschiedene Rechner angeschlossen. Jedes Mal, wenn ich zu einem der Rechner mit graphischer Oberfläche (z.B. KDE) schalte, muß ich erst wieder 'xmodmap' aufrufen, damit meine eigene Tastenbelegung wieder aktiviert wird. Das ist sehr lästig, da ich es oft vergesse und erst bemerke, wenn ich eine der speziellen Tasten brauche, und weil es einige Zeit dauert, bis 'xmodmap' fertig ist.


    Gibt es eine Möglichkeit, dafür zu sorgen, daß die Tastenbelegung auch nach einem Umschalten der Tastatur erhalten bleibt?


    Klaus

  • xmodmap unterstützt kein Hotplugging - da kann man bestenfalls um das Problem herum arbeiten: https://bbs.archlinux.org/viewtopic.php?pid=1440918#p1440918


    Die moderne Alternative zu xmodmap ist xkb - damit könntest du dir eine eigene Tastenbelegung ausgehend von den aktuellen Einstellung ableiten: https://miek.nl/2014/october/28/xmodmap-is-dead/

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Wenn ich gemäß der Anleitung


    xkbcomp $DISPLAY

    xkbcomp server-0.xkb

    xkbcomp server-0.xkm $DISPLAY


    mache, dann bekomme ich


    Warning: No symbols defined for <AB11> (keycode 97)
    Warning: No symbols defined for <KATA> (keycode 98)

    ...
    Warning: No symbols defined for <I253> (keycode 253)


    X Error of failed request: BadValue (integer parameter out of range for operation)
    Major opcode of failed request: 135 (XKEYBOARD)
    Minor opcode of failed request: 9 (XkbSetMap)
    Value in failed request: 0x167f0002
    Serial number of failed request: 132
    Current serial number in output stream: 138


    Die Warnungen sind wohl vernachlässigbar, aber wie ich die X-Fehlermeldung wegbekommen soll sehe ich nicht.

    Es findet anscheinend auch keinerlei Tastenbelegung statt.


    Klaus

  • In ~/.xsession-errors-:0 erscheint dabei


    log_kioremote: RemoteDirNotify::FilesAdded

    log_kioremote: RemoteDirNotify::toRemoteURL( QUrl("desktop:/") )

    log_kioremote: result => KUrl()

    log_kioremote: RemoteDirNotify::FilesAdded

    log_kioremote: RemoteDirNotify::toRemoteURL( QUrl("desktop:/server-0.xkm") )

    log_kioremote: result => KUrl()

    log_kioremote: RemoteDirNotify::FilesAdded

    log_kioremote: RemoteDirNotify::toRemoteURL( QUrl("desktop:/") )

    log_kioremote: result => KUrl()

    kf5.kio.core: KLocalSocket(0x479f3f0) Jumbo packet of 54850 bytes

    kf5.kio.core: KLocalSocket(0x479f3f0) Jumbo packet of 54850 bytes

    was irgendwie auch nicht weiterführend ist...


    Klaus

  • Nachdem ich dieser Tage meinen Arbeitsrechner neu installieren musste (openSUSE Leap 15.0), greife ich diesen etwas älteren Thread nochmal auf, in der Hoffnung, dass vielleicht noch jemand eine Idee hat, die zur Lösung des Problems führt.


    Ich benutze eine Apple Aluminium Tastatur, auf deren Tasten ich die zum Programmieren nötigen Sonderzeichen wie z.B. '[]{}\@' an meine gewohnten Stellen gelegt habe. Dazu benutze ich eine Datei die Keycodes wie z.B.

    Code
    1. keycode 39 = odiaeresis Odiaeresis braceleft
    2. keycode 40 = adiaeresis Adiaeresis braceright
    3. keycode 41 = less greater bar

    enthält. Diese gzippe ich und kopiere sie nach /usr/share/kbd/keymaps/legacy/mac/all/mac-de-latin1-nodeadkeys.map.gz, ersetze also damit die vom System installierte Version dieser Datei.

    In /etc/vconsole.conf steht bereits von der Installation her "KEYMAP=mac-de-latin1-nodeadkeys", so dass ein "mkinitrd" die von mir veränderte Datei für künftige Sysetmstarts einbaut. Nach einem Reboot habe ich dann an den virtuellen Konsolen (tty1 etc.) die gewünschte Tastaturbelegung.


    Für den Desktop unter X11 habe ich die Tastaturbelegung bisher über ~/.Xmodmap gemacht, aber leider geht diese Belegung verloren, sobald die Tastatur vom USB-Port abgetrennt wird (ich schalte wie oben erwähnt über einen KVM-Switch zwischen verschiedenen Rechnern um). Nach dem Zurückschalten auf den Desktop-Rechner muss ich jedesmal erst wieder "xmodmap ~/.Xmodmap" machen.

    Nun habe ich versucht herauszufinden, wo die Default-Tastenbelegung liegt, die X11 verwendet (wenn der Benutzer keine ~/.Xmodmap hat). Wenn ich diese (so wie oben für die virtuellen Konsolen) austauschen könnte, dann wäre der Default gleich für mich passend. Nur leider finde ich nicht heraus, was das Äquivalent zu /usr/share/kbd/keymaps/legacy/mac/all/mac-de-latin1-nodeadkeys.map.gz für X11 ist.


    Kann da jemand weiterhelfen?


    Klaus

  • Wenn bei dir xkbcomp nicht funktioniert (ich nutze weder SuSE noch KDE und kann den beschriebenen Fehler leider nicht nachvollziehen), könntest du es mal so versuchen:


    Du erstellst dir für dein Keyboard eine udev-Regel, die sich eine bestimmte Systemd-Unit in der User-Session wünscht:

    Code: /etc/udev/rules.d/my_keyboard.rules
    1. KERNEL=="event[0-9]*" SUBSYSTEM=="input", \
    2. ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c31d", \
    3. TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="my_keyboard.service"

    Die Vendor- und Produkt-ID (das Beispiel ist für eine Logitech K200) bzw. andere eindeutige Merkmale deiner Tastatur für die Udev-Regel kannst du mit udevadm ermitteln (lsusb sollte die beiden IDs ebenfalls anzeigen), wenn dir cat /proc/bus/input/devices z.B. sagt, dass dein Apple-Keyboard event10 ist, dann kannst du so seine udev-Attribute anzeigen lassen: udevadm info -a -n input/event10


    Dann brauchst du noch eine Systemd-Unit, die die Keymap mit xmodmap lädt (ich gehe mal davon aus, dass du dich am Desktop anmeldest und dadurch DISPLAY und HOME in den Umgebungsvariablen der Systemd-Sitzung enthalten sind, das kannst du mit systemctl --user show-environment überprüfen):

    Code: ~/.config/systemd/user/my_keyboard.service
    1. [Unit]
    2. Description=Run xmodmap if the keyboard is plugged in
    3. [Service]
    4. Type=oneshot
    5. ExecStart=/usr/bin/notify-send "Keyboard" "was plugged in"
    6. ExecStart=/usr/bin/xmodmap ${HOME}/.Xmodmap

    Nachdem du mit systemctl --user daemon-reload die Systemd-Units neu eingelesen und mit systemctl restart udev Udev neu gestartet hast (alternativ den Rechner neu starten), solltest du beim Einstecken der Tastatur bzw. Umschalten des KVM-Switch auf den Rechner jeweils eine Benachrichtigung bekommen (das ist vor allem dazu gedacht schnell sehen zu können, ob es funktioniert und kann später entfernt werden) und die gewünschte Belegung geladen werden. Eventuell ist noch ein kurzer sleep vor dem Laden der Keymap nötig, falls KDE da selber noch etwas an der Belegung ändert - in dem Fall könntest du z.B. eine Zeile mit ExecStart=/bin/sleep 1 vor dem xmodmap-Befehl einfügen.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Einen Aufruf von xmodmap (direkt oder über udev) wollte ich eigentlich vermeiden, denn das dauert einige Zeit, während der der Desktop teilweise recht träge ist und die Tasten eben noch nicht richtig belegt sind.


    Was ich erreichen möchte ist, dass das System meine Tastenbelegung als "nativen Default" benutzt. Irgendwo muss es ja wohl eine Datei geben, die hierfür zuständig ist


    xkbcomp hab ich gerade nochmal probiert, es bringt aber auch auf dem neuen System die o.g. Meldungen.

    Müsste ich das als root laufen lassen? Oder müsste ich das server-0.xkm File irgendwo hinkopieren, wo es beim Start greift?


    Klaus

  • Hast du schon versucht deine Einstellungen direkt in von X11 verwendete xkb Tasten-Zuordnunsgdatei einzutragen?

    (Bei Gentoo liegen diese unter /usr/share/X11/xkb/symbols


    Die bei mit von X11 erkannte Tastatur und das Layout sind:


    gentoo2 ~ # setxkbmap -query

    rules: evdev
    model: pc105
    layout: de
    variant: nodeadkeys
    gentoo2 ~ #


    Jetzt kann ich in der Datei "/usr/share/xkb/symbols/de" (layout) im Abschnitt "xkb_symbols "nodeadkeys"" z.B. die Taste Umlaut-O zu einem zweiten Umlaut-A machen - wie hier.

    ..

    //key <AC10> { [ odiaeresis, Odiaeresis, doubleacute, doubleacute ] };

    key <AC10> { [ adiaeresis, Adiaeresis, asciicircum, asciicircum ] };

    key <AC11> { [ adiaeresis, Adiaeresis, asciicircum, asciicircum ] };

    ..

    (die Änderung wird erst nach einem Neustart von X wirksam).


    Etwas ausführlicher und mit Erklärung der Key <XXXX> Bezeichnungen hier: Enhancing_an_X_keyboard_layout


    Helmut

  • openSUSE speichert diese Dateien anscheinend in /usr/share/X11/xkb/symbols.

    Ein "setxkbmap -query" liefert bei mir


    rules: evdev

    model: pc105

    layout: us


    was etwas verwunderlich ist, denn ich habe als Tastaturbelegung bei der Installation "German, nodeadkeys" angegeben.

    In der Hoffnung, meine via Xmodmap eingestellte Tastaturbelegung auf einfache Weise dort hinterlegen zu können, habe ich mit "xkbcomp $DISPLAY" eine Datei server-0.xkb erzeugt, die vom Aufbau her den Dateien in /usr/share/X11/xkb/symbols recht ähnlich sieht. Diese habe ich dann unter /usr/share/X11/xkb/symbols/us gespeichert und den X-Server neu gestartet - mit dem Ergebnis, dass überhaupt keine Tastatureingaben mehr möglich waren :-(. Nachdem ich die ursprüngliche "us"-Datei wieder eingespielt hatte, funktionierte es zumindest wieder so wie vorher.


    Ich hänge meine server-0.xkb mal hier dran, vielleicht kannst du ja erkennen, warum diese nicht apzeptiert wird.


    Klaus


  • Die Audsgabe von "xkbcomp $DISPLAY" ist die komplette Tastaturbeschreibung der aktuellen Konfiguration des X-Server. Also nicht nur "symbols" sondern auch alle anderen Eigenschaften wie layout, keycodes, types usw. die sonst in eigenen Dateien in den Unterverzeichnissen von /usr/share/X11/xkb definiert sind. Deshalb funktionierte sie unter "symbols" nicht (man könnte sie aber editieren und dann mit "xkbcomp <name> $DISPLAY" neu laden -zumindest lt. man-page - ich habe es noch nicht selbst versucht).


    Wie man hier sieht

    Code
    1. xkb_symbols "pc+us+inet(evdev)+terminate(ctrl_alt_bksp)" {
    2. name[group1]="English (US)";

    wird tasächlich als Basis von einer US-Tastatur ausgegangen, sie hat aber dann doch die deutsche Tastaturbelegung, also wird sie noch irgendwie modifiziert - vielleicht mit "setxkbmap".

    Ich weiß nicht wie es bei Suse gemacht wird, aber ich glaube es gibt eine Datei "/etc/X11/xorg.conf.d/00-keyboard.conf" und "/etc/X11/xdm/Keyboard.map" die erklären könnten aus welcher Datei in "symbols" die deutschen Belegung tatsächlich herkommt.


    Helmut

  • Ich habe jetzt openSUSE Leap 15.0 KDE Live ausprobiert.

    Das Keyboard habe ich in YAST auf "Deutsch" gesetzt und setxkbmap -query zeigt mir


    rules: evdev

    model: pc105

    layout: de

    variant: nodeadkeys

    options: terminate:ctrl_alt_bksp


    Nach "xkbcomp $DISPLAY" habe ich in der Datei server-0.xkb die runden und geschweiften Klammern zu Ö und Ä gelegt und die Datei mit "xkbcomp server-0.xkb $DISPLAY" geladen. Danach waren () und {} mit AltGr rund Shift-AltGr erreichbar.


    Um diese Belegung unter X11automatisch zu haben wäre das in "/usr/share/X11/xkb/symbols/de" unter "nodeadkeys" so einzutragen (natürlich nur wenn das verwendete Layout tatsächlich "de" ist)

    Code: symbols/de
    1. partial alphanumeric_keys
    2. xkb_symbols "nodeadkeys" {
    3. ...
    4. key <AC10> { [ odiaeresis, Odiaeresis, braceleft, bracketleft ] };
    5. key <AC11> { [ adiaeresis, Adiaeresis, braceright, bracketright ] };

    Helmut

  • Danke für den Test. Vielleicht sollte ich erstmal klären warum "setxkbmap -query" bei mir etwas anderes liefert.

    Ich habe die Spur jetzt nach /etc/X11/xdm/keytable und weiter nach /etc/X11/xorg.conf.d verfolgt. Dort steht bei mir in /etc/X11/xorg.conf.d/00-keyboard.conf:

    Code
    1. # Written by systemd-localed(8), read by systemd-localed and Xorg. It's
    2. # probably wise not to edit this file manually. Use localectl(1) to
    3. # instruct systemd-localed to update it.
    4. Section "InputClass"
    5. Identifier "system-keyboard"
    6. MatchIsKeyboard "on"
    7. Option "XkbLayout" "us"
    8. EndSection

    Irgendwie soll diese Datei wohl via /etc/X11/xdm/keytable erzeugt werden, aber ich schaffe es nicht, da was anderes als "us" reinzubringen.

    Kannst du bitte mal den Inhalt deiner /etc/X11/xorg.conf.d/00-keyboard.conf posten?


    Klaus

  • Also: Leap 15.0 KDE Live von USB, mit Sprache Deutsch, Tastatur Deutsch, beides einfach über YAST (vom Startmenü) eingestellt und dann X neu gestartet ergibt folgendes:

    Code: /etc/sysconfig-Editor
    1. YAST_KEYBOARD
    2. german,pc104
    Code: xorg.0.log
    1. [ 742.664] (**) Option "config_info" "udev:/sys/devices/platform/i8042/serio0/input/input0/event0"
    2. [ 742.664] (II) XINPUT: Adding extended input device "AT Translated Set 2 keyboard" (type: KEYBOARD, id 13)
    3. [ 742.664] (**) Option "xkb_model" "pc105"
    4. [ 742.664] (**) Option "xkb_layout" "de"
    5. [ 742.664] (**) Option "xkb_variant" "nodeadkeys"
    6. [ 742.664] (**) Option "xkb_options" "terminate:ctrl_alt_bksp"
    7. [ 742.664] (II) event0 - AT Translated Set 2 keyboard: is tagged by udev as: Keyboard
    8. [ 742.664] (II) event0 - AT Translated Set 2 keyboard: device is a keyboard
    Code: /etc/locale.conf
    1. LANG=de_DE.UTF-8
    Code: /etc/vconsole.conf
    1. FONT=eurlatgr.psfu
    2. FONT_MAP=none
    3. KEYMAP=de-latin1-nodeadkeys
    4. FONT_UNIMAP=

    Helmut