Changes between Version 1 and Version 2 of Treiber-Know-How/NeoVars


Ignore:
Timestamp:
23/02/09 03:40:00 (17 years ago)
Author:
Martin
Comment:

Korrektur gelesen

Legend:

Unmodified
Added
Removed
Modified
  • Treiber-Know-How/NeoVars

    v1 v2  
    33NeoVars ist die nunmehr zweite Implementierung des NEO-Tastaturlayouts in der Programmiersprache AutoHotKey (auch AHK), www.autohotkey.com. Statt mit langen if-then-else-Bäumen auf getrennten Key-Hooks arbeitet neo-vars mit einem globalen, für (fast) alle Tasten durchlaufenen Key-Hook (keyhooks.ahk), der nicht nur für key-press sondern auch für key-release (up) verwendet wird.
    44
    5 Der Key-Hook durchläuft die Funktion AllStar (varsfunctions.ahk), in der der Name der gedrückten Taste (PhysKey, dann ActKey) um die aktuelle Ebenennummer erweitert wird und das Ergebnis als Variable abgefragt wird. Diese Variable (gespeichert in char) sagt nun, was sich hinter dem Tastendruck für ein Zeichen (z.B. „U0041“ für ein großes A) oder auch Sonderzeichen (z.B. „SComp“ für Compose), oder auch Unterprogrammaufruf (z.B. „P_EHt“ für das Umschalten des Einhand-Modus) verbirgt. Dieser „Lookup“, den man in „besseren“ Programmiersprachen mit assoziativen Hash-Arrays implementiert, wird in AHK über dynamische Variablenabfragen gemacht, wobei diese Variablen vorher definiert wurden.
     5Der Key-Hook durchläuft die Funktion AllStar (varsfunctions.ahk), in der der Name der gedrückten Taste (PhysKey, dann ActKey) um die aktuelle Ebenennummer erweitert wird und das Ergebnis als Variable abgefragt wird. Diese Variable (gespeichert in char) sagt nun, was sich hinter dem Tastendruck für ein Zeichen (z. B. „U0041“ für ein großes A) oder auch Sonderzeichen (z. B. „SComp“ für Compose), oder auch Unterprogrammaufruf (z. B. „P_EHt“ für das Umschalten des Einhand-Modus) verbirgt. Dieser „Lookup“, den man in „besseren“ Programmiersprachen mit assoziativen Hash-Arrays implementiert, wird in AHK über dynamische Variablenabfragen gemacht, wobei diese Variablen vorher definiert wurden.
    66
    7 Variablen werden aber nicht nur für die Zuweisung Ebene+Taste=Zeichen (keydefinitions.ahk) verwendet, sondern auch für Shortcuts (shortcuts.ahk), die später dazu dienen, aus abstrakten Zeichen wieder von Programmen verwendbare Tastendrücke zu machen: Aus „SHome“ wird beispielsweise über »send« wieder „{Home down}“ für den Tastendruck und „{Home up}“ für das Loslassen. Auch für Buchstaben und Sonderzeichen wird diese Methode verwendet, um größtmögliche Kompatibilität mit normalen Programmen zu gewährleisten. Alles, wofür es keine Shortcuts gibt, wird als unicode-Zeichen an die
     7Variablen werden aber nicht nur für die Zuweisung Ebene+Taste=Zeichen (keydefinitions.ahk) verwendet, sondern auch für Shortcuts (shortcuts.ahk), die später dazu dienen, aus abstrakten Zeichen wieder von Programmen verwendbare Tastendrücke zu machen: Aus „SHome“ wird beispielsweise über »send« wieder „{Home down}“ für den Tastendruck und „{Home up}“ für das Loslassen. Auch für Buchstaben und Sonderzeichen wird diese Methode verwendet, um größtmögliche Kompatibilität mit normalen Programmen zu gewährleisten. Alles, wofür es keine Shortcuts gibt, wird als Unicode-Zeichen an die
    88Applikation geschickt. Ein paar wenige Zeichen können nicht oder nur schwer durch getrennte Down-Up-Sequenzen umgesetzt werden; an diesen Stellen wird auf den getrennten Key-Release verzichtet und das Zeichen bzw. eine dafür notwendige Zeichenfolge über das gute alte »send« geschickt.
    99
    10 Zweiter wichtiger und auch für den Benutzer spürbarer Unterschied zum alten AHK-Skript ist die Unterstützung von Key-Press und -Release (down- und up-events), wodurch z.B. manche Programme erst benützbar werden wie z.B. Spiele, die die Dauer messen, für die eine Taste niedergedrückt ist. Dafür muss sich das Skript aber für jede Taste merken, was es bei einem späteren Release für ein Zeichen schicken muss, damit keine Taste „hängen“ bleibt. Auch diese Informationen werden in Variablen gespeichert, deren Namen mit dem Scancode/Virtualcode der Taste zusammenhängen.
     10Zweiter wichtiger und auch für den Benutzer spürbarer Unterschied zum alten AHK-Skript ist die Unterstützung von Key-Press und -Release (down- und up-events), wodurch z. B. manche Programme erst benutzbar werden, wie z. B. Spiele, die die Dauer messen, für die eine Taste niedergedrückt ist. Dafür muss sich das Skript aber für jede Taste merken, was es bei einem späteren Release für ein Zeichen schicken muss, damit keine Taste „hängen“ bleibt. Auch diese Informationen werden in Variablen gespeichert, deren Namen mit dem Scancode/Virtualcode der Taste zusammenhängen.
    1111
    1212Ähnlich werden Compose-Sequenzen unterstützt: Ist eine Variable definiert, die darauf hinweist, dass die bisherige Sequenz ein Compositum ist, wird dieses dargestellt. Ist eine andere Variable definiert, die sagt, dass bis zu einem fertigen Compositum noch mehr Zeichen kommen können, wird das aktuelle Zeichen nicht ausgegeben und stattdessen dem Compositum angehängt. Die dafür nötigen Variablen werden von einem Extra-Skript aus den definierten Compose-Sequenzen erstellt und als AHK-Code abgespeichert (compose.generated.ahk). Hier ist von Vorteil, dass AHK fast beliebig lange Variablennamen unterstützt.
    1313
    1414Mit der Verwendung von Unterprogrammen, sowohl beim Drücken von Tasten, als auch bei Composita, eröffnen sich interessante
    15 Möglichkeiten, die z.T. noch garnicht ausgeschöpft sind. Ein paar Schmankerln sind aber jetzt schon eingebaut, wofür aber z.T. auch Hooks bemüht werden müssen.
     15Möglichkeiten, die z. T. noch gar nicht ausgeschöpft sind. Ein paar Schmankerln sind aber jetzt schon eingebaut, wofür aber z. T. auch Hooks bemüht werden müssen.
    1616
    17 Erst diese Key-Hooks an mehreren Stellen machen Spezial-Modi möglich: Es gibt einen Physical-Key-Hook, der z.B. für die Implementierung des einhand-Neo verwendet wird (einhandneo.ahk). Er kann unter entsprechenden Nebenbedingungen, wie hier dem Gedrückthalten der Space-Taste, Tastencodes austauschen. Ein weiterer Key-Hook ermöglicht das Abfangen sämtlicher Tastendrücke für z.B. einen Römische-Zahlen-Modus (tools.ahk), um den gewohnten Ablauf zu ändern, um also hier die gedrückten Ziffern als Dezimalzahl zu interpretieren und in die für sie nötigen römischen Zahlen-Buchstaben umzuwandeln. Ähnlich funktioniert auch der generische Unicode-Zeichengenerator über ♫uu.
     17Erst diese Key-Hooks an mehreren Stellen machen Spezial-Modi möglich: Es gibt einen Physical-Key-Hook, der z. B. für die Implementierung des Einhand-Neo verwendet wird (einhandneo.ahk). Er kann unter entsprechenden Nebenbedingungen, wie hier dem Gedrückthalten der Space-Taste, Tastencodes austauschen. Ein weiterer Key-Hook ermöglicht das Abfangen sämtlicher Tastendrücke für z. B. einen Römische-Zahlen-Modus (tools.ahk), um den gewohnten Ablauf zu ändern, um also hier die gedrückten Ziffern als Dezimalzahl zu interpretieren und in die für sie nötigen römischen Zahlen-Buchstaben umzuwandeln. Ähnlich funktioniert auch der generische Unicode-Zeichengenerator über ♫uu.
    1818
    1919Eine weitere Stelle für Hooks ist die Ausgabefunktion, die derzeit für das Decodieren von Unicode-Zeichen verwendet wird: ♫dd und dann ein Zeichen eingeben, das auch über ein Compositum entstanden sein kann, und ein kleiner ToolTip gibt den entsprechenden Unicode-Codepoint aus (tools.ahk).
    2020
    21 Die Bildschirmtastatur (M3+F1) reagiert nunmehr dynamisch auf die verschiedenen aktivierten Ebenen, d.h. mit dem Drücken eines Modifiers wird automatisch die entsprechende Ebene angezeigt, ohne dass man diese manuell wählen müsste. Im CapsLock-Modus funktioniert das noch nicht richtig, da sich dort Buchstaben und Sonderzeichen unterschiedlich verhalten und wir dafür noch zwei zusätzliche PNG-Dateien brauchen. Abgesehen davon gibt es Überlegungen, die Bildschirmtastatur komplett dynamisch zu machen, das heißt, dass man auch die zu erwartenden Compose-Sequenzen sehen kann. Wenn man also
    22 das tote Hochkomma ́ tippt, würde die Bildschirmtastatur für die solcherart unterstützten Tasten die Buchstaben mit Apostroph darstellen. Ob das aber so einfach geht, ist nicht ganz klar: Erstens muss die Ausgabe ausreichend gut ausschauen, zweitens muss die Existenz eines dafür ausgelegten Unicode-Fonts sichergestellt sein, und schließlich muss man die entsprechenden Windows-Funktionen umständlich über DLL-Calls aufrufen, um die AHK-Beschränkung auf die System-Codepage zu überwinden. Ob diese Funktion dann auch die benötigte Performance hat, müsste sich erst weisen.
     21Die Bildschirmtastatur (M3+F1) reagiert nunmehr dynamisch auf die verschiedenen aktivierten Ebenen, d. h. mit dem Drücken eines Modifiers wird automatisch die entsprechende Ebene angezeigt, ohne dass man diese manuell wählen müsste. Im CapsLock-Modus funktioniert das noch nicht richtig, da sich dort Buchstaben und Sonderzeichen unterschiedlich verhalten und wir dafür noch zwei zusätzliche PNG-Dateien brauchen. Abgesehen davon gibt es Überlegungen, die Bildschirmtastatur komplett dynamisch zu machen, das heißt, dass man auch die zu erwartenden Compose-Sequenzen sehen kann. Wenn man also das tote Hochkomma ́ tippt, würde die Bildschirmtastatur für die solcherart unterstützten Tasten die Buchstaben mit Apostroph darstellen. Ob das aber so einfach geht, ist nicht ganz klar: Erstens muss die Ausgabe ausreichend gut ausschauen, zweitens muss die Existenz eines dafür ausgelegten Unicode-Fonts sichergestellt sein, und schließlich muss man die entsprechenden Windows-Funktionen umständlich über DLL-Calls aufrufen, um die AHK-Beschränkung auf die System-Codepage zu überwinden. Ob diese Funktion dann auch die benötigte Performance hat, müsste sich erst erweisen.
    2322
    24 Das AHK-Skript (leider nicht das EXE) bindet jetzt eine eventuell bestehende individuelle Datei aus dem NEO2-Applikationsverzeichnis ein (custom.ahk). Überhaupt sind die Spezialmodi wie EinHand-Neo, Lernmodus und Lang-s-Tastatur in eigene „Module“ ausgelagert worden, die den restlichen Code überhaupt nicht mehr tangieren. Das bedeutet einerseits, dass man sie einfacher warten kann, andererseits auch, dass sie durch diese leicht zu durchschauende Kapselung als Vorlage für individuelle Erweiterungen zur Verfügung stehen. So wäre denkbar, dass man auch die normale Belegung in ein Modul packt, das dann recht einfach und unabhängig vom restlichen Code gewartet werden kann. Auch die etwas eingeschlafene Diskussion über die Tastenbelegung von NEO3 kann über diesen übersichtlichen Mechanismus
    25 schnell wieder aufgenommen werden.
     23Das AHK-Skript (leider nicht das EXE) bindet jetzt eine eventuell bestehende individuelle Datei aus dem NEO2-Applikationsverzeichnis ein (custom.ahk). Überhaupt sind die Spezialmodi wie EinHand-Neo, Lernmodus und Lang-s-Tastatur in eigene „Module“ ausgelagert worden, die den restlichen Code überhaupt nicht mehr tangieren. Das bedeutet einerseits, dass man sie einfacher warten kann, andererseits auch, dass sie durch diese leicht zu durchschauende Kapselung als Vorlage für individuelle Erweiterungen zur Verfügung stehen. So wäre denkbar, dass man auch die normale Belegung in ein Modul packt, das dann recht einfach und unabhängig vom restlichen Code gewartet werden kann. Auch die etwas eingeschlafene Diskussion über die Tastenbelegung von NEO3 kann über diesen übersichtlichen Mechanismus schnell wieder aufgenommen werden.
    2624
    27 Auf kurze Sicht steht eine automatische Tasten-Layout-Generierung auf dem Plan, mit der man über einen Klick die aktuelle
    28 Tastenbelegung aus der Referenz erzeugen kann. Zuvor sollte ein vernünftiges Dateiformat für die Referenz gefunden werden, dann kann mit der Erstellung des Konverters begonnen werden.
     25Auf kurze Sicht steht eine automatische Tasten-Layout-Generierung auf dem Plan, mit der man über einen Klick die aktuelle Tastenbelegung aus der Referenz erzeugen kann. Zuvor sollte ein vernünftiges Dateiformat für die Referenz gefunden werden, dann kann mit der Erstellung des Konverters begonnen werden.
    2926
    3027Last, but not least gehört für die vielen Konfigurationsoptionen ein entsprechender Dialog her. Der Kapselung wegen könnten die einzelnen Module hier separate Dialogboxen oder Tabs erhalten.
    3128
    32 Übrigens stellt neo-vars seine Informationen (z.B. über die Aktivierung des Mod4-Lock) über Tray-Tips dar, die mitunter im
    33 Explorer oder über die Registry aktiviert werden müssen. Diese Einstellung zu ändern, wäre auch ein heißer Kandidat für die
    34 Config-Dialoge.
     29Übrigens stellt neo-vars seine Informationen (z. B. über die Aktivierung des Mod4-Lock) über Tray-Tips dar, die mitunter im Explorer oder über die Registry aktiviert werden müssen. Diese Einstellung zu ändern, wäre auch ein heißer Kandidat für die Config-Dialoge.
    3530
    3631Nur ein kleiner Teil des Codes wurde vom alten Neo-AHK übernommen, darunter die kaum benutzten Keyboard-LEDs und die stark angepassten Unicode-Zeichenausgaben und Ebenenfunktionen. Mittlerweile werden sogar die Modifier über die normalen Keyboard-Hooks geleitet, wodurch man im Prinzip auch diese Zeichen generisch umlegen kann. Einen Strich durch die Rechnung macht uns AHK mit einer recht unflexiblen Handhabung der Alt-Taste, die zwar ge-hookt aber nicht so einfach gesendet werden kann (AHK sendet bona fide automatisch Key-release-Events und simuliert Strg-Tastendrücke). Strg, Win und Konsorten wären hingegen kein Problem.