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

Antwort per Email an