[Neo] Programmierung/Linux - Verbindung von Ebene zu Modifier automatisch ermittelbar?

2011-05-02 Diskussionsfäden Olaf
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.

Ziel ist es für einen Symbol aus keysymdef.h (Z.B. XK_t, XK_tau ) die 
zu drückende Taste und zu drückenden Modifier auf der Tastatur zu ermitteln.


Bisher gehe ich wie folgt vor:

1. Erzeugung der Tabelle (xmodmap -pk), die jeder Taste (keycode) eine Liste 
von Symbolen (keysym) zuordnet. 

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)

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

Mittels dieser Tabelle kann also bestimmt werden, auf welcher Taste und Ebene 
das gewünschte Symbol liegt. Doch es ist nicht klar, welche Tasten gedrückt 
gehalten werden müssen, um diese Ebene zu selektieren.


2. Für jeden Modifier (keysym) kann eine Taste ermittelt werden, die ihn 
auslöst. (xmodmap -pm) Auch diese Werte hängen von der verwendeten Neo-Version 
ab.

Beispielausgabe:
shift   Shift_L (0x32),  Shift_R (0x3e)
lockShift_L (0x32)
control Control_L (0x25),  Control_R (0x69)
mod1Alt_L (0x40),  Meta_L (0xcd)
mod2BadKey (0xcf)
mod3ISO_Level5_Shift (0xcb)
mod4Super_L (0x85),  Super_R (0x86),  Super_L (0xce)
mod5ISO_Level3_Shift (0x33),  ISO_Level3_Shift (0x5c)

Jetzt benötige ich aber noch die Information, welche Modifier-Kombination mit 
welcher Ebene des Tastaturlayouts assoziiert werden muss. Derzeit gebe ich 
die Verbindung manuell vor, aber leider musste ich feststellen, dass ich auf 
drei Systeme jeweils eine andere Konfiguration nutzen musste...


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



Vielen Dank
Olaf






Re: [Neo] Programmierung/Linux - Verbindung von Ebene zu Modifier automatisch ermittelbar?

2011-05-02 Diskussionsfäden Peter Eberhard

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