Werte Urlaubstimmungs-Neo-Gemeinde!

Ich habe mich in den vergangenen Monaten gewundert, dass in Excel 2007 mein Dezimalpunkt (oder auch das Dezimalkomma) am Numpad ein wenig bockt, aber nichts weiter unternommen. Jetzt hat’s mir gereicht.

Wenn ich beispielsweise hier einen Text eingebe und am Numpad eins–komma–eins tippe, kommt 1,1 heraus. Sehr schön, mit Komma¹, wie es halt so sein soll laut deutscher Tastaturbelegung. In Excel geht das soweit auch richtig: Zahlen haben ein Komma als Dezimaltrennzeichen und können daher sowohl mit dem Komma auf der Haupttastatur, als auch mit dem Komma auf dem Numpad eingegeben werden. Zusätzlich zur Belegung auf Ebene 1 mit „NumpadDot“ gibt es auf Ebene 3 auch noch das simulierte Komma der Haupttastatur und auf Ebene 2 den simulierten Punkt der Haupttastatur.

Bei mir ist die Sache aber etwas anders: Aufgrund der beruflichen Tätigkeit, 
bin ich auf die Internationalität der Zahlen und des Datums angewiesen,
also habe ich in den „Regions- und Sprachoptionen“ alles auf „Englisch (USA)“ gestellt, natürlich weiterhin mit deutscher Tastaturbelegung, deutschsprachigen Programmen und mit aktiviertem neo-vars. In normalen Applikationen, die sich um diese Regionsoptionen wenig kümmern, wie mein Thunderbird hier, wird aus einem Druck auf das NumPad-Komma auch weiterhin ein Komma und nicht etwa ein Punkt.

Praktischer Weise passt sich Excel an diese Regionsoptionen an und benötigt fortan den Punkt als Zahlen-Komma zur Eingabe, d.h. auf der Haupttastatur muss man das Dezimaltrennzeichen anders tippen als sonst. Tippt man ohne neo-vars bei aktiviertem NumLock das Komma am Numpad, wird dieses automagisch in einen Punkt verwandelt! Hat man hingegen neo-vars aktiviert, kommt merkwürdiger Weise ein widersinniges Komma heraus, und die solcherart eingegebenen Zahlen können von Excel nicht verwendet werden. Man muss dann entweder den Punkt der Haupttastatur drücken, oder auf eine der Unterebenen (genauer: Ebene 2) von NumPadDot ausweichen.

Scheinbar funktioniert diese Automatik in Excel nur, wenn tatsächlich das NumLock aktiv ist, und hier hakt es mit neo-vars: Der NumLock wird nur emuliert und ist für das System abgeschaltet. Tatsächlich haben wir aber so etwas wie einen aktivierten NumLock, nur dass man ihn bei Neo nicht deaktivieren kann/soll.

Eine Möglichkeit scheint nun zu sein, beim Start von neo-vars den NumLock-State nicht zu deaktivieren, sondern zu aktivieren. Bingo, das Komma wird richtig von Excel in einen Punkt verwandelt! Haken an der Sache ist, dass dann die Ebene 2 des Numpad nicht mehr funktioniert, da hier irgendein Schlitzohr in der Kette zwischen meinen Fingerkuppen und dem AHK die Keycodes austauscht. Nehmen wir weiter die Komma-Taste am Numpad und blicken auf die Tastencodes, die ohne neo-vars so durch den AHK rauschen:

NumLock off, Druck auf NumpadDot:
2E  053         d       1.84    KOMMA (ZEHNERTASTATUR)  
2E  053         u       0.05    KOMMA (ZEHNERTASTATUR)  

NumLock off, Druck auf Shift+NumpadDot:
A0  02A         d       1.61    UMSCHALT        
2E  053         d       0.13    KOMMA (ZEHNERTASTATUR)  
2E  053         u       0.05    KOMMA (ZEHNERTASTATUR)  
A0  02A         u       0.16    UMSCHALT        


