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