| 23 | | Variablen werden aber nicht nur für die Zuweisung Ebene+Taste=Zeichen |
| 24 | | (keydefinitions.ahk) verwendet, sondern auch für Shortcuts |
| 25 | | (shortcuts.ahk), die später dazu dienen, aus abstrakten Zeichen |
| 26 | | wieder von Programmen verwendbare Tastendrücke zu machen: Aus |
| 27 | | „SHome“ wird beispielsweise über »send« wieder „{Home down}“ für den |
| 28 | | Tastendruck und „{Home up}“ für das Loslassen. Auch für Buchstaben |
| 29 | | und Sonderzeichen wird diese Methode verwendet, um größtmögliche |
| 30 | | Kompatibilität mit normalen Programmen zu gewährleisten. Alles, |
| 31 | | wofür es keine Shortcuts gibt, wird als unicode-Zeichen an die |
| 32 | | Applikation geschickt. Ein paar wenige Zeichen können nicht oder nur |
| 33 | | schwer durch getrennte Down-Up-Sequenzen umgesetzt werden; an diesen |
| 34 | | Stellen wird auf den getrennten Key-Release verzichtet und das |
| 35 | | Zeichen bzw. eine dafür notwendige Zeichenfolge über das gute alte |
| 36 | | »send« geschickt. |
| 37 | | |
| 38 | | Zweiter wichtiger und auch für den Benutzer spürbarer Unterschied |
| 39 | | zum alten AHK-Skript ist die Unterstützung von Key-Press und |
| 40 | | -Release (down- und up-events), wodurch z.B. manche Programme erst |
| 41 | | benützbar werden wie z.B. Spiele, die die Dauer messen, für die eine |
| 42 | | Taste niedergedrückt ist. Dafür muss sich das Skript aber für jede |
| 43 | | Taste merken, was es bei einem späteren Release für ein Zeichen |
| 44 | | schicken muss, damit keine Taste „hängen“ bleibt. Auch diese |
| 45 | | Informationen werden in Variablen gespeichert, deren Namen mit dem |
| 46 | | Scancode/Virtualcode der Taste zusammenhängen. |
| 47 | | |
| 48 | | Ähnlich werden Compose-Sequenzen unterstützt: Ist eine Variable |
| 49 | | definiert, die darauf hinweist, dass die bisherige Sequenz ein |
| 50 | | Compositum ist, wird dieses dargestellt. Ist eine andere Variable |
| 51 | | definiert, die sagt, dass bis zu einem fertigen Compositum noch mehr |
| 52 | | Zeichen kommen können, wird das aktuelle Zeichen nicht ausgegeben |
| 53 | | und stattdessen dem Compositum angehängt. Die dafür nötigen |
| 54 | | Variablen werden von einem Extra-Skript aus den definierten |
| 55 | | Compose-Sequenzen erstellt und als AHK-Code abgespeichert |
| 56 | | (compose.generated.ahk). Hier ist von Vorteil, dass AHK fast beliebig |
| 57 | | lange Variablennamen unterstützt. |
| 58 | | |
| 59 | | Mit der Verwendung von Unterprogrammen, sowohl beim Drücken von |
| 60 | | Tasten, als auch bei Composita, eröffnen sich interessante |
| 61 | | Möglichkeiten, die z.T. noch garnicht ausgeschöpft sind. Ein paar |
| 62 | | Schmankerln sind aber jetzt schon eingebaut, wofür aber z.T. |
| 63 | | auch Hooks bemüht werden müssen. |
| 64 | | |
| 65 | | Erst diese Key-Hooks an mehreren Stellen machen Spezial-Modi |
| 66 | | möglich: Es gibt einen Physical-Key-Hook, der z.B. für die |
| 67 | | Implementierung des einhand-Neo verwendet wird (einhandneo.ahk). Er |
| 68 | | kann unter entsprechenden Nebenbedingungen, wie hier dem |
| 69 | | Gedrückthalten der Space-Taste, Tastencodes austauschen. Ein weiterer |
| 70 | | Key-Hook ermöglicht das Abfangen sämtlicher Tastendrücke für z.B. |
| 71 | | einen Römische-Zahlen-Modus (tools.ahk), um den gewohnten Ablauf zu |
| 72 | | ändern, um also hier die gedrückten Ziffern als Dezimalzahl zu |
| 73 | | interpretieren und in die für sie nötigen römischen |
| 74 | | Zahlen-Buchstaben umzuwandeln. Ähnlich funktioniert auch der |
| 75 | | generische Unicode-Zeichengenerator über ♫uu. |
| 76 | | |
| 77 | | Eine weitere Stelle für Hooks ist die Ausgabefunktion, die derzeit |
| 78 | | für das Decodieren von Unicode-Zeichen verwendet wird: ♫dd und dann |
| 79 | | ein Zeichen eingeben, das auch über ein Compositum entstanden sein |
| 80 | | kann, und ein kleiner ToolTip gibt den entsprechenden |
| 81 | | Unicode-Codepoint aus (tools.ahk). |
| 82 | | |
| 83 | | Die Bildschirmtastatur (M3+F1) reagiert nunmehr dynamisch auf die |
| 84 | | verschiedenen aktivierten Ebenen, d.h. mit dem Drücken eines |
| 85 | | Modifiers wird automatisch die entsprechende Ebene angezeigt, ohne |
| 86 | | dass man diese manuell wählen müsste. Im CapsLock-Modus funktioniert |
| 87 | | das noch nicht richtig, da sich dort Buchstaben und Sonderzeichen |
| 88 | | unterschiedlich verhalten und wir dafür noch zwei zusätzliche PNG- |
| 89 | | Dateien brauchen. Abgesehen davon gibt es Überlegungen, die |
| 90 | | Bildschirmtastatur komplett dynamisch zu machen, das heißt, dass man |
| 91 | | auch die zu erwartenden Compose-Sequenzen sehen kann. Wenn man also |
| 92 | | das tote Hochkomma ́ tippt, würde die Bildschirmtastatur für die |
| 93 | | solcherart unterstützten Tasten die Buchstaben mit Apostroph |
| 94 | | darstellen. Ob das aber so einfach geht, ist nicht ganz klar: |
| 95 | | Erstens muss die Ausgabe ausreichend gut ausschauen, zweitens muss |
| 96 | | die Existenz eines dafür ausgelegten Unicode-Fonts sichergestellt |
| 97 | | sein, und schließlich muss man die entsprechenden Windows-Funktionen |
| 98 | | umständlich über DLL-Calls aufrufen, um die AHK-Beschränkung auf die |
| 99 | | System-Codepage zu überwinden. Ob diese Funktion dann auch die |
| 100 | | benötigte Performance hat, müsste sich erst weisen. |
| 101 | | |
| 102 | | Das AHK-Skript (leider nicht das EXE) bindet jetzt eine eventuell |
| 103 | | bestehende individuelle Datei aus dem NEO2-Applikationsverzeichnis |
| 104 | | ein (custom.ahk). Überhaupt sind die Spezialmodi wie EinHand-Neo, |
| 105 | | Lernmodus und Lang-s-Tastatur in eigene „Module“ ausgelagert worden, |
| 106 | | die den restlichen Code überhaupt nicht mehr tangieren. Das bedeutet |
| 107 | | einerseits, dass man sie einfacher warten kann, andererseits auch, |
| 108 | | dass sie durch diese leicht zu durchschauende Kapselung als Vorlage |
| 109 | | für individuelle Erweiterungen zur Verfügung stehen. So wäre |
| 110 | | denkbar, dass man auch die normale Belegung in ein Modul packt, das |
| 111 | | dann recht einfach und unabhängig vom restlichen Code gewartet |
| 112 | | werden kann. Auch die etwas eingeschlafene Diskussion über die |
| 113 | | Tastenbelegung von NEO3 kann über diesen übersichtlichen Mechanismus |
| 114 | | schnell wieder aufgenommen werden. |
| 115 | | |
| 116 | | Auf kurze Sicht steht eine automatische Tasten-Layout-Generierung |
| 117 | | auf dem Plan, mit der man über einen Klick die aktuelle |
| 118 | | Tastenbelegung aus der Referenz erzeugen kann. Zuvor sollte ein |
| 119 | | vernünftiges Dateiformat für die Referenz gefunden werden, dann kann |
| 120 | | mit der Erstellung des Konverters begonnen werden. |
| 121 | | |
| 122 | | Last, but not least gehört für die vielen Konfigurationsoptionen ein |
| 123 | | entsprechender Dialog her. Der Kapselung wegen könnten die einzelnen |
| 124 | | Module hier separate Dialogboxen oder Tabs erhalten. |
| 125 | | |
| 126 | | Übrigens stellt neo-vars seine Informationen (z.B. über die |
| 127 | | Aktivierung des Mod4-Lock) über Tray-Tips dar, die mitunter im |
| 128 | | Explorer oder über die Registry aktiviert werden müssen. Diese |
| 129 | | Einstellung zu ändern, wäre auch ein heißer Kandidat für die |
| 130 | | Config-Dialoge. |
| 131 | | |
| 132 | | Nur ein kleiner Teil des Codes wurde vom alten Neo-AHK übernommen, |
| 133 | | darunter die kaum benutzten Keyboard-LEDs und die stark angepassten |
| 134 | | Unicode-Zeichenausgaben und Ebenenfunktionen. Mittlerweile werden |
| 135 | | sogar die Modifier über die normalen Keyboard-Hooks geleitet, |
| 136 | | wodurch man im Prinzip auch diese Zeichen generisch umlegen kann. |
| 137 | | Einen Strich durch die Rechnung macht uns AHK mit einer recht |
| 138 | | unflexiblen Handhabung der Alt-Taste, die zwar ge-hookt aber nicht |
| 139 | | so einfach gesendet werden kann (AHK sendet bona fide automatisch |
| 140 | | Key-release-Events und simuliert Strg-Tastendrücke). Strg, Win und |
| 141 | | Konsorten wären hingegen kein Problem. |
| 142 | | |
| 143 | | Wir hatten recht lang ein generelles Performance-Problem, das zur |
| 144 | | Folge hatte, dass hie und da ein Zeichen nicht vom AHK-Skript |
| 145 | | verarbeitet wurde und stattdessen direkt zur Applikation weiter |
| 146 | | gereicht wurde. Dieses Problem ist offenbar auf AHK und dessen |
| 147 | | Funktion SendInput in seiner derzeitigen Version zurückzuführen. Mit |
| 148 | | SendEvent (bzw. »SendMode Event« am Beginn des Skripts) haben wir |
| 149 | | aber keine Probleme mehr, weshalb neo-vars nun auch die offizielle |
| 150 | | AHK-Version ist. |
| 151 | | |