NumLock on, Druck auf NumpadDot:
6E  053         d       4.39    KOMMA (ZEHNERTASTATUR)  
6E  053         u       0.08    KOMMA (ZEHNERTASTATUR)  

NumLock on, Druck auf Shift+NumpadDot:
A0  02A         d       0.14    UMSCHALT        
A0  02A         u       0.22    UMSCHALT        
2E  053         d       0.00    KOMMA (ZEHNERTASTATUR)  
2E  053         u       0.08    KOMMA (ZEHNERTASTATUR)  
A0  02A         d       0.00    UMSCHALT        
A0  02A         u       0.14    UMSCHALT        

Aha! Ohne NumLock entsteht der Scancode 2E (Entfernen), mit NumLock entsteht normaler Weise 6E (NumPadDot). Aber wehe, man hält im NumLock-Modus vor NumpadDot eine Shift-Taste gedrückt: Dann wird dieses unmittelbar vor dem Druck des Komma irgendwie deaktiviert (also virtuell losgelassen) und der andere Scancode 2E, also der für Entfernen, geschickt!

Anders ausgedrückt: das Shift erscheint deaktiviert, obwohl es gedrückt ist, also erscheint Ebene 2 wie Ebene 1 (nur mit anderem Scancode), Ebene 5 wie Ebene 3 (ebenfalls mit anderem Scancode), und Ebene 7 wie Ebene 4. Ein echter Krampf. Vielleicht ist die AHK-Version von Neo auch deshalb nicht im NumLock-Modus implemetiert worden …

Ich habe nun großräumig gefixt: Erstens wird der NumLock beim Start von Neo _aktiviert_. Zweitens werden die beiden SCxxVKyyy-Varianten einer NumPad-Taste eindeutig den unterschiedlichen Zuständen der Shifttaste zugeordnet: Wird bspw. SC6EVK053 empfangen, kann das bei NumLock=on nur _ohne_ Shift-Taste erfolgt sein, umgekehrt deutet ein SC2EVK063 auf ein gedrücktes (aber virtuell losgelassenes!) Shift hin.

Drittens wird der Ebene 4 bei gedrücktem Shift ein spezieller Keycode zugewiesen, der in der Ausgaberoutine abfrägt, ob Shift nun künstlich gedrückt werden muss (doshift), weil es ja offenbar gedrückt aber virtuell losgelassen wurde. Damit sollte z.B. Shift+M4+Num4 == Shift-Left zum Markieren auch wieder funktionieren. Ähnlich musste ich bereits bei so Zeichen wie Shift+7=€ vorgehen: Hier muss ich vor dem Senden von € als AltGr+e das Shift virtuell loslassen (unshift), damit der Tastaturtreiber überhaupt etwas damit anfangen und diesen Tastendruck in das €-Zeichen umwandeln kann².

Unshift und Doshift werden nun gleichermaßen über – wie sollte es anders sein – entsprechende Variablen gesteuert: »UNSHxxxxxxx := 1« erzwingt das Loslassen jeglichen Shifts vor dem Senden dieses Zeichens, und sein neues Spiegelbild »DOSHxxxxxxx := 1« erzwingt das Setzen eines noch nicht gesetzten Shift.

Ich bitte Euch um rege Anteilnahme :-) und natürlich um ausgiebiges Testen des neuen/alten Modus des Navigationsblocks in der neuen Version ab r1903. Ich generiere vorläufig kein neo20.exe und bitte um den Test mit AHK direkt.

– Mœsivars

1: Wir Ösis sagen zwar zum Satzzeichen-Komma zumeist „Beistrich“, für den 
Dezimaltrenner darf’s dann aber doch der Begriff „Komma“ sein.
2: Alternativ hätte man es natürlich auch als Sonderzeichen mit SendUnicodeChar 
einbringen können, aber das hat insgesamt eine Kompatibilität < 100%.

Attachment: signature.asc
Description: OpenPGP digital signature

Antwort per Email an