Zusammenhang von Tastaturlayout und xmodmap


12

Ich benutze Xubuntu. Vor dem Login kann ich ein Tastaturlayout auswählen. Ich benutze xmodmapfür einige Tasten neu zuordnen.

Ich interessiere mich für zwei Dinge:

  1. Wie ändert sich der Status der Tastaturbelegung (a) beim Einschalten des Laptops, (b) während des Startvorgangs und (c) beim System anmelden (in diesen drei Phasen) und beim Arbeiten mit dem System (angemeldet)?
  2. Was bewirkt, dass in den einzelnen Phasen welche Symbole auf dem Bildschirm angezeigt (und Steuertasten gesendet) werden? Wenn ich eine Taste drücke, wird ein Signal an den Tastaturtreiber gesendet (?). Anschließend muss ein Entscheidungsprozess (Anwendungen und Konfigurationsdateien) stattfinden, um zu bestimmen, welche Symbole angezeigt werden. Antwort auf diese Frage sollte die Liste der Anwendungen und Pfade zu diesen Konfigurationsdateien sein (ich interessiere mich besonders für Ubuntu (Debian-basiertes System), aber Sie können ein anderes System beschreiben, aber Ubuntu wird bevorzugt).

Antworten:


24

Hier gibt es zwei Ebenen: KEYCODE-zu-KEYSYM-Zuordnung und KEYSYM-zu-Text-Zuordnung. Wenn Sie den Kernel zählen, der AT Keyboard-Scancodes einem XT-artigen KEYCODE oder einen USB Keyboard-HID-Code einem KEYCODE zuordnen muss, gibt es mehr Ebenen. Ein KEYCODE ist einfach eine 8-Bit-Ganzzahl ohne Vorzeichen, die der Kernel eines Betriebssystems an den X11-Server weitergibt. Es kann zwischen Betriebssystemen wie Linux und Solaris variieren. Unter Linux sind diese KEYCODEs normalerweise die gleiche Nummer wie auf alten XT PC-Tastaturen. Neuere Computer mit AT-, PS / 2- oder USB-Tastaturen ordnen diese Tastaturen normalerweise nur dem alten XT-Code zu, damit der Schlüssel das Leben einfacher macht.

Rohe Tastaturcodes (XT, AT, PS / 2 oder USB) repräsentieren einen physischen Ort auf einer Tastatur. Die XT-Tastatur sendet beim Drücken oder Loslassen einer Taste nur eine einzige 8-Bit-Nummer. Die q-Taste auf einer US / British XT-Tastatur sendet die Nummer 16. Auf einer französischen Tastatur wird dieselbe physische Taste mit a bezeichnet, aber sie sendet immer noch 16. Es sind die höheren Ebenen im Betriebssystem, die ihr eine echte Bedeutung zuweisen. Wenn eine Taste auf einer XT-Tastatur losgelassen wird, wird derselbe Tastencode plus 128 gesendet. In diesem Beispiel wird beim Drücken von q eine 16 gesendet, beim Loslassen jedoch die Nummer 142 (16 + 128). AT-Tastaturen verwenden Scancodes, die aus einer Reihe von Zahlen bestehen und recht lang werden können. Mit Schlüsselfreigaben werden zusätzliche Codes hinzugefügt. Beispielsweise lautet der Scancode für Pause E1, 1D, 45, E1, 9D, C5. Die meisten Betriebssysteme, einschließlich DOS, Windows, Linux, FreeBSD, und das BIOS ordnet alle Scancodes wesentlich einfacheren XT-Scancodes zu. Außerdem wird die Unterstützung neuerer Tastaturen vereinfacht, die unterschiedliche Codes verwenden, z. B. USB-Tastaturen, die HID-Codes senden. Alle Codes werden vom Betriebssystem demselben konsistenten Satz von Codes zugeordnet, bevor X11 oder die Anwendung sie sieht.

X11 kennt diesen Teil des Prozesses nicht. Es erhält lediglich den KEYCODE vom Kernel und wendet seine eigene Zuordnung an, um diesen KEYCODE in einen KEYSYM zu konvertieren. Xmodmap ist das Standardwerkzeug zur Steuerung dieses Mappings. Ein Großteil des Verhaltens der Tastaturbelegung ist konfigurierbar, es gibt jedoch einige Sonderfälle wie die Num-Taste, den Modusschalter und die Feststelltaste / Umschalttaste, die in X11 fest programmiert sind. Andere Aspekte wie Shift sind tatsächlich konfigurierbar. Im Gegensatz zu Mode Switch oder Num Lock kann jede Taste als Umschalttaste zugeordnet werden.

