Am 02.05.2011, 17:07 Uhr, schrieb Olaf <yggtr...@googlemail.com>:

Hallo,

ich suche nach einem Weg, für eine Ebene eines Tastaturlayoutes die zu
drückenden Tasten (Modifier) zu identifizieren. Leider kann ich diesen Prozess
bisher nicht vollständig automatisieren.

Hier hab ich die xmodmap und die xkbmap mal grob für jemanden erklärt, der Ähnliches vorhatte:
http://lists.neo-layout.org/pipermail/diskussion/2011-April/018607.html

Die Reihenfolge der Spalten unterscheidet sich hier leider bei verschiedenen
Neo-Versionen. Z.B. (Zeile für die Taste 't')

A) 0x0074 (t)  0x0054 (T)  0x0074 (t)  0x0054 (T)  0x002d (minus)
0x07f4 (Greek_tau) 0xffb6 (KP_6) 0xffb6 (KP_6) 0x08ef (partialderivative)

Dies ist der Xkbmap-Treiber. Die Ebenen sind:
t: 1. Gruppe 1. Ebene (1. Gruppe heißt: 1. Layout, bei mehreren eingestellten)
T: 1. Gruppe 2. Ebene
t: 2. Gruppe 1. Ebene
T: 2. Gruppe 2. Ebene
minus: 1. Gruppe 3. Ebene
Greek_tau: 1. Gruppe 4. Ebene (Nummerierung unterscheidet sich von Neo)
KP_6: 1. Gruppe 5. Ebene
KP_6: 1. Gruppe 6. Ebene
partialderivative: 1. Gruppe 7. Ebene
...: Danach könnten noch weitere Ebenen der anderen Gruppen folgen

B) 0x0074 (t)  0x0054 (T)  0x002d (minus)  0x07f4 (Greek_tau)
   0xffb6 (KP_6) 0xffb6 (KP_6) 0x08ef (partialderivative)

Dies ist der Xmodmap-Treiber. Da sind die Ebenen ganz anders aufgeteilt:
t: 1. Gruppe 1. Ebene
T: 1. Gruppe 2. Ebene
minus: 2. Gruppe 1. Ebene
Greek_tau: 2. Gruppe 2. Ebene
KP_6: 1. Gruppe 3. Ebene
KP_6: 1. Gruppe 4. Ebene
partialderivative: 3. Gruppe 1. Ebene
Der Grund dafür ist, dass man die höheren Ebenen der 1. Gruppe nur per Xkbmap erreichen kann, weil man dafür den „Typ“ der Taste ermitteln muss. Nähere Erläuterungen siehe der Link oben.

Die zweite Gruppe wird über ISO_Next_Group oder mode_switch aktiviert, es gibt auch noch einige weiter (siehe keysymdef.h, Codes 0xfe0·).
Die höheren Ebenen durch Shift, ISO_Level3_Shift und ISO_Level5_Shift.

Das Problem ist, dass das auch anders sein kann. So werden die 2. Ebene der F-Tasten durch Strg+Alt, und bei der Xmodmap die 2. Ebene des Num-Blocks durch aktiviertes Num angesprochen.

Mittels dieser Tabelle kann also bestimmt werden, auf welcher Taste und Ebene
das gewünschte Symbol liegt.
Taste schon, Ebene eben nicht allgemein. Das kommt noch drauf an, wieviel Ebenen die einzelnen Gruppen haben

Doch es ist nicht klar, welche Tasten gedrückt
gehalten werden müssen, um diese Ebene zu selektieren.

Hat jemand eine Idee, wie die Verbindung zwischen Ebenen und Mod-Tasten
ermittelt werden kann?

Da musst du dir nicht die Xmodmap, sondern die Xkbmap angucken. Du bekommst sie mit

xkbcomp :0

Dies erzeugt server-0.xkb. Nicht erschrecken, das ist ein ziemliches Monstrum.

Im Abschnitt »xkb_symbols« gibt es dort zu jeder Taste:
• die Liste der Symbole wie in der Xmodmap, aber aufgeteilt auf Gruppen
• den Typ der Taste, zu jeder Gruppe.

Diesen Typ findest du im Abschnitt »xkb_types« wieder. Dort steht dann irgendwas wie
map[LevelThree+LevelFive] = Level7;
Die 7. Ebene wird also durch virtuelle Modifier namens LevelThree und LevelFive ausgelöst.

LevelThree wird durch ISO_Level3_[Shift,Latch,Lock] ausgelöst, LevelFive durch ISO_Level5_[Shift,Latch,Lock]. Die Tasten↔Modifier-Zuordnung kannst du im »xkb_compat«-Abschnitt nachgucken. Das musst du aber eigentlich nicht automatisieren, weil dieser Abschnitt bei eigentlich allen Layouts gleich ist. Es genügt, wenn du die Zuordnung einmal raussuchst und dann fest verdrahtest.

Wenn du noch alle Tasten raussuchst, die diese keysym ISO_Levelx_Shift usw. dann haben, bist du fertig. Achtung: Zu diesen keysyms gibt es auch interne keycodes, die es auf der Tastatur nicht gibt und die nur für xkb-Interna dienen: <LVL3>, <MDSW>, <ALT>, <META>, <SUPR>, <HYPR>. Die brauchst du nicht.

Das mit den anderen Gruppen ist etwas komplizierter, weil mehrere Tastendrücke von ISO_Group_Shift usw. sich addieren. Das nutzt der Neo-Xmodmap-Treiber aus, um die 3. Gruppe (die Mathe-Ebene) per ISO_Group_Shift+ISO_Group_Shift anzusprechen. Wie du sowas automatisch rausfinden willst, musst du dir selbst überlegen.

Falls du das brauchst, findest du im Abschnitt »xkb_keycodes« noch den Keycode zu z.B. <AC05>.


Diese Vorgehensweise ist sicher etwas schwieriger zu implementieren, als wenn man die Xmodmap benutzt. Ganz allgemeingültig ist sie immer noch nicht, denn mit xkb lassen sich die verrücktesten Sachen anstellen (naja, wenn es nicht soviele Bugs gäbe…). Z.B. kann man nicht nur unter »xkb_compat«, sondern auch bei »xkb_symbols« Modifier auslösen (über actions[Group1] = [ SetMods(…) ] ). Sowas wird aber bei den offiziellen Layouts (zu denen Neo 2 gehört) nicht gemacht, und meistens funktioniert es (eben deshalb…) sowieso nicht richtig.

In einem C-Programm kannst du die ganze Xkbmap auch über die entsprechenden Xkb-Bibliotheksroutinen ermitteln, vor allem XkbGetMap. Die Einzelheiten stehen in www.x.org/docs/XKB/XKBproto.pdf, ab Seite 66, oder auf den Manpages.

Gruß,
Peter

Antwort per Email an