Am 01.04.2011, 01:08 Uhr, schrieb Navid Zamani
<navid.zam...@googlemail.com>:
Das scheint mir jetzt irgendwie kaum zu machen… (Ausser man könnte
rausfinden, welche Spalte welchem Mod-Zustand zugeordnet wäre. Und
0x80=Mod3 passt da irgendwie garnicht ins Konzept, da es laut „xmodmap
-pm“ 0x20=Mod3 sein müsste… [Ja, hab extra nochmal nachgeschaut ob ich
nix verwechselt hab.] Oder ist ISO_Level5_Shift mod4, obwohl daneben
mod3 steht??)
Das letztere.
Was dich so verwirrt, ist die (mMn schlecht gewählte) Bezeichnung der
Neo-Shift-Tasten Mod3 und Mod4. Die sind nämlich etwas völlig anderes als
die Mod1-5 des X window systems. Neo-Mod4 ist, in die Sprache der
Neo-Xkbmap übersetzt, tatsächlich ISO_Level5_Shift, und das wird vom
Neo-xkb-Treiber auf X-Mod3 gelegt (weil Mod4 schon für die Super-Tasten
vorgesehen ist).
Das ganze ist aber noch weit komplizierter:
Xmodmap ist im Prinzip veraltet. Es wurde schon mit X11R6.1 (1996) durch
die X Keyboard Extension (xkb) ersetzt, die sehr viel flexibler ist.
Xmodmaps unterstützten ursprünglich nur 4 Ebenen: 2 „Gruppen“ mit 2
„Levels“. In der Sprache von X sind das im Prinzip 2 Layouts (klassisches
Beispiel: Englisch und Russisch) mit je zwei Ebenen. Schon eine Belegung
wie das deutsche Qwertz mit 3 Ebenen ist eigentlich nicht so ganz im
ursprünglichen X11 enthalten (man kann aber natürlich die zweite Gruppe
für die AltGr-Zeichen zweckentfremden). Zwischen den Gruppen wird mit
einer Taste umgeschaltet, die auf X11-vor-xkb-Sprache „mode_switch“ heißt.
Zwischen den Levels natürlich mit Shift.
Also, vor 1996 hatte eine Xmodmap maximal 4 Spalten (G=Gruppe, L=Level):
G1L1 G1L2 G2L1 G2L2
Xkb musste damit nun kompatibel bleiben, behält diese Einrichtung also bei.
So erklären sich deine ersten 4 Spalten:
keycode 40 = a A d D […]
a und A ist Neo (das erste Layout), d und D ist Qwertz (DEIN zweites
Layout; bei jemand anderem könnte etwas anderes eingestellt sein). Jeweils
die ersten beiden Level.
xkb lässt nun aber 4 Gruppen zu je max. 256 Levels zu! Eine feste
Zuordnung Spalte ↔ GxLy ist so nicht möglich, wenn man nicht zu jedem
keycode 1024 Spalten haben will (und entsprechend eine Tabelle mit 256K
Einträgen für die 256 möglichen keycodes, 1996 wäre das noch zuviel
Speicherbedarf gewesen…). Also wird jeder Gruppe jeder Taste ein TYP
zugeordnet: Eine Vorschrift, die angibt, welche Modifier welches Level
erzeugen. In Neo-xkb haben die meisten Tasten den (von Neo neu
eingerichteten) Typ „EIGHT_LEVEL_SEMIALPHABETIC“, d.h. Neo definiert 8
Level. Nicht alle davon sind belegt (die 8. Ebene nie, soweit ich weiß).
Xkb stellt aus Kompatibilitätsgründen, aber auch der Praxis wegen (wenn
man einzelne Tasten ummappen möchte, so wie du) auch noch die Xmodmap zur
Verfügung. Die zusätzlichen Ebenen sind in weiteren Spalten (theoretisch
bis zu 1024) angeordnet, und zwar so:
G1L1 G1L2 G2L1 G2L2 <Levels 3-n1 von G1> <Levels 3-n2 von G2> <Levels 1-n3
von G3> <Levels 1-n4 von G4>
(okay, das Mailprogramm unterbricht hier die Zeile, aber ist klar, was ich
meine)
Im von dir angeführten Beispiel:
keycode 40 = a A d D braceleft Greek_alpha Down Down U2200 NoSymbol eth
ETH
a und A sind Neo (Gruppe 1, Levels 1 und 2)
d und D sind Qwertz (Gruppe 2, Levels 1 und 2)
Greek_alpha bis NoSymbol [leer] sind Neo, Levels 3-8 (Gruppe 1)
eth und ETH sind Qwertz (Gruppe 2), so wie es von Linux um zusätzliche
Zeichen erweitert wird (ð auf AltGr+d).
Die komplette aktuelle xkbmap kannst du dir genauer anschauen, indem du
xkbcomp :0 neo.xkb
eingibst und dir dann neo.xkb anguckst. Ist aber lang und unverständlich.
Zu jeder Taste findest du dort aber z.B. die Typen, und weiter oben die
Typdefinitionen. Um die xkbmap wirklich zu verstehen, muss man aber noch
tiefer eindringen (virtuelle Modifier, Kompatibilitätszuordnungen…)
Auf jeden Fall wirst du aber feststellen:
• Verschiedene Tasten haben verschiedene Typen mit unterschiedlichen
Anzahlen von Levels.
• Die gleiche Modifierkombination kann bei unterschiedlichen Tasten
verschiedene Levels erzeugen (wenn der Typ nicht übereinstimmt)
• Je nachdem, ob Neo das erste, zweite, dritte oder vierte Layout ist,
liegen die Levels an verschiedenen Spaltenpositionen in der xmodmap.
Eine einfache Zuordnung 0xa0 → Spalte 9 (die bei dir bei Taste 40
zutrifft) ist also nicht möglich.
OK, das war jetzt mal wirklich lange Rede, kurzer Sinn ;-).
Von dem Neo-xmodmap-Treiber fange ich jetzt nicht noch an, da sind die
Spaltenzuordnungen wieder anders, und Neo-Mod4 heißt da auch nicht
ISO_Level5_Shift (weil ein Level5 nur in der xkbmap definiert werden
kann). Die Situation wird damit noch verschärft.
Für deine Zwecke ergeben sich verschiedene Lösungsansätze:
1) Du könntest die Neo-xmodmap per Skript abwandeln und einlesen. Damit
zerstörst du dir aber z.B. deine schöne Neo+Qwertz-Belegung. Mit dem
xmodmap-Treiber geht sowas nicht.
2) Wenn du bei der Neo-xkbmap bleiben willst, kannst du einfach annehmen,
Neo wäre die erste Gruppe, und die entsprechende Spalten-Zuordnung
vornehmen (Ebene 1+2 = Spalte 1+2, Ebene 3-6 = Spalten 5,7,6,9). Dann
solltest du aber darauf hinweisen.
3) Du könntest nicht die xmodmap, sondern die xkbmap ändern, die du wie
oben per xkbcomp erzeugst. Andersrum kann man nämlich per
xkbcomp neo_verändert.xkb :0
eine xkbmap direkt, ohne Umweg über die Dateien in /usr/share/X11/xkb/,
einlesen. Leider funktioniert das oft nicht, xkbcomp ist ziemlich verbugt.
Bei mir jedenfalls. Für einfache Ersetzungen wird es gehen, aber wenn du
neue Typen definieren oder zuordnen willst (z.B. um die höheren Ebenen der
Pfeiltasten zu belegen o.ä.), würde ich nicht drauf wetten. Bei mir stürzt
bei sowas gerne mal der X-Server ab – aber auch nicht immer und nicht
nachvollziehbar, ich bin noch nicht dahintergekommen, warum.
4) Du könntest die xkb-Dateien in /usr/share/X11/xkb/ ändern. Brauchst
dazu aber Administratorrechte, und für einfache Umbelegungen sollte man
auch nicht mit diesen Dateien rumspielen.
5) Du könntest ein echtes C-Programm schreiben, das auf Xkb-Routinen
zurückgreift, um die Zuordnung Modifier → Spalte zu finden. Die
Einzelheiten findest du in www.x.org/docs/XKB/XKBproto.pdf, übrigens
Pflichtlektüre, wenn du xkb wirklich tief verstehen willst. Nur soviel:
– über XkbGetNames kriegst du raus, welche der 4 Gruppen Neo ist (wenn der
Name „Germany - Neo 2“ lautet – solange wir das nicht ändern…) → Seite 78
– über XkbGetMap kannst du den Typ der Taste rausbekommen, und auch, wie
dieser Typ im Detail aussieht → Seite 66ff.
– schließlich kannst du die entsprechende Spalte selbst berechnen.
Diese Funktionen haben auch Manpages. Die Handhabung ist aber etwas
kompliziert. Weiß nicht, ob es auch einfacher geht.
Das wäre schon ein großes Projekt.
Um xkb in seiner ganzen Allgemeinheit zu handhaben, muss man schon
ziemlich viel investieren. Solange dein Tool also recht einfach bleiben
soll, wirst du immer Einschränkungen haben. Option 1) und 2) (je nach
Treiber) wäre erstmal das einfachste (da hast du auch eine einfache Ebene
→ Spalte-Zuordnung), aber dann kannst du auch nur ein Layout gleichzeitig
benutzen. Option 3) ist allgemeiner, funktioniert aber nicht immer, und
ergibt keine schöne einfache .Xmodmap, die man sich ins Homeverzeichnis
legen kann. Option 5) kann man wohl beliebig allgemein machen, ist aber
mit einem Skript nicht machbar.
So sieht es aus. Meiner bescheidenen Meinung nach.
Gruß,
Peter