summaryrefslogtreecommitdiff
path: root/windows/neo-vars
diff options
context:
space:
mode:
Diffstat (limited to 'windows/neo-vars')
-rw-r--r--windows/neo-vars/Readme.txt151
1 files changed, 151 insertions, 0 deletions
diff --git a/windows/neo-vars/Readme.txt b/windows/neo-vars/Readme.txt
new file mode 100644
index 0000000..bfc0b3b
--- /dev/null
+++ b/windows/neo-vars/Readme.txt
@@ -0,0 +1,151 @@
+NEO-vars
+========
+
+NEO-vars 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.
+
+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.
+
+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
+Applikation 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.
+
+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.
+
+Ä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.
+
+Mit der Verwendung von Unterprogrammen, sowohl beim Drücken von
+Tasten, als auch bei Composita, eröffnen sich interessante
+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.
+
+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.
+
+Eine 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).
+
+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
+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.
+
+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
+schnell wieder aufgenommen werden.
+
+Auf 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.
+
+Last, 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.
+
+Ü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.
+
+Nur 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.
+
+Wir hatten recht lang ein generelles Performance-Problem, das zur
+Folge hatte, dass hie und da ein Zeichen nicht vom AHK-Skript
+verarbeitet wurde und stattdessen direkt zur Applikation weiter
+gereicht wurde. Dieses Problem ist offenbar auf AHK und dessen
+Funktion SendInput in seiner derzeitigen Version zurückzuführen. Mit
+SendEvent (bzw. »SendMode Event« am Beginn des Skripts) haben wir
+aber keine Probleme mehr, weshalb neo-vars nun auch die offizielle
+AHK-Version ist.
+