KEYCODEs stellen physische Schlüssel dar, die vom Kernel des Betriebssystems gesendet werden. Jeder KEYCODE kann 8 möglichen KEYSYMs zugeordnet werden. Es werden nur 4 verwendet und manchmal Level 1-4 genannt. Level 1 gibt das KEYSYM an, das gedruckt wird, wenn keine Modifikatoren aktiv sind. Dies sind oft Kleinbuchstaben und Ziffern. Modifikatoren sind KEYCODEs, die das von anderen KEYCODEs generierte KEYSYM ändern, wenn der Modifikator aktiv ist (gedrückt oder eingeschaltet). Modifikatortastencodes werden auch über Xmodmap gesteuert. Level 2 gibt ein KEYSYM an, das gesendet werden soll, wenn der Shift-Modifikator gedrückt wird. Stufe 3 wird immer dann aktiviert, wenn der Modusschalter KEYSYM gedrückt wurde. Stufe 4 wird aktiviert, wenn sowohl eine Umschalttaste als auch ein Modusschalter aktiv sind.

Sobald ein KEYSYM generiert wurde, kann dies direkt interpretiert werden, wird jedoch meistens in Text konvertiert. Nicht alle KEYSYMs werden zu Text oder wirken sich nur auf zukünftige KEYSYMs aus. Ein Beispiel ist natürlich Shift_L, das keine Textdarstellung hat, aber es gibt auch eine Reihe von KEYSYMs, die zum Verfassen eines anderen Zeichens verwendet werden. Eine Liste von ihnen auf meinem System ist unter /usr/share/X11/locale/en_US.UTF-8/Compose. Ein solches Beispiel ist das tote_akute KEYSYM, das beim Drücken versucht, das nächste KEYSYM in einen Buchstaben mit akutem Akzent zu konvertieren. Es gibt eine Standardzuordnung zum Umwandeln von KEYSYMs in Unicode.

Nachdem dies alles gesagt wurde, ist Xmodmap veraltet und durch XKB ersetzt, das viel ausgefeilter ist. Dies wirkt sich darauf aus, wie KEYCODEs auf KEYSYMs abgebildet werden, aber nicht darauf, wie der Kernel KEYCODEs generiert oder wie KEYSYMs in Text konvertiert oder zusammengesetzt werden, der immer noch derselbe ist. XKB kann deaktiviert werden, um das Verhalten von Xmodmap wiederherzustellen. Es hat auch eine Kompatibilitätsebene zur Unterstützung von Xmodmap, aber es kann Probleme geben, da es nicht vollständig kompatibel ist. XKB-Regeln sind unter- /usr/share/X11/xkb/und viel ausgefeilter. Es gibt an anderer Stelle eine gute Dokumentation darüber, wie Tastaturlayouts zum Zuordnen von KEYCODEs zu KEYSYMs generiert werden.

Die Linux-Konsole verfügt über eigene Tastaturlayouts, die /usr/share/keymapsim loadkeysBefehl gespeichert und mit diesem geladen werden . Im BIOS und in früheren Bootloader-Phasen, einschließlich GRUB2, ist die Tastaturzuordnung unabhängig von der Nummer, der das BIOS den Schlüssel zuordnen möchte.


Vielen Dank für die tolle Erklärung und neue Informationen. Wissen Sie, welche Anwendungen während des Startvorgangs gestartet werden (Upstart oder Initscript), wodurch die Entscheidung über die Tastatur getroffen wird und was beim Anmelden in der Phase geschieht, in der ich das Layout auswählen kann? Welches Programm interagiert damit und wo ist es im Dateisystem gespeichert? Nach dem Login überschreibt xmodmap oder xkb das beim Login gewählte Standardlayout?
Xralf

Die Kernel-Keymap wird, wie gesagt, loadkeysvon einem der Init-Skripte geladen . grep loadkeys /etc/init.d/*enthüllt die Datei keymap.sh. X11 verfügt über ein eigenes Keymap, das traditionell von Xmodmap geladen wurde, das über eines der Xsession-Startskripte ausgeführt wird. Heutzutage wird bei Verwendung von XKB anstelle von Xmodmap das Standard-Keymap entweder in Xorg.conf über die verschiedenen Xkb-Optionen oder über HAL festgelegt. Sobald entweder der Gnome- oder der KDE-Anzeigemanager geladen ist, können sie über den setxkbmapBefehl ihr eigenes Layout laden . Die Desktop-Umgebung eines Benutzers kann beim Anmelden auch ein anderes Layout festlegen.
Pinguin359

Ich habe versucht , den Befehl grep loadkeys /etc/init.d/*und locate keymap.shund nichts gefunden wurde. Die Datei Xorg.conf wurde ebenfalls nicht gefunden. Kommt es auf meine Ubuntu-Version an, die 10.04 ist?
Xralf

Welche Art von Ereignis wird das Fenster erhalten? Ein Ereignis mit KEYSYM und anschließend die Anwendung, mit der KEYSYM in Text umgewandelt wird. Auf welche Weise? Bietet Xorg eine IPC / RPC-Schnittstelle, über die Apps KEYSYM in Text konvertieren können? Oder muss die App es alleine machen?
炸鱼 18 德里克
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.