root/windows/autohotkey/neo20.ahk @ 744

Revision 744, 93.0 KB (checked in by stmayer, 5 years ago)

AHK: Mod4+d NumpadKomma gibt es nicht, korrigiert

Line 
1/*
2*******************************************
3WICHTIGE WARNUNG:
4
5Dies ist inzwischen eine automatisch generierte
6Datei! Sie wird regelm��ig �berschrieben und
7sollte deshalb nicht mehr direkt bearbeitet werden!
8
9Alle weiterf�hrende Informationen finden sich im Abschnitt
10== Hinweise f�r Entwickler ==
11in der Datei README.txt! 
12*******************************************
13*/
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31/*
32*******************************************
33Das war die letzte WARNUNG, ich hoffe nur dass
34sie wirklich wissen was sie hier tun wollen ...
35*******************************************
36*/
37
38
39/*
40*************************************
41* NEO 2.0 (beta) Autohotkey-Treiber *
42*************************************
43Autoren:
44Stefan Mayer <stm (at) neo-layout. o r g>
45Nora Geissler <nora_geissler (at) yahoo. d e>
46Matthias Berg <neo (at) matthias-berg. e u>
47Martin Roppelt <m.p.roppelt (at) web. d e>
48Dennis Heidsiek <HeidsiekB (at) aol. c o m>
49Matthias W�chter <matthias (at) waechter.. w i z .. a t>
50...
51
52
53
54*********
55* TODO: *
56*********
57- Die Bildschirmtastatur mit Mod4 hat den Mod4-Lock deaktiviert!
58- Compose vollst�ndig implementieren (Welche Methode ist hierzu am besten geeignet?)
59- ausgiebig testen... (besonders Vollst�ndigkeit bei Deadkeys)
60- Bessere L�sung f�r das Leeren von PriorDeadKey finden, damit die Sondertasten nicht mehr abgefangen werden m�ssen.
61- Testen, ob die Capslockl�sung (siehe *1:: ebene 1) auch f�r Numpad gebraucht wird
62- Die Ebenen vom Tastenblock an die neue Referenz anpassen (wenn da ein Konsens gefunden wurde)
63
64
65**********
66* IDEEN: *
67**********
68- Tastatur-Reset: mod4+escape (oder ev. ein anderer Hotkey) soll die Tastatur wieder in den Normalzustand versetzen (d.h. alle Ebenen unlocken und Einhand, Lang-s oder Sonstwelche-Modi deaktivieren)
69- Die Varianten (lernModus, einHandNeo, Lang-s-Tastatur, Qwertz/pausieren) sollten einheitlich (de-)aktiviert werden, etwa �ber Mod4 F9-F12
70- bei Ebene 4 rechte Hand (Numpad) z.B. Numpad5 statt 5 senden
71
72
73
74******************
75* CHANGEHISTORY: *
76******************
77
78Revision 744 (von Stefan Mayer)
79- Ebene4-Ziffernblock: auf neo_d nun Komma (wie Referenz), "NumPadKomma" gibt es nicht
80Revision 743 (von Matthias W�chter, commited von Stefan Mayer)
81- Ebene4-Ziffernblock: NumPadAdd und NumPadSub korrigiert
82Revision 740 (von Matthias W�chter, commited von HCW)
83- "Mega-Patch" (Skript verk�rzt, Ebenenabfrage ver�ndert, ...), siehe CHANGES.txt
84Revision 728 (von Dennis Heidsiek):
85- Ist die Datei [...]\Anwendungsdaten\NEO2\NEO2.ini vorhanden, werden dort eventuell vonhandene Werte f�r die Globalen Schalter beim Start �bernommen
86Revision 707 (von Dennis Heidsiek):
87- Die Resourcen-Dateien (PNGs, ICOs) werden nun nach "Von Windows vorgegebenes TEMP Verzeichnis\NEO2\ extrahiert und nicht mehr in das Verzeichnis, in dem sich die EXE befindet
88- Die doppelten franz�sischen Anf�hrungszeichen werden nun ebenfalls �ber SendUnicodeChar gesendet
89Revision 694 (von Martin Roppelt):
90- LangSTastatur auf F11 (Ebene 4)
91- Entwickler k�nnen durch das Erstellen einer Datei �LangSTastaturStandardm��igEingeschaltet.ahk� mit dem Inhalt �LangSTastatur := 1� diese standardm��ig aktivieren
92- Mehrere DeadKeys aktualisiert (T*, Ebene 4 und T*, Ebene 5)
93Revision 687 (von Dennis Heidsiek):
94- Die SendUnicodeChar-Methode um den GDK-Workarround von Matthias W�chter erg�nzt
95- (An/Aus) Icons an Favicon der neuen Homepage angepasst
96Revision 645 (von Martin Roppelt):
97- Ellipse zus�tzlich auf M3+x;
98- Lang-s-Tastatur probeweise auf M4+Esc
99Revision 640 (von Dennis Heidsiek):
100- Der untote Zirkumflex (^) auf Ebene 3 funktioniert jetzt auch in Java-Programmen
101Revision 639 (von Martin Roppelt):
102- Lang-s-Tastatur kann nicht mehr durch einen Hotkey aktiviert werden
103Revision 629 (von Martin Roppelt):
104- Spitze Klammern (bra und ket) testweise auf M5+8/9
105Revision 624 (von Martin Roppelt):
106- Lang-s-Tastatur (ein- und auszuschalten durch Mod4+�)
107Revision 616 (von Dennis Heidsiek):
108- Der nicht funktionierende Mod5-Lock-Fix wurde wieder entfernt, da er sogar neue Fehler produzierte.
109Revision 615 (von Dennis Heidsiek):
110- Erfolgloser Versuch, den Mod4-Lock wiederherzustellen (durch eine Tilde vor den Scancodes der Bildschirmtastatur).
111- Rechtschreibfehler korrigiert.
112- Zwei AHK-Links eingef�gt.
113Revision 609 (von Dennis Heidsiek):
114- Vorl�ufiger Abschluss der AHK-Modularisierung.
115- Bessere Testm�glichkeit �All.ahk� f�r AHK-Entwickler hinzugef�gt, bei der sich die Zeilenangaben in Fehlermeldungen auf die tats�chlichen Module und nicht auf das gro�e �vereinigte� Skript beziehen.
116Revision 608 (von Martin Roppelt):
117- Rechtschreibfehler korrigiert und Dateinamen aktualisiert und sortiert.
118Revision 590 (von Dennis Heidsiek):
119- Erste technische Vorarbeiten zur logischen Modularisierung des viel zu lange gewordenen AHK-Quellcodes.
120- Neue Batch-Datei Build-Update.bat zur einfachen Aktualisierung der EXE-Datei
121Revision 583 (von Dennis Heidsiek):
122- Kleinere Korrekturen (Mod3+Numpad5, Mod5+Numpad5 und Mod3+Numpad9 stimmen wieder mit der Referenz �berein).
123Revision 580 (von Matthias Berg):
124- Bildschirmtastatur jetzt mit Mod4+F* statt Strg+F*, dies deaktiviert jedoch leider den Mod4-Lock
125Revision 570 (von Matthias Berg):
126- Hotkeys f�r einHandNeo und lernModus durch entsprechende ScanCodes ersetzt
127Revision 568 (von Matthias Berg):
128- Sonderzeichen, Umlaute, z und y durch ScanCodes ersetzt
129  * jetzt wird auch bei eingestelltem US Layout Neo verwendet. (z.B. f�r Chinesische InputMethodEditors)
130  * rechter Mod3 geht noch nicht bei US Layout (weder ScanCode noch "\")
131Revision 567 (von Dennis Heidsiek):
132- Aktivierter Mod4 Lock wird jetzt �ber die Rollen-LED des Keybord angezeigt (analog zu CapsLock), die NUM-LED beh�lt ihr bisheriges Verhalten
133- Neue Option im Skript: UseMod4Light
134Revision 561 (von Matthias Berg):
135- Ebene 4 Tab verh�lt sich jetzt wie das andere Tab dank "goto neo_tab"
136Revision 560 (von Dennis Heidsiek):
137- Neue Option im Skript: bildschirmTastaturEinbinden bindet die PNG-Bilder der Bildschirmtastur mit in die exe-Datei ein, so dass sich der Benutzer nur eine Datei herunterladen muss
138Revision 559 (von Matthias Berg):
139- Shift+Alt+Tab Problem gel�st (muss noch mehr auf Nebeneffekte getestet werden)
140Revision 558 (von Matthias Berg):
141- Icon-Bug behoben
142  * Hotkeys d�rfen nicht vor der folgenden Zeile stehen:
143   "menu, tray, icon, neo.ico,,1"
144- lernModus-Konfigurations-Bug behoben: or statt and(not)
145- Ein paar leere Else-F�lle eingebaut (Verst�ndlichkeit, m�gliche Compilerprobleme vermeiden)   
146Revision 556 (von Matthias Berg):
147- lernModus (an/aus mit Strg+Komma)
148  * im Skript konfigurierbar
149  * Schaltet z.B. Qwertz Tasten aus, die es auf der 4. Ebene gibt (Return, Backspace,...)
150  * Kann auch Backspace und/oder Entfernen der 4. Ebene ausschalten (gut zum Lernen richtig zu schreiben)
151- Bug aufgetaucht: Icons werden nicht mehr angezeigt
152Revision 544 (von Stefan Mayer):
153- ,.:; auf dem Mod4-Ziffernblock an die aktuelle Referenz angepasst
154- Versionen von rho, theta, kappa und phi an die aktuelle Referenz angepasst
155Revision 542 (von Matthias Berg):
156- bei EinHandNeo ist jetzt Space+y auch Mod4
157- AltGr-Bug  hoffentlich wieder behoben. Diesmal mit extra altGrPressed Variable
158- nurEbenenFuenfUndSechs umbenannt in ahkTreiberKombi und auf Ebene 4 statt 5 und 6 ge�ndert
159Revision 540 (von Matthias Berg):
160- stark �berarbeitet um Wartbarkeit zu erh�hen und Redundanz zu veringern
161- nurEbenenFuenfUndSechs sollte nun auch auf Neo Treiber statt Qwertz laufen
162  * aber es muss noch jemand testen
163  * Problem: was kann man abfangen, wenn eine tote Taste gedr�ckt wird
164- einHandNeo:
165  * An-/Ausschalten mit STRG+Punkt
166  * Buchstaben der rechten Hand werden mit Space zur linken Hand
167  * Nebeneffekt: es gibt beim Festhalten von Space keine wiederholten Leerzeichen mehr
168Revision 532 (von Matthias Berg):
169- BildschirmTastatur
170  * aktiviert mit strg+F1 bis 7 schaltet Keyboard ein oder aus
171  * strg+F7 zeigt die zuletzt angezeigte Ebene an (und wieder aus).
172  * strg+F8 schaltet AlwaysOnTop um   
173Revision 529 (von Stefan Mayer):
174- Icon wird automatisch geladen, falls .ico-Dateien im selbem Ordner
175- in der .exe sind die .ico mitgespeichert und werden geladen
176Revision 528 (von Matthias Berg):
177- Neo-Icon
178- Neo-Prozess jetzt automatisch auf hoher Prioritaet
179  (siehe globale Schalter)
180- Mod3-Lock (nur wenn rechtes Mod3 zuerst gedr�ckt wird, andere L�sung f�hrte zum Caps-Bug)
181- Mod4-Lock (nur wenn das linke Mod4 zuerst gedr�ckt wird, andere L�sung f�hte zum AltGr-Bug)
182- Ein paar falsche Zeichen korrigiert
183Revision 527 (von Matthias Berg):
184- AltGr Problem hoffentlich behoben
185- Umschalt+Mod4 Bug behoben
186Revision 526 (von Matthias Berg):
187- Ebenen 1 bis 4 ausschalten per Umschalter siehe erste Codezeile nurEbenenFuenfUndSechs = 0
188- Mod4-Lock durch Mod4+Mod4
189- EbenenAktualisierung neu geschrieben
190- Ebene 6 �ber Mod3+Mod4
191- Ebenen (besonders Matheebene) an Referenz angepasst (allerdings kaum um Ebenen 1&2 gek�mmert, besonders Compose k�nnte noch �berholt werden)
192Revision 525 (von Matthias Berg):
193- Capslock bei Zahlen und Sonderzeichen ber�cksichtigt
194Revision 524 (von Matthias Berg):
195- umgekehrtes ^ f�r o, a, �,i  sowie f�r die grossen vokale ( 3. ton chinesisch)
196  � damit wird jetzt PinYin vollst�ndig unterst�tzt caron, macron, akut, grave auf uiaeo�
197- Sonderzeichen senden wieder blind -> Shortcuts funktionieren, Capslock ist leider Shiftlock
198Revision 523 (von Matthias Berg):
199- CapsLock geht jetzt auch bei allen Zeichen ('send Zeichen' statt 'send {blind} Zeichen')
200- vertikale Ellipse eingebaut
201- Umschalt+Umschalt f�r Capslock statt Mod3+Mod3
202- bei Suspend wird jetzt wirklich togglesuspend aufgerufen (auch beim aktivieren per shift+pause)
203Revsion 490 (von Stefan Mayer):
204- SUBSCRIPT von 0 bis 9 sowie (auf Ziffernblock) + und -
205  � auch bei Ziffernblock auf der 5. Ebene
206- Kein Parsen �ber die Zwischenablage mehr
207- Vista-kompatibel
208- Compose-Taste
209  � Br�che (auf Zahlenreihe und Hardware-Ziffernblock)
210  � r�mische Zahlen
211  � Ligaturen und Copyright
212
213
214
215*/
216
217
218
219
220
221/********************
222 Verzeichnisse      *
223*********************
224*/
225; Setzt den Pfad zu einem tempor�ren Verzeichnis
226EnvGet, WindowsEnvTempFolder, TEMP
227ResourceFolder = %WindowsEnvTempFolder%\NEO2
228FileCreateDir, %ResourceFolder%
229
230; Setzt den Pfad zu den NEO-Anwendungsdateien
231EnvGet, WindowsEnvAppDataFolder, APPDATA
232ApplicationFolder = %WindowsEnvAppDataFolder%\NEO2
233FileCreateDir, %ApplicationFolder%
234
235
236
237/******************
238 Globale Schalter *
239*******************
240*/
241
242; Im folgenden gilt (soweit nicht anders angegeben) Ja = 1, Nein = 0:
243; Syntaxhinweis: IniRead, Variable, InputFilename, Section, Key [, DefaultValue]
244
245
246; Sollen die Bilder f�r die Bildschirmtastatur in die compilierte EXE-Datei miteingebunden werden? (Nachteil: gr�ssere Dateigr�sse, Vorteil: Referenz f�r Anf�nger stets einfach verf�gbar)
247bildschirmTastaturEinbinden := 1
248
249; Sollen Ebenen 1-4 ignoriert werden (kann z.B. vom dll Treiber �bernommen werden)?
250IniRead, ahkTreiberKombi, %ApplicationFolder%\NEO2.ini, Global, ahkTreiberKombi, 0
251
252; Soll der Treiber im Einhandmodus betrieben werden?
253IniRead, einHandNeo, %ApplicationFolder%\NEO2.ini, Global, einHandNeo, 0
254
255; Soll der Lernmodus aktiviert werden?
256IniRead, lernModus, %ApplicationFolder%\NEO2.ini, Global, lernModus, 0
257
258; Aktivierter Mod4-Lock wird �ber die Rollen-LED des Keybord angezeigt (analog zu CapsLock)
259IniRead, UseMod4Light, %ApplicationFolder%\NEO2.ini, Global, UseMod4Light, 1
260
261; Soll Lang-s auf s, s auf � und � auf Mod3+� gelegt (bzw. vertauscht) werden?
262IniRead, LangSTastatur, %ApplicationFolder%\NEO2.ini, Global, LangSTastatur, 0
263
264
265
266/*************************
267 Recourcen-Verwaltung    *
268**************************
269*/
270
271
272if(FileExist("ResourceFolder") <> false) {
273        ; Versuche, alle m�glicherweise in die EXE eingebundenen Dateien zu extrahieren
274        FileInstall, neo.ico, %ResourceFolder%\neo.ico, 1
275        FileInstall, neo_disabled.ico, %ResourceFolder%\neo_disabled.ico, 1
276        iconBenutzen = 1
277        if (bildschirmTastaturEinbinden==1) {
278                FileInstall, ebene1.png, %ResourceFolder%\ebene1.png, 1
279                FileInstall, ebene2.png, %ResourceFolder%\ebene2.png, 1
280                FileInstall, ebene3.png, %ResourceFolder%\ebene3.png, 1
281                FileInstall, ebene4.png, %ResourceFolder%\ebene4.png, 1
282                FileInstall, ebene5.png, %ResourceFolder%\ebene5.png, 1
283                FileInstall, ebene6.png, %ResourceFolder%\ebene6.png, 1
284                zeigeBildschirmTastatur = 1
285        }
286} else {
287        MsgBox, "Das Verzeichnis %ResourceFolder% konnte nicht angelegt werden!" ; Diese Zeile dient nur der eventuellen Fehlersuche und sollte eigentlich niemals auftauchen.
288}
289
290; Benutze die Dateien auch dann, wenn sie eventuell im aktuellen Verzeichnis vorhanden sind
291if ( FileExist("ebene1.png") && FileExist("ebene2.png") && FileExist("ebene3.png") && FileExist("ebene4.png") && FileExist("ebene5.png") && FileExist("ebene6.png") )
292  zeigeBildschirmTastatur = 1
293if ( FileExist("neo.ico") && FileExist("neo_disabled.ico") )
294  iconBenutzen = 1
295
296
297/*************************
298 lernModus Konfiguration *
299 nur relevant wenn       *
300 lernModus = 1           *
301 Strg+Komma schaltet um  *
302**************************
303*/
304; 0 = aus, 1 = an
305
306
307; die Nachfolgenden sind n�tzlich um sich die Qwertz-Tasten abzugew�hnen, da alle auf der 4. Ebene vorhanden.
308lernModus_std_Return = 0
309lernModus_std_Backspace = 0
310lernModus_std_PgUp = 0
311lernModus_std_PgDn = 0
312lernModus_std_Einf = 0
313lernModus_std_Entf = 0
314lernModus_std_Pos0 = 0
315lernModus_std_Ende = 0
316lernModus_std_Hoch = 0
317lernModus_std_Runter = 0
318lernModus_std_Links = 0
319lernModus_std_Rechts = 0
320lernModus_std_ZahlenReihe = 0
321
322
323
324; im folgenden kann man auch noch ein paar Tasten der 4. Ebene deaktivieren
325; n�tzlich um sich zu zwingen, richtig zu schreiben
326lernModus_neo_Backspace = 0
327lernModus_neo_Entf = 1
328
329
330 
331
332; aus Noras script kopiert:
333
334Process,Priority,,High
335
336#usehook on
337#singleinstance force
338#LTrim
339  ; Quelltext kann einger�ckt werden,
340  ; msgbox ist trotzdem linksb�ndig
341
342SetTitleMatchMode 2
343SendMode Input 
344
345name    = Neo 2.0
346enable  = Aktiviere %name%
347disable = Deaktiviere %name%
348
349; �berpr�fung auf deutsches Tastaturlayout
350; ----------------------------------------
351
352regread, inputlocale, HKEY_CURRENT_USER, Keyboard Layout\Preload, 1
353regread, inputlocalealias, HKEY_CURRENT_USER
354     , Keyboard Layout\Substitutes, %inputlocale%
355if inputlocalealias <>
356   inputlocale = %inputlocalealias%
357if inputlocale <> 00000407
358{
359   suspend   
360   regread, inputlocale, HKEY_LOCAL_MACHINE
361     , SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%inputlocale%
362     , Layout Text
363   msgbox, 48, Warnung!,
364     (
365     Nicht kompatibles Tastaturlayout:   
366     `t%inputlocale%   
367     `nDas deutsche QWERTZ muss als Standardlayout eingestellt 
368     sein, damit %name% wie erwartet funktioniert.   
369     `n�ndern Sie die Tastatureinstellung unter
370     `tSystemsteuerung   
371     `t-> Regions- und Sprachoptionen   
372     `t-> Sprachen
373     `t-> Details...   `n
374     )
375   exitapp
376}
377
378
379
380; Men� des Systray-Icons
381; ----------------------
382
383if (iconBenutzen)
384   menu, tray, icon, %ResourceFolder%\neo.ico,,1
385menu, tray, nostandard
386menu, tray, add, �ffnen, open
387   menu, helpmenu, add, About, about
388   menu, helpmenu, add, Autohotkey-Hilfe, help
389   menu, helpmenu, add
390   menu, helpmenu, add, http://&autohotkey.com/, autohotkey
391   menu, helpmenu, add, http://www.neo-layout.org/, neo
392menu, tray, add, Hilfe, :helpmenu
393menu, tray, add
394menu, tray, add, %disable%, togglesuspend
395menu, tray, default, %disable%
396menu, tray, add
397menu, tray, add, Edit, edit
398menu, tray, add, Reload, reload
399menu, tray, add
400menu, tray, add, Nicht im Systray anzeigen, hide
401menu, tray, add, %name% beenden, exitprogram
402menu, tray, tip, %name%
403
404
405/*
406   Variablen initialisieren
407*/
408
409DeadKey = ""
410CompKey = ""
411PriorDeadKey = ""
412PriorCompKey = ""
413Ebene12 = 0
414EbeneAktualisieren()
415
416
417 
418
419
420/*
421   EinHandNeo
422*/
423spacepressed := 0
424keypressed:= 0
425
426; Reihe 1
427gespiegelt_7 = neo_6
428gespiegelt_8 = neo_5
429gespiegelt_9 = neo_4
430gespiegelt_0 = neo_3
431gespiegelt_strich = neo_2
432gespiegelt_tot2 = neo_1
433
434; Reihe 2
435gespiegelt_k = neo_w
436gespiegelt_h = neo_c
437gespiegelt_g = neo_l
438gespiegelt_f = neo_v
439gespiegelt_q = neo_x
440gespiegelt_sz = neo_tab
441gespiegelt_tot3 = neo_tot1
442
443; Reihe 3
444gespiegelt_s = neo_o
445gespiegelt_n = neo_e
446gespiegelt_r = neo_a
447gespiegelt_t = neo_i
448gespiegelt_d = neo_u
449
450; Reihe 4
451gespiegelt_b = neo_z
452gespiegelt_m = neo_p
453gespiegelt_komma = neo_�
454gespiegelt_punkt = neo_�
455gespiegelt_j = neo_�
456
457
458
459
460/*
461   ------------------------------------------------------
462   Modifier
463   ------------------------------------------------------
464*/
465
466
467;LShift+RShift == CapsLock (simuliert)
468; Es werden nur die beiden Tastenkombinationen abgefragt,
469; daher kommen LShift und RShift ungehindert bis in die
470; Applikation. Dies ist aber merkw�rdig, da beide Shift-
471; Tasten nun /modifier keys/ werden und, wie in der AHK-
472; Hilfe beschrieben, eigentlich nicht mehr bis zur App
473; durchkommen sollten.
474
475VKA1SC136 & VKA0SC02A:: ; RShift, dann LShift
476VKA0SC02A & VKA1SC136:: ; LShift, dann RShift
477;
478; mit diesen funktioniert das automatische �bernehmen der
479; gedr�ckten Shift-Tasten nicht, also z.B. Shift-Ins, wenn Ins
480; bei gedr�ckter Shift-Taste {blind} gesendet wird
481; *VKA1SC136::
482; *VKA0SC02A::
483   if (GetKeyState("VKA1SC136", "P") and GetKeyState("VKA0SC02A", "P"))
484      send {blind}{capslock}
485return
486
487
488; Mod3+Mod3 == Mod3-Lock
489; Im Gegensatz zu LShift+RShift werden die beiden Tasten
490; _nicht_ zur Applikation weitergeleitet, da '#' kein
491; Modifier ist und CapsLock sonst den CapsLock-Status
492; beeinflusst. Daf�r werden s�mtliche Events dieser
493; Tasten abgefangen, und nur bei gleichzeitigem Dr�cken
494; wird der Mod3-Lock aktiviert und angezeigt.
495
496IsMod3Locked := 0
497; VKBFSC02B & VK14SC03A::
498; VK14SC03A & VKBFSC02B::
499*VKBFSC02B:: ; #
500*VK14SC03A:: ; CapsLock
501   if (GetKeyState("VKBFSC02B", "P") and GetKeyState("VK14SC03A", "P"))
502   {
503      if (IsMod3Locked)
504      {
505         IsMod3Locked = 0
506         MsgBox Mod3-Feststellung aufgebehoben
507      }
508      else
509      {
510         IsMod3Locked = 1
511         MsgBox Mod3 festgestellt: Um Mod3 wieder zu l�sen dr�cke beide Mod3 Tasten gleichzeitig
512      }
513   }
514return
515
516; Mod4+Mod4 == Mod4-Lock
517; Wie bei Mod3-Lock werden im Gegensatz zu LShift+RShift
518; die beiden Tasten _nicht_ zur Applikation weitergeleitet,
519; und nur bei gleichzeitigem Dr�cken wird der Mod4-Lock
520; aktiviert und angezeigt.
521
522IsMod4Locked := 0
523; VKA5SC138 & VKE2SC056:: ; AltGr, dann <
524; VKE2SC056 & VKA5SC138:: ; <, dann AltGr
525*VKA5SC138::
526*VKE2SC056::
527   if (GetKeyState("VKA5SC138", "P") and GetKeyState("VKE2SC056", "P"))
528   {
529      ; Mod4-Lock durch Mod4(rechts)+Mod4(links)
530      if (IsMod4Locked)
531      {
532         MsgBox Mod4-Feststellung aufgebehoben
533         IsMod4Locked = 0
534         if (UseMod4Light==1)
535         {
536            KeyboardLED(1,"off")
537         }
538      }
539      else
540      {
541         MsgBox Mod4 festgestellt: Um Mod4 wieder zu l�sen dr�cke beide Mod4 Tasten gleichzeitig
542         IsMod4Locked = 1
543         if (UseMod4Light==1)
544         {
545            KeyboardLED(1,"on")
546         }
547      }
548   }
549return
550/*
551   ------------------------------------------------------
552   QWERTZ->Neo umwandlung
553   ------------------------------------------------------
554*/
555; Reihe 1
556*VKDCSC029::goto neo_tot1  ; Zirkumflex ^
557*VK31SC002::goto neo_1
558*VK32SC003::goto neo_2
559*VK33SC004::goto neo_3
560*VK34SC005::goto neo_4
561*VK35SC006::goto neo_5
562*VK36SC007::goto neo_6
563*VK37SC008::
564     if( not(einHandNeo) or not(spacepressed) )
565       goto neo_7
566     else
567      {
568        keypressed := 1
569        goto %gespiegelt_7%
570      }
571*VK38SC009::
572     if( not(einHandNeo) or not(spacepressed) )
573       goto neo_8
574     else
575      {
576        keypressed := 1
577        goto %gespiegelt_8%
578      }
579*VK39SC00A::
580     if( not(einHandNeo) or not(spacepressed) )
581       goto neo_9
582     else
583      {
584        keypressed := 1
585        goto %gespiegelt_9%
586      }
587*VK30SC00B::
588     if( not(einHandNeo) or not(spacepressed) )
589       goto neo_0
590     else
591      {
592        keypressed := 1
593        goto %gespiegelt_0%
594      }
595*VKDBSC00C:: ; �
596  if ( not(ahkTreiberKombi) )
597  {
598       if( not(einHandNeo) or not(spacepressed) )
599       goto neo_strich
600     else
601      {
602        keypressed := 1
603        goto %gespiegelt_strich%
604      }
605   }
606  else
607  {
608     goto neo_sz   
609  }
610*VKDDSC00D::goto neo_tot2  ; Akut                       
611; Reihe 2
612VK09SC00F::goto neo_tab
613*VK51SC010:: ; q (x)
614  if ( not(ahkTreiberKombi) )
615  {
616     goto neo_x
617  }
618  else
619  {
620     goto neo_q   
621  }
622*VK57SC011:: ; w (v)
623  if ( not(ahkTreiberKombi) )
624  {
625     goto neo_v
626  }
627  else
628  {
629     goto neo_w   
630  }
631*VK45SC012:: ; e (l)
632  if ( not(ahkTreiberKombi) )
633  {
634     goto neo_l
635  }
636  else
637  {
638     goto neo_e   
639  }
640*VK52SC013:: ; r (c)
641  if ( not(ahkTreiberKombi) )
642  {
643     goto neo_c
644  }
645  else
646  {
647     goto neo_r   
648  }
649*VK54SC014:: ; t (w)
650  if ( not(ahkTreiberKombi) )
651  {
652     goto neo_w
653  }
654  else
655  {
656     goto neo_t   
657  }
658*VK5ASC015:: ; z (k)
659  if ( not(ahkTreiberKombi) )
660  {
661     if( not(einHandNeo) or not(spacepressed) )
662       goto neo_k
663     else
664      {
665        keypressed := 1
666        goto %gespiegelt_k%
667      }
668  }
669  else
670  {
671     goto neo_z   
672  }
673*VK55SC016:: ; u (h)
674  if ( not(ahkTreiberKombi) )
675  {
676     if( not(einHandNeo) or not(spacepressed) )
677       goto neo_h
678     else
679      {
680        keypressed := 1
681        goto %gespiegelt_h%
682      }
683  }
684  else
685  {
686     goto neo_u   
687  }
688*VK49SC017:: ; i (g)
689  if ( not(ahkTreiberKombi) )
690  {
691     if( not(einHandNeo) or not(spacepressed) )
692       goto neo_g
693     else
694      {
695        keypressed := 1
696        goto %gespiegelt_g%
697      }
698  }
699  else
700  {
701     goto neo_i   
702  }
703*VK4FSC018:: ; o (f)
704  if ( not(ahkTreiberKombi) )
705  {
706     if( not(einHandNeo) or not(spacepressed) )
707       goto neo_f
708     else
709      {
710        keypressed := 1
711        goto %gespiegelt_f%
712      }
713  }
714  else
715  {
716     goto neo_o   
717  }
718*VK50SC019:: ; p (q)
719  if ( not(ahkTreiberKombi) )
720  {
721     if( not(einHandNeo) or not(spacepressed) )
722       goto neo_q
723     else
724      {
725        keypressed := 1
726        goto %gespiegelt_q%
727      }
728  }
729  else
730  {
731     goto neo_p   
732  }
733*VKBASC01A:: ; � (�)
734  if ( not(ahkTreiberKombi) )
735  {
736     if( not(einHandNeo) or not(spacepressed) )
737       goto neo_sz
738     else
739      {
740        keypressed := 1
741        goto %gespiegelt_sz%
742      }
743  }
744  else
745  {
746     goto neo_�   
747  }
748*VKBBSC01B:: ; + (tot3)
749  if ( not(ahkTreiberKombi) )
750  {
751     if( not(einHandNeo) or not(spacepressed) )
752       goto neo_tot3
753     else
754      {
755        keypressed := 1
756        goto %gespiegelt_tot3%
757      }
758  }
759  else
760  { } ; this should never happen
761
762; Reihe 3
763*VK41SC01E:: ; a (u)
764  if ( not(ahkTreiberKombi) )
765  {
766     goto neo_u
767  }
768  else
769  {
770     goto neo_a   
771  }
772*VK53SC01F:: ; s (i)
773  if ( not(ahkTreiberKombi) )
774  {
775     goto neo_i
776  }
777  else
778  {
779     goto neo_s   
780  }
781*VK44SC020:: ; d (a)
782  if ( not(ahkTreiberKombi) )
783  {
784     goto neo_a
785  }
786  else
787  {
788     goto neo_d   
789  }
790*VK46SC021:: ; f (e)
791  if ( not(ahkTreiberKombi) )
792  {
793     goto neo_e
794  }
795  else
796  {
797     goto neo_f   
798  }
799*VK47SC022:: ; g (o)
800  if ( not(ahkTreiberKombi) )
801  {
802     goto neo_o
803  }
804  else
805  {
806     goto neo_g   
807  }
808*VK48SC023:: ; h (s)
809  if ( not(ahkTreiberKombi) )
810  {
811     if( not(einHandNeo) or not(spacepressed) )
812       goto neo_s
813     else
814      {
815        keypressed := 1
816        goto %gespiegelt_s%
817      }
818  }
819  else
820  {
821     goto neo_h   
822  }
823*VK4ASC024:: ; j (n)
824  if ( not(ahkTreiberKombi) )
825  {
826     if( not(einHandNeo) or not(spacepressed) )
827       goto neo_n
828     else
829      {
830        keypressed := 1
831        goto %gespiegelt_n%
832      }
833  }
834  else
835  {
836     goto neo_j   
837  }
838*VK4BSC025:: ; k (r)
839  if ( not(ahkTreiberKombi) )
840  {
841     if( not(einHandNeo) or not(spacepressed) )
842       goto neo_r
843     else
844      {
845        keypressed := 1
846        goto %gespiegelt_r%
847      }
848  }
849  else
850  {
851     goto neo_k   
852  }
853*VK4CSC026:: ; l (t)
854  if ( not(ahkTreiberKombi) )
855  {
856     if( not(einHandNeo) or not(spacepressed) )
857       goto neo_t
858     else
859      {
860        keypressed := 1
861        goto %gespiegelt_t%
862      }
863  }
864  else
865  {
866     goto neo_l   
867  }
868*VKC0SC027:: ; � (d)
869  if ( not(ahkTreiberKombi) )
870  {
871     if( not(einHandNeo) or not(spacepressed) )
872       goto neo_d
873     else
874      {
875        keypressed := 1
876        goto %gespiegelt_d%
877      }
878  }
879  else
880  {
881     goto neo_�   
882  }
883*VKDESC028:: ; � (y)
884  if ( not(ahkTreiberKombi) )
885  {
886     goto neo_y
887  }
888  else
889  {
890     goto neo_�
891  }
892
893; Reihe 4
894*VK59SC02C:: ; y (�)
895  if ( not(ahkTreiberKombi) )
896  {
897     goto neo_�
898  }
899  else
900  {
901     goto neo_y   
902  }
903*VK58SC02D:: ; x (�)
904  if ( not(ahkTreiberKombi) )
905  {
906     goto neo_�
907  }
908  else
909  {
910     goto neo_x   
911  }
912*VK43SC02E:: ; c (�)
913  if ( not(ahkTreiberKombi) )
914  {
915     goto neo_�
916  }
917  else
918  {
919     goto neo_c
920  }
921*VK56SC02F:: ; v (p)
922  if ( not(ahkTreiberKombi) )
923  {
924     goto neo_p
925  }
926  else
927  {
928     goto neo_v
929  }
930*VK42SC030:: ; b (z)
931  if ( not(ahkTreiberKombi) )
932  {
933     goto neo_z
934  }
935  else
936  {
937     goto neo_b
938  }
939*VK4ESC031:: ; n (b)
940  if ( not(ahkTreiberKombi) )
941  {
942     if( not(einHandNeo) or not(spacepressed) )
943       goto neo_b
944     else
945      {
946        keypressed := 1
947        goto %gespiegelt_b%
948      }
949  }
950  else
951  {
952     goto neo_n
953  }
954*VK4DSC032:: ; m (m)
955     if( not(einHandNeo) or not(spacepressed) )
956       goto neo_m
957     else
958      {
959        keypressed := 1
960        goto %gespiegelt_m%
961      }
962*VKBCSC033:: ; , (,)
963     if( not(einHandNeo) or not(spacepressed) )
964       goto neo_komma
965     else
966      {
967        keypressed := 1
968        goto %gespiegelt_komma%
969      }
970*VKBESC034:: ; . (.)
971     if( not(einHandNeo) or not(spacepressed) )
972       goto neo_punkt
973     else
974      {
975        keypressed := 1
976        goto %gespiegelt_punkt%
977      }
978*VKBDSC035:: ; - (j)
979  if ( not(ahkTreiberKombi) )
980  {
981     if( not(einHandNeo) or not(spacepressed) )
982       goto neo_j
983     else
984      {
985        keypressed := 1
986        goto %gespiegelt_j%
987      }
988  }
989  else
990  {
991     goto neo_strich
992  }
993
994; Numpad
995*VK6FSC135::goto neo_NumpadDiv
996*VK6ASC037::goto neo_NumpadMult
997*VK6DSC04A::goto neo_NumpadSub
998*VK6BSC04E::goto neo_NumpadAdd
999*VK0DSC11C::goto neo_NumpadEnter
1000
1001*VK67SC047::                      ; NumPad7    (mit NumLock  und ohne Shift)
1002*VK24SC047::goto neo_Numpad7      ; NumPadHome (ohne Numlock oder mit Shift)
1003
1004*VK68SC048::                      ; NumPad8    (mit NumLock  und ohne Shift)
1005*VK26SC048::goto neo_Numpad8      ; NumPadUp   (ohne Numlock oder mit Shift)
1006
1007*VK69SC049::                      ; NumPad9    (mit NumLock  und ohne Shift)
1008*VK21SC049::goto neo_Numpad9      ; NumPadPgUp (ohne Numlock oder mit Shift)
1009
1010*VK64SC04B::                      ; NumPad4    (mit NumLock  und ohne Shift)
1011*VK25SC04B::goto neo_Numpad4      ; NumPadLeft (ohne Numlock oder mit Shift)
1012
1013*VK65SC04C::                      ; NumPad5    (mit NumLock  und ohne Shift)
1014*VK0CSC04C::goto neo_Numpad5      ; NumPadClear(ohne Numlock oder mit Shift)
1015
1016*VK66SC04D::                      ; NumPad6    (mit NumLock  und ohne Shift)
1017*VK27SC04D::goto neo_Numpad6      ; NumPadRight(ohne Numlock oder mit Shift)
1018
1019*VK61SC04F::                      ; NumPad1    (mit NumLock  und ohne Shift)
1020*VK23SC04F::goto neo_Numpad1      ; NumPadEnd  (ohne Numlock oder mit Shift)
1021
1022*VK62SC050::                      ; NumPad2    (mit NumLock  und ohne Shift)
1023*VK28SC050::goto neo_Numpad2      ; NumPadDown (ohne Numlock oder mit Shift)
1024
1025*VK63SC051::                      ; NumPad3    (mit NumLock  und ohne Shift)
1026*VK22SC051::goto neo_Numpad3      ; NumPadPgDn (ohne Numlock oder mit Shift)
1027
1028*VK60SC052::                      ; NumPad0    (mit NumLock  und ohne Shift)
1029*VK2DSC052::goto neo_Numpad0      ; NumPadIns  (ohne Numlock oder mit Shift)
1030
1031*VK6ESC053::                      ; NumPadDot  (mit NumLock  und ohne Shift)
1032*VK2ESC053::goto neo_NumpadDot    ; NumPadIns  (ohne Numlock oder mit Shift)
1033/*
1034Die eigentliche NEO-Belegung und der Hauptteil des AHK-Treibers.
1035
1036
1037   Ablauf bei toten Tasten:
1038   1. Ebene Aktualisieren
1039   2. Abh�ngig von der Variablen "Ebene" Zeichen ausgeben und die Variable "PriorDeadKey" setzen
1040   
1041   Ablauf bei "untoten" Tasten:
1042   1. Ebene Aktualisieren
1043   2. Abh�ngig von den Variablen "Ebene" und "PriorDeadKey" Zeichen ausgeben
1044   3. "PriorDeadKey" mit leerem String �berschreiben
1045
1046   ------------------------------------------------------
1047   Reihe 1
1048   ------------------------------------------------------
1049*/
1050
1051
1052neo_tot1:
1053   EbeneAktualisieren()
1054   if (Ebene = 1)
1055   {
1056      deadUni(0x02C6) ; circumflex, tot
1057      DeadKey := "c1"
1058   }
1059   else if (Ebene = 2)
1060   {
1061      deadUni(0x02C7) ; caron, tot
1062      DeadKey := "c2"
1063   }
1064   else if (Ebene = 3)
1065   {
1066      deadUni(0x02D8) ; brevis
1067      DeadKey := "c3"
1068   }
1069   else if (Ebene = 4)
1070   {
1071      deadUni(0x00B7) ; Mittenpunkt, tot
1072      DeadKey := "c4"
1073   }
1074   else if (Ebene = 5)
1075   {
1076      deadAsc("-")                 ; querstrich, tot
1077      DeadKey := "c5"
1078   }
1079   else if (Ebene = 6)
1080   {
1081      deadAsc(".")                 ; punkt darunter (colon)
1082      DeadKey := "c6"
1083   }
1084   CompKey := PriorCompKey
1085return
1086
1087neo_1:
1088   EbeneAktualisieren()
1089   if (Ebene = 1)
1090   {
1091      if !(CheckDeadUni("c1",0x00B9)
1092        or CheckDeadUni("c5",0x2081)
1093        or CheckComp3Uni("r_1",0x217A)       ; r�misch xi
1094        or CheckComp3Uni("R_1",0x216A))      ; r�misch XI
1095         if (GetKeyState("CapsLock","T"))
1096            send {blind}{Shift down}1{Shift up}
1097         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1098            send {blind}1
1099
1100      if      (PriorDeadKey = "comp")
1101         CompKey := "1"
1102      else if (PriorCompKey == "r")
1103         CompKey := "r_1"
1104      else if (PriorCompKey == "R")
1105         CompKey := "R_1"
1106   }
1107   else if (Ebene = 2)
1108      send �
1109   else if (Ebene = 3)
1110      SendUnicodeChar(0x00B9) ; 2 Hochgestellte
1111   else if (Ebene = 4)
1112      SendUnicodeChar(0x2022) ; bullet
1113   else if (Ebene = 5)
1114      SendUnicodeChar(0x2640) ; Piktogramm weiblich
1115   else if (Ebene = 6)
1116      SendUnicodeChar(0x00AC) ; Nicht-Symbol
1117return
1118
1119neo_2:
1120   EbeneAktualisieren()
1121   if (Ebene = 1)
1122   {
1123      if !(CheckDeadUni("c1",0x00B2)
1124        or CheckDeadUni("c5",0x2082)
1125        or CheckCompUni("r",0x2171)      ; r�misch ii
1126        or CheckCompUni("R",0x2161)      ; r�misch II
1127        or CheckComp3Uni("r_1",0x217B)   ; r�misch xii
1128        or CheckComp3Uni("R_1",0x216B))  ; r�misch XII
1129         if (GetKeyState("CapsLock","T"))
1130            send {blind}{Shift down}2{Shift up}
1131         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1132            send {blind}2
1133
1134      if (PriorDeadKey = "comp")
1135         CompKey := "2"
1136   }
1137   else if (Ebene = 2)
1138      SendUnicodeChar(0x2116) ; numero
1139   else if (Ebene = 3)
1140      SendUnicodeChar(0x00B2) ; 2 Hochgestellte
1141   else if (Ebene = 4)
1142      SendUnicodeChar(0x2023) ; aufzaehlungspfeil
1143   else if (Ebene = 5)
1144      SendUnicodeChar(0x26A5) ; Piktogramm Zwitter
1145   else if (Ebene = 6)
1146      SendUnicodeChar(0x2228) ; Logisches Oder
1147return
1148
1149neo_3:
1150   EbeneAktualisieren()
1151   if (Ebene = 1)
1152   {
1153      if !(CheckDeadUni("c1",0x00B3)
1154        or CheckDeadUni("c5",0x2083)
1155        or CheckCompUni("1",0x2153)           ; 1/3
1156        or CheckCompUni("2",0x2154)           ; 2/3
1157        or CheckCompUni("r",0x2172)           ; r�misch iii
1158        or CheckCompUni("R",0x2162))          ; r�misch III
1159         if (GetKeyState("CapsLock","T"))
1160            send {blind}{Shift down}3{Shift up}
1161         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1162            send {blind}3
1163
1164      if (PriorDeadKey = "comp")
1165         CompKey := "3"
1166   }
1167   else if (Ebene = 2)
1168      send �
1169   else if (Ebene = 3)
1170      SendUnicodeChar(0x00B3) ; 3 Hochgestellte
1171   else if (Ebene = 4)
1172   {
1173       CompKey := PriorCompKey
1174       DeadKey := PriorDeadKey
1175   } ; leer
1176   else if (Ebene = 5)
1177      SendUnicodeChar(0x2642) ; Piktogramm Mann
1178   else if (Ebene = 6)
1179      SendUnicodeChar(0x2227) ; Logisches Und
1180return
1181
1182neo_4:
1183   EbeneAktualisieren()
1184   if (Ebene = 1)
1185   {
1186      if !(CheckDeadUni("c1",0x2074)
1187        or CheckDeadUni("c5",0x2084)
1188        or CheckCompUni("r",0x2173)     ; r�misch iv
1189        or CheckCompUni("R",0x2163))    ; r�misch IV
1190         if (GetKeyState("CapsLock","T"))
1191            send {blind}{Shift down}4{Shift up}
1192         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1193            send {blind}4
1194
1195      if (PriorDeadKey = "comp")
1196         CompKey := "4"
1197   }
1198   else if (Ebene = 2)
1199      SendUnicodeChar(0x00BB) ; �, Double guillemot right
1200    else if (Ebene = 3)
1201      Send {blind}� ; Single guillemot right
1202   else if (Ebene = 4)
1203      Send {blind}{PgUp}    ; Prev
1204   else if (Ebene = 5)
1205      SendUnicodeChar(0x2113) ; Script small L
1206   else if (Ebene = 6)
1207      SendUnicodeChar(0x22A5) ; Senkrecht
1208return
1209
1210neo_5:
1211   EbeneAktualisieren()
1212   if (Ebene = 1)
1213   {
1214      if !(CheckDeadUni("c1",0x2075)
1215        or CheckDeadUni("c5",0x2085)
1216        or CheckCompUni("1",0x2155)           ; 1/5
1217        or CheckCompUni("2",0x2156)           ; 2/5
1218        or CheckCompUni("3",0x2157)           ; 3/5
1219        or CheckCompUni("4",0x2158)           ; 4/5
1220        or CheckCompUni("r",0x2174)           ; r�misch v
1221        or CheckCompUni("R",0x2164))          ; r�misch V
1222         if (GetKeyState("CapsLock","T"))
1223            send {blind}{Shift down}5{Shift up}
1224         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1225            send {blind}5
1226
1227      if (PriorDeadKey = "comp")
1228         CompKey := "5"
1229   }
1230   else if (Ebene = 2)
1231      SendUnicodeChar(0x00AB) ; �, Double guillemot left
1232   else if (Ebene = 3)
1233      Send {blind}� ; Single guillemot left
1234   else if (Ebene = 4)
1235   {
1236       CompKey := PriorCompKey
1237       DeadKey := PriorDeadKey
1238   } ; leer
1239   else if (Ebene = 5)
1240      SendUnicodeChar(0x2020) ; Kreuz (Dagger)
1241   else if (Ebene = 6)
1242      SendUnicodeChar(0x2221) ; Winkel
1243return
1244
1245neo_6:
1246   EbeneAktualisieren()
1247   if (Ebene = 1)
1248   {
1249      if !(CheckDeadUni("c1",0x2076)
1250        or CheckDeadUni("c5",0x2086)
1251        or CheckCompUni("1",0x2159)           ; 1/6
1252        or CheckCompUni("5",0x215A)           ; 5/6
1253        or CheckCompUni("r",0x2175)           ; r�misch vi
1254        or CheckCompUni("R",0x2165))          ; r�misch VI
1255         if (GetKeyState("CapsLock","T"))
1256            send {blind}{Shift down}6{Shift up}
1257         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1258            send {blind}6
1259
1260      if (PriorDeadKey = "comp")
1261         CompKey := "6"
1262   }
1263   else if (Ebene = 2)
1264      send �
1265   else if (Ebene = 3)
1266      send {blind}�
1267   else if (Ebene = 4)
1268      send {blind}�
1269   else if (Ebene = 5)
1270   {
1271       CompKey := PriorCompKey
1272       DeadKey := PriorDeadKey
1273   } ; leer
1274   else if (Ebene = 6)
1275      SendUnicodeChar(0x2225) ; parallel
1276return
1277
1278neo_7:
1279   EbeneAktualisieren()
1280   if (Ebene = 1)
1281   {
1282      if !(CheckDeadUni("c1",0x2077)
1283        or CheckDeadUni("c5",0x2087)
1284        or CheckCompUni("r",0x2176)     ; r�misch vii
1285        or CheckCompUni("R",0x2166))    ; r�misch VII
1286         if (GetKeyState("CapsLock","T"))
1287            send {blind}{Shift down}7{Shift up}
1288         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1289            send {blind}7
1290
1291      if (PriorDeadKey = "comp")
1292         CompKey := "7"
1293   }
1294   else if (Ebene = 2)
1295      send $
1296   else if (Ebene = 3)
1297      send {blind}�
1298   else if (Ebene = 4)
1299      send {blind}�
1300   else if (Ebene = 5)
1301      SendUnicodeChar(0x03BA) ; greek small letter kappa
1302   else if (Ebene = 6)
1303      SendUnicodeChar(0x2209) ; nicht Element von
1304return
1305
1306neo_8:
1307   EbeneAktualisieren()
1308   if (Ebene = 1)
1309   {
1310      if !(CheckDeadUni("c1",0x2078)
1311        or CheckDeadUni("c5",0x2088)
1312        or CheckCompUni("1",0x215B)           ; 1/8
1313        or CheckCompUni("3",0x215C)           ; 3/8
1314        or CheckCompUni("5",0x215D)           ; 5/8
1315        or CheckCompUni("7",0x215E)           ; 7/8
1316        or CheckCompUni("r",0x2177)           ; r�misch viii
1317        or CheckCompUni("R",0x2167))          ; r�misch VIII
1318         if (GetKeyState("CapsLock","T"))
1319            send {blind}{Shift down}8{Shift up}
1320         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1321            send {blind}8
1322
1323      if (PriorDeadKey = "comp")
1324         CompKey := "8"
1325   }
1326   else if (Ebene = 2)
1327      send �
1328   else if (Ebene = 3)
1329      send {blind}�
1330   else if (Ebene = 4)
1331      Send {blind}{NumpadDiv}
1332   else if (Ebene = 5)
1333      SendUnicodeChar(0x27E8) ;bra (�ffnende spitze klammer)
1334   else if (Ebene = 6)
1335      SendUnicodeChar(0x2204) ; es existiert nicht
1336return
1337
1338neo_9:
1339   EbeneAktualisieren()
1340   if (Ebene = 1)
1341   {
1342      if !(CheckDeadUni("c1",0x2079)
1343        or CheckDeadUni("c5",0x2089)
1344        or CheckCompUni("r",0x2178)     ; r�misch ix
1345        or CheckCompUni("R",0x2168))    ; r�misch IX
1346         if (GetKeyState("CapsLock","T"))
1347            send {blind}{Shift down}9{Shift up}
1348         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1349            send {blind}9
1350
1351      if (PriorDeadKey = "comp")
1352         CompKey := "9"
1353   }
1354   else if (Ebene = 2)
1355      send �
1356   else if (Ebene = 3)
1357      send {blind}�
1358   else if (Ebene = 4)
1359      Send {blind}{NumpadMult}
1360   else if (Ebene = 5)
1361      SendUnicodeChar(0x27E9) ;ket (schlie�ende spitze klammer)
1362   else if (Ebene = 6)
1363      SendUnicodeChar(0x2226) ; nicht parallel
1364return
1365
1366neo_0:
1367   EbeneAktualisieren()
1368   if (Ebene = 1)
1369   {
1370      if !(CheckDeadUni("c1",0x2070)
1371        or CheckDeadUni("c5",0x2080)
1372        or CheckComp3Uni("r_1",0x2179)     ; r�misch x
1373        or CheckComp3Uni("R_1",0x2169))    ; r�misch X
1374         if (GetKeyState("CapsLock","T"))
1375            send {blind}{Shift down}0{Shift up}
1376         else if (not(lernModus) or lernModus_std_ZahlenReihe)
1377            send {blind}0
1378
1379      if (PriorDeadKey = "comp")
1380         CompKey := "0"
1381   }
1382   else if (Ebene = 2)
1383      send �
1384   else if (Ebene = 3)
1385      send {blind}�
1386   else if (Ebene = 4)
1387      Send {blind}{NumpadSub}
1388   else if (Ebene = 5)
1389   {
1390       CompKey := PriorCompKey
1391       DeadKey := PriorDeadKey
1392   } ; leer
1393   else if (Ebene = 6)
1394      SendUnicodeChar(0x2205) ; leere Menge
1395return
1396
1397neo_strich:
1398   EbeneAktualisieren()
1399   if (Ebene = 1)
1400      if (GetKeyState("CapsLock","T"))
1401         send {blind}{Shift down}-{Shift up}
1402      else
1403         send {blind}- ; Bindestrich-Minus
1404   else if (Ebene = 2)
1405      SendUnicodeChar(0x2013) ; Gedankenstrich
1406   else if (Ebene = 3)
1407      SendUnicodeChar(0x2014) ; Englischer Gedankenstrich (Geviertstrich)
1408   else if (Ebene = 4)
1409   {
1410       CompKey := PriorCompKey
1411       DeadKey := PriorDeadKey
1412   } ; leer
1413   else if (Ebene = 5)
1414      SendUnicodeChar(0x2011) ; gesch�tzter Bindestrich (Bindestrich ohne Zeilenumbruch)
1415   else if (Ebene = 6)
1416      SendUnicodeChar(0x00AD) ; weicher Bindestrich
1417return
1418
1419neo_tot2:
1420   EbeneAktualisieren()
1421   if (Ebene = 1)
1422   {
1423      deadAsc("{�}{space}") ; akut, tot
1424      DeadKey := "a1"
1425   }
1426   else if (Ebene = 2)
1427   {
1428      deadAsc("``{space}")
1429      DeadKey := "a2"
1430   }
1431   else if (Ebene = 3)
1432   {
1433      deadAsc("�") ; cedilla
1434      DeadKey := "a3"
1435   }
1436   else if (Ebene = 4)
1437   {
1438      deadUni(0x02D9) ; punkt oben dr�ber
1439      DeadKey := "a4"
1440   }
1441   else if (Ebene = 5)
1442   {
1443      deadUni(0x02DB) ; ogonek
1444      DeadKey := "a5"
1445   }
1446   else if (Ebene = 6)
1447   {
1448      deadUni(0x02DA)  ; ring obendrauf
1449      DeadKey := "a6"
1450   }
1451   CompKey := PriorCompKey
1452return
1453
1454
1455/*
1456   ------------------------------------------------------
1457   Reihe 2
1458   ------------------------------------------------------
1459*/
1460
1461neo_x:
1462   EbeneAktualisieren()
1463   if (Ebene12)
1464      OutputChar("x","X")
1465   else if (Ebene = 3)
1466      SendUnicodeChar(0x2026) ;Ellipse
1467   else if (Ebene = 5)
1468      SendUnicodeChar(0x03BE) ;xi
1469   else if (Ebene = 6)
1470      SendUnicodeChar(0x039E)  ; Xi
1471return
1472
1473
1474neo_v:
1475   EbeneAktualisieren()
1476   if (Ebene12 and !(CheckDeadUni12("c6",0x1E7F,0x1E7E)))
1477      OutputChar("v","V")
1478   else if (Ebene = 3)
1479      send {blind}_
1480   else if (Ebene = 4)
1481      if (not(lernModus) or lernModus_neo_Backspace)
1482         Send {blind}{Backspace}
1483      else
1484      {
1485          CompKey := PriorCompKey
1486          DeadKey := PriorDeadKey
1487      } ; leer
1488   else if (Ebene = 6)
1489      SendUnicodeChar(0x2259) ; estimates
1490return
1491
1492
1493
1494neo_l:
1495   EbeneAktualisieren()
1496   if (Ebene12 and !(CheckDeadUni12("a1",0x013A,0x0139)
1497                  or CheckDeadUni12("a3",0x013C,0x013B)
1498                  or CheckDeadUni12("c2",0x013E,0x013D)
1499                  or CheckDeadUni12("c4",0x0140,0x013F)
1500                  or CheckDeadUni12("c6",0x1E37,0x1E36)
1501                  or CheckDeadUni12("t4",0x0142,0x0141)))
1502      OutputChar("l","L")
1503   else if (Ebene = 3)
1504      send {blind}[
1505   else if (Ebene = 4)
1506      Send {Blind}{Up}
1507   else if (Ebene = 5)
1508      SendUnicodeChar(0x03BB) ; lambda
1509   else if (Ebene = 6)
1510      SendUnicodeChar(0x039B) ; Lambda
1511return
1512
1513
1514neo_c:
1515   EbeneAktualisieren()
1516   if (Ebene12 and !(CheckDeadUni12("a1",0x0107,0x0106)
1517                  or CheckDeadUni12("a3",0x00E7,0x00E6)
1518                  or CheckDeadUni12("a4",0x010B,0x010A)
1519                  or CheckDeadUni12("c1",0x0109,0x0108)
1520                  or CheckDeadUni12("c2",0x010D,0x010C)
1521                  or CheckCompAsc12("o","�","�")
1522                  or CheckCompAsc12("O","�","�")))
1523      OutputChar("c","C")
1524   else if (Ebene = 3)
1525      send {blind}]
1526   else if (Ebene = 4)
1527      if (not(lernModus) or lernModus_neo_Entf)
1528        Send {blind}{Del}
1529      else
1530      {
1531          CompKey := PriorCompKey
1532          DeadKey := PriorDeadKey
1533      } ; leer
1534   else if (Ebene = 5)
1535      SendUnicodeChar(0x03C7) ;chi
1536   else if (Ebene = 6)
1537      SendUnicodeChar(0x2102)  ; C (Komplexe Zahlen)
1538return
1539
1540neo_w:
1541   EbeneAktualisieren()
1542   if (Ebene12 and !(CheckDeadUni12("c1",0x0175,0x0174)))
1543      OutputChar("w","W")
1544   else if (Ebene = 3)
1545      SendUnicodeChar(0x005E) ; untotes ^ - Unicode-Name: CIRCUMFLEX ACCENT
1546      ;send {^}{space} ; Funktioniert nicht unter Java-Programmen
1547   else if (Ebene = 4)
1548      Send {blind}{Insert}
1549   else if (Ebene = 5)
1550      SendUnicodeChar(0x03C9) ; omega
1551   else if (Ebene = 6)
1552      SendUnicodeChar(0x03A9) ; Omega
1553return
1554
1555neo_k:
1556   EbeneAktualisieren()
1557   if (Ebene12 and !(CheckDeadUni12("a3",0x0137,0x0136)
1558                  or CheckDeadUni12("c6",0x1E33,0x1E32)))
1559      OutputChar("k","K")
1560   else if (Ebene = 3)
1561      send {blind}{!}
1562   else if (Ebene = 4)
1563      Send �
1564   else if (Ebene = 5)
1565      SendUnicodeChar(0x03F0) ;kappa symbol (varkappa)
1566   else if (Ebene = 6)
1567      SendUnicodeChar(0x221A) ; Wurzel
1568return
1569
1570neo_h:
1571   EbeneAktualisieren()
1572   if (Ebene12 and !(CheckDeadUni12("a4",0x1E23,0x1E22)
1573                  or CheckDeadUni12("c1",0x0125,0x0124)
1574                  or CheckDeadUni12("c5",0x0127,0x0126)
1575                  or CheckDeadUni12("c6",0x1E25,0x1E24)))
1576      OutputChar("h","H")
1577   else if ((Ebene = 3) and !(CheckDeadUni("c5",0x2264))) ; kleiner gleich
1578      send {blind}<
1579   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x2077)
1580                           or CheckDeadUni("c5",0x2087)))
1581      Send {blind}{NumPad7}
1582   else if (Ebene = 5)
1583      SendUnicodeChar(0x03C8) ;psi
1584   else if (Ebene = 6)
1585      SendUnicodeChar(0x03A8)  ; Psi
1586return
1587
1588neo_g:
1589   EbeneAktualisieren()
1590   if (Ebene12 and !(CheckDeadUni12("a3",0x0123,0x0122)
1591                  or CheckDeadUni12("a4",0x0121,0x0120)
1592                  or CheckDeadUni12("c1",0x011D,0x011C)
1593                  or CheckDeadUni12("c3",0x011F,0x011E)))
1594      OutputChar("g","G")
1595   else if ((Ebene = 3) and !(CheckDeadUni("c5",0x2265))) ; gr��er gleich
1596      send {blind}>
1597   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x2078)
1598                           or CheckDeadUni("c5",0x2088)))
1599      Send {blind}{NumPad8}
1600   else if (Ebene = 5)
1601      SendUnicodeChar(0x03B3) ;gamma
1602   else if (Ebene = 6)
1603      SendUnicodeChar(0x0393)  ; Gamma
1604return
1605
1606neo_f:
1607   EbeneAktualisieren()
1608   if (Ebene12 and !(CheckDeadUni12("a4",0x1E1F,0x1E1E)
1609                  or CheckDeadUni12("t4",0x0192,0x0191)))
1610      OutputChar("f","F")
1611   else if ((Ebene = 3) and !(CheckDeadUni("a6",0x2257)    ; ring equal to
1612                      or CheckDeadUni("c1",0x2259)    ; entspricht
1613                      or CheckDeadUni("c2",0x225A)    ; EQUIANGULAR TO
1614                      or CheckDeadUni("c5",0x2261)    ; identisch
1615                      or CheckDeadUni("t1",0x2245)    ; ungef�hr gleich
1616                      or CheckDeadUni("t4",0x2260)))  ; ungleich
1617      send {blind}`=
1618   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x2079)
1619                           or CheckDeadUni("c5",0x2089)))
1620      Send {blind}{NumPad9}
1621   else if (Ebene = 5)
1622      SendUnicodeChar(0x03C6) ; phi
1623   else if (Ebene = 6)
1624      SendUnicodeChar(0x03A6)  ; Phi
1625return
1626
1627neo_q:
1628   EbeneAktualisieren()
1629   if (Ebene12)
1630      OutputChar("q","Q")
1631   else if (Ebene = 3)
1632      send {blind}{&}
1633   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x207A)
1634                           or CheckDeadUni("c5",0x208A)))
1635      Send {blind}{NumPadAdd}
1636   else if (Ebene = 5)
1637      SendUnicodeChar(0x03D5) ; phi symbol (varphi)
1638   else if (Ebene = 6)
1639      SendUnicodeChar(0x211A) ; Q (rationale Zahlen)
1640return
1641
1642neo_sz:
1643   EbeneAktualisieren()
1644   if (Ebene = 1)
1645      if (GetKeyState("CapsLock","T"))
1646         SendUnicodeChar(0x1E9E) ; verssal-�
1647      else if (LangSTastatur = 1)
1648         send {blind}s
1649      else
1650         send �
1651   else if (Ebene = 2)
1652      if (GetKeyState("CapsLock","T"))
1653         if (LangSTastatur = 1)
1654            send {blind}s
1655         else
1656            send �
1657      else
1658         SendUnicodeChar(0x1E9E) ; versal-�
1659   else if (Ebene = 3)
1660      if (LangSTastatur = 1)
1661         send �
1662      else
1663         SendUnicodeChar(0x017F) ; langes s
1664   else if (Ebene = 5)
1665      SendUnicodeChar(0x03C2) ; varsigma
1666   else if (Ebene = 6)
1667      SendUnicodeChar(0x2218) ; Verkn�pfungsoperator
1668return
1669
1670
1671neo_tot3:
1672   EbeneAktualisieren()
1673   if (Ebene = 1)
1674   {
1675      deadUni(0x02DC)  ; tilde, tot
1676      DeadKey := "t1"
1677   }
1678   else if (Ebene = 2)
1679   {
1680      deadUni(0x00AF)  ; macron, tot
1681      DeadKey := "t2"
1682   }
1683   else if (Ebene = 3)
1684   {
1685      deadUni(0x00A8)  ; diaerese
1686      DeadKey := "t3"
1687   }
1688   else if (Ebene = 4)
1689   {
1690      deadUni(0x002F)  ; Schr�gstrich, tot
1691      DeadKey := "t4"
1692   }
1693   else if (Ebene = 5)
1694   {
1695      deadUni(0x02DD)  ;doppelakut
1696      DeadKey := "t5"
1697   }
1698   else if (Ebene = 6)
1699   {
1700      deadUni(0x02CF)  ; komma drunter, tot
1701      DeadKey := "t6"
1702   }
1703   
1704return
1705
1706
1707/*
1708   ------------------------------------------------------
1709   Reihe 3
1710   ------------------------------------------------------
1711*/
1712
1713neo_u:
1714   EbeneAktualisieren()
1715   if (Ebene12 and !(CheckDeadUni12("a1",0x00FA,0x00DA)
1716                  or CheckDeadUni12("a2",0x00F9,0x00D9)
1717                  or CheckDeadUni12("a5",0x0173,0x0172)
1718                  or CheckDeadUni12("a6",0x016F,0x016E)
1719                  or CheckDeadUni12("c1",0x00FB,0x00DB)
1720                  or CheckDeadUni12("c2",0x01D4,0x01D3)
1721                  or CheckDeadUni12("c3",0x016D,0x016C)
1722                  or CheckDeadUni12("t1",0x0169,0x0168)
1723                  or CheckDeadUni12("t2",0x016B,0x016A)
1724                  or CheckDeadAsc12("t3","�","�")
1725                  or CheckDeadUni12("t5",0x0171,0x0170)))
1726      OutputChar("u","U")
1727   else if (Ebene = 3)
1728      send {blind}\
1729   else if (Ebene = 4)
1730      Send {blind}{Home}
1731   else if (Ebene = 5)
1732   {
1733       CompKey := PriorCompKey
1734       DeadKey := PriorDeadKey
1735   } ; leer
1736   else if (Ebene = 6)
1737      SendUnicodeChar(0x222E) ; contour integral
1738return
1739
1740neo_i:
1741   EbeneAktualisieren()
1742   if (Ebene12 and !(CheckDeadUni12("a1",0x00ED,0x00CD)
1743                  or CheckDeadUni12("a2",0x00EC,0x00CC)
1744                  or CheckDeadUni12("a4",0x012F,0x012E)
1745                  or CheckDeadUni12("a5",0x0131,0x0130)
1746                  or CheckDeadUni12("c1",0x00EE,0x00CE)
1747                  or CheckDeadUni12("c2",0x01D0,0x01CF)
1748                  or CheckDeadUni12("c3",0x012D,0x012C)
1749                  or CheckDeadUni12("t1",0x0129,0x0128)
1750                  or CheckDeadUni12("t2",0x012B,0x012A)
1751                  or CheckDeadAsc12("t3","�","�")))
1752      OutputChar("i","I")
1753   else if (Ebene = 3)
1754      send {blind}`/
1755   else if (Ebene = 4)
1756      Send {Blind}{Left}
1757   else if (Ebene = 5    )
1758      SendUnicodeChar(0x03B9) ; iota
1759   else if (Ebene = 6)
1760      SendUnicodeChar(0x222B) ; integral
1761return
1762
1763neo_a:
1764   EbeneAktualisieren()
1765   if (Ebene12 and !(CheckDeadUni12("a1",0x00E1,0x00C1)
1766                  or CheckDeadUni12("a2",0x00E0,0x00C0)
1767                  or CheckDeadUni12("a5",0x0105,0x0104)
1768                  or CheckDeadAsc12("a6","�","�")
1769                  or CheckDeadUni12("c1",0x00E2,0x00C2)
1770                  or CheckDeadUni12("c2",0x01CE,0x01CD)
1771                  or CheckDeadUni12("c3",0x0103,0x0102)
1772                  or CheckDeadUni12("t1",0x00E3,0x00C3)
1773                  or CheckDeadUni12("t2",0x0101,0x0100)
1774                  or CheckDeadAsc12("t3","�","�")))
1775      OutputChar("a","A")
1776   else if (Ebene = 3)
1777      send {blind}{{}   ; }
1778   else if (Ebene = 4)
1779      Send {Blind}{Down}
1780   else if (Ebene = 5)
1781      SendUnicodeChar(0x03B1) ;alpha
1782   else if (Ebene = 6)
1783      SendUnicodeChar(0x2200) ;fuer alle   
1784return
1785
1786neo_e:
1787   EbeneAktualisieren()
1788   if (Ebene12 and !(CheckDeadUni12("a1",0x00E9,0x00C9)
1789                  or CheckDeadUni12("a2",0x00E8,0x00C8)
1790                  or CheckDeadUni12("a4",0x0117,0x0116)
1791                  or CheckDeadUni12("a5",0x0119,0x0118)
1792                  or CheckDeadUni12("c1",0x00EA,0x00CA)
1793                  or CheckDeadUni12("c2",0x011B,0x011A)
1794                  or CheckDeadUni12("c3",0x0115,0x0114)
1795                  or CheckDeadUni12("t2",0x0113,0x0112)
1796                  or CheckDeadAsc12("t3","�","�")
1797                  or CheckCompAsc12("a","�","�")
1798                  or CheckCompAsc12("A","�","�")
1799                  or CheckCompAsc12("o","�","�")
1800                  or CheckCompAsc12("O","�","�")))
1801      OutputChar("e","E")
1802   else if (Ebene = 3)      ; {
1803      send {blind}{}}
1804   else if (Ebene = 4)
1805      Send {Blind}{Right}
1806   else if (Ebene = 5)
1807        SendUnicodeChar(0x03B5) ;epsilon
1808   else if (Ebene = 6)
1809        SendUnicodeChar(0x2203) ;es existiert   
1810return
1811
1812neo_o:
1813   EbeneAktualisieren()
1814   if (Ebene12 and !(CheckDeadUni12("a1",0x00F3,0x00D3)
1815                  or CheckDeadUni12("a2",0x00F2,0x00D2)
1816                  or CheckDeadUni12("a5",0x01EB,0x01EA)
1817                  or CheckDeadUni12("c1",0x00F4,0x00D4)
1818                  or CheckDeadUni12("c2",0x01D2,0x01D1)
1819                  or CheckDeadUni12("c3",0x014F,0x014E)
1820                  or CheckDeadUni12("t1",0x00F5,0x00D5)
1821                  or CheckDeadUni12("t2",0x014D,0x014C)
1822                  or CheckDeadAsc12("t3","�","�")
1823                  or CheckDeadUni12("t4",0x00F8,0x00D8)
1824                  or CheckDeadUni12("t5",0x0151,0x0150)))
1825      OutputChar("o","O")
1826   else if (Ebene = 3)
1827      send {blind}*
1828   else if (Ebene = 4)
1829      Send {blind}{End}
1830   else if (Ebene = 5)
1831      SendUnicodeChar(0x03BF) ; omicron
1832   else if (Ebene = 6)
1833      SendUnicodeChar(0x2208) ; element of
1834return
1835
1836neo_s:
1837   EbeneAktualisieren()
1838   if (Ebene12 and !(CheckDeadUni12("a1",0x015B,0x015A)
1839                  or CheckDeadUni12("a3",0x015F,0x015E)
1840                  or CheckDeadUni12("a4",0x1E61,0x1E60)
1841                  or CheckDeadUni12("c1",0x015D,0x015C)
1842                  or CheckDeadUni12("c2",0x0161,0x0160)
1843                  or CheckDeadUni12("c6",0x1E63,0x1A62)))
1844      if (LangSTastatur = 1)
1845         if (GetKeyState("CapsLock","T") xor (Ebene = 1))
1846            SendUnicodeChar(0x017F) ; langes s
1847         else
1848            OutputChar("s","S")
1849      else
1850         OutputChar("s","S")
1851   else if (Ebene = 3)
1852      send {blind}?
1853   else if (Ebene = 4)
1854      Send �
1855   else if (Ebene = 5)
1856      SendUnicodeChar(0x03C3) ;sigma
1857   else if (Ebene = 6)
1858      SendUnicodeChar(0x03A3)  ; Sigma
1859return
1860
1861neo_n:
1862   EbeneAktualisieren()
1863   if (Ebene12 and !(CheckDeadUni12("a1",0x0144,0x0143)
1864                  or CheckDeadUni12("a3",0x0146,0x0145)
1865                  or CheckDeadUni12("a4",0x1E45,0x1E44)
1866                  or CheckDeadUni12("c2",0x0148,0x0147)
1867                  or CheckDeadUni12("t1",0x00F1,0x00D1)))
1868      OutputChar("n","N")
1869   else if (Ebene = 3)
1870      send {blind}(                 ; )
1871   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x2074)
1872                           or CheckDeadUni("c5",0x2084)))
1873      Send {blind}{NumPad4}
1874   else if (Ebene = 5)
1875      SendUnicodeChar(0x03BD) ; nu
1876   else if (Ebene = 6)
1877      SendUnicodeChar(0x2115) ; N (nat�rliche Zahlen)
1878return
1879
1880neo_r:
1881   EbeneAktualisieren()
1882   if (Ebene12 and !(CheckDeadUni12("a1",0x0155,0x0154)
1883                  or CheckDeadUni12("a3",0x0157,0x0156)
1884                  or CheckDeadUni12("a4",0x0E59,0x0E58)
1885                  or CheckDeadUni12("c2",0x0159,0x0158)
1886                  or CheckDeadUni12("c6",0x1E5B,0x1E5A)
1887                  or CheckCompAsc12("o","�","�")
1888                  or CheckCompAsc12("O","�","�")))
1889      OutputChar("r","R")
1890   else if (Ebene = 3)                ;(
1891      send {blind})
1892   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x2075)
1893                           or CheckDeadUni("c5",0x2085)))
1894      Send {blind}{NumPad5}
1895   else if (Ebene = 5)
1896      SendUnicodeChar(0x03F1) ; rho symbol (varrho)
1897   else if (Ebene = 6)
1898      SendUnicodeChar(0x211D) ; R (reelle Zahlen)
1899return
1900
1901neo_t:
1902   EbeneAktualisieren()
1903   if (Ebene12 and !(CheckDeadUni12("a3",0x0163,0x0162)
1904                  or CheckDeadUni12("a4",0x1E6B,0x1E6A)
1905                  or CheckDeadUni12("c2",0x0165,0x0164)
1906                  or CheckDeadUni12("c5",0x0167,0x0166)
1907                  or CheckDeadUni12("c6",0x1E6D,0x1E6C)))
1908      OutputChar("t","T")
1909   else if (Ebene = 3)
1910      send {blind}- ; Bis
1911   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x2076)
1912                           or CheckDeadUni("c5",0x2086)))
1913      Send {blind}{NumPad6}
1914   else if (Ebene = 5)
1915      SendUnicodeChar(0x03C4) ; tau
1916   else if (Ebene = 6)
1917      SendUnicodeChar(0x2202 ) ; partielle Ableitung
1918return
1919
1920neo_d:
1921   EbeneAktualisieren()
1922   if (Ebene12 and !(CheckDeadUni12("a4",0x1E0B,0x1E0A)
1923                  or CheckDeadUni12("c2",0x010F,0x010E)
1924                  or CheckDeadUni12("c5",0x0111,0x0110)
1925                  or CheckDeadUni12("c6",0x1E0D,0x1E0C)
1926                  or CheckDeadUni12("t4",0x00F0,0x00D0)))
1927      OutputChar("d","D")
1928   else if (Ebene = 3)
1929      send {blind}:
1930   else if (Ebene = 4)
1931                send `,
1932   else if (Ebene = 5)
1933      SendUnicodeChar(0x03B4) ;delta
1934   else if (Ebene = 6)
1935      SendUnicodeChar(0x0394)  ; Delta
1936return
1937
1938neo_y:
1939   EbeneAktualisieren()
1940   if (Ebene12 and !(CheckDeadUni12("a1",0x00FD,0x00DD)
1941                  or CheckDeadUni12("c1",0x0177,0x0176)
1942                  or CheckDeadAsc12("t3","�",�)))
1943      OutputChar("y","Y")
1944   else if (Ebene = 3)
1945      send {blind}@
1946   else if (Ebene = 4)
1947      Send {blind}.
1948   else if (Ebene = 5)
1949      SendUnicodeChar(0x03C5) ; upsilon
1950   else if (Ebene = 6)
1951      SendUnicodeChar(0x2207) ; nabla
1952return
1953
1954/*
1955   ------------------------------------------------------
1956   Reihe 4
1957   ------------------------------------------------------
1958*/
1959
1960neo_�:
1961   EbeneAktualisieren()
1962   if (Ebene12 and !(CheckDeadUni12("a1",0x01D8,0x01D7)
1963                  or CheckDeadUni12("a2",0x01DC,0x01DB)
1964                  or CheckDeadUni12("c2",0x01DA,0x01D9)
1965                  or CheckDeadUni12("t2",0x01D6,0x01D5)))
1966      OutputChar("�","�")
1967   else if (Ebene = 3)
1968      send {blind}{#}
1969   else if (Ebene = 4)
1970      Send {blind}{Esc}
1971   else if (Ebene = 5)
1972   {
1973      DeadKey := PriorDeadKey
1974      CompKey := PriorCompKey
1975   } ; leer
1976   else if (Ebene = 6)
1977      SendUnicodeChar(0x221D) ; proportional
1978return
1979
1980neo_�:
1981   EbeneAktualisieren()
1982   if (Ebene12 and !(CheckDeadUni12("t2",0x022B,0x022A)))
1983      OutputChar("�","�")
1984   else if (Ebene = 3)
1985      send {blind}$
1986   else if (Ebene = 4)
1987      send {blind}{Tab}
1988   else if (Ebene = 5)
1989   {
1990      DeadKey := PriorDeadKey
1991      CompKey := PriorCompKey
1992   } ; leer
1993   else if (Ebene = 6)
1994      SendUnicodeChar(0x2111) ; Fraktur I
1995return
1996
1997neo_�:
1998   EbeneAktualisieren()
1999   if (Ebene12 and !(CheckDeadUni12("t2",0x01DF,0x01DE)))
2000      OutputChar("�","�")
2001   else if (Ebene = 3)
2002      send {blind}|
2003   else if (Ebene = 4)
2004      Send {blind}{PgDn}    ; Next
2005   else if (Ebene = 5)
2006      SendUnicodeChar(0x03B7) ; eta
2007   else if (Ebene = 6)
2008      SendUnicodeChar(0x211C) ; altes R
2009return
2010
2011neo_p:
2012   EbeneAktualisieren()
2013   if (Ebene12 and !(CheckDeadUni12("a4",0x1E57,0x1E56)))
2014      OutputChar("p","P")
2015   else if ((Ebene = 3) and !(CheckDeadUni("t1",0x2248)))
2016      send {blind}~
2017   else if (Ebene = 4)
2018        Send {blind}{Enter}
2019   else if (Ebene = 5)
2020      SendUnicodeChar(0x03C0) ;pi
2021   else if (Ebene = 6)
2022      SendUnicodeChar(0x03A0)  ; Pi
2023return
2024
2025neo_z:
2026   EbeneAktualisieren()
2027   if (Ebene12 and !(CheckDeadUni12("a1",0x017A,0x0179)
2028                  or CheckDeadUni12("a4",0x017C,0x017B)
2029                  or CheckDeadUni12("c2",0x017E,0x017D)
2030                  or CheckDeadUni12("c6",0x1E93,0x1E92)))
2031      OutputChar("z","Z")
2032   else if (Ebene = 3)
2033      send ``{space} ; untot
2034   else if (Ebene = 4)
2035   {
2036      DeadKey := PriorDeadKey
2037      CompKey := PriorCompKey
2038   } ; leer
2039   else if (Ebene = 5)
2040      SendUnicodeChar(0x03B6) ;zeta
2041   else if (Ebene = 6)
2042      SendUnicodeChar(0x2124)  ; Z (ganze Zahlen)
2043return
2044
2045neo_b:
2046   EbeneAktualisieren()
2047   if (Ebene12 and !(CheckDeadUni12("a4",0x1E03,0x1E02)))
2048      OutputChar("b","B")
2049   else if (Ebene = 3)
2050      send {blind}{+}
2051   else if (Ebene = 4)
2052      send {blind}:
2053   else if (Ebene = 5)
2054      SendUnicodeChar(0x03B2) ; beta
2055   else if (Ebene = 6)
2056      SendUnicodeChar(0x21D2) ; Doppel-Pfeil rechts
2057return
2058
2059neo_m:
2060   EbeneAktualisieren()
2061   if (Ebene12 and !(CheckDeadUni12("a4",0x1E41,0x1E40)
2062                  or CheckDeadUni12("c6",0x1E43,0x1E42)
2063                  or CheckCompUni12("t",0x2122,0x2122)        ; TM
2064                  or CheckCompUni12("T",0x2122,0x2122)        ; TM
2065                  or CheckCompUni12("s",0x2120,0x2120)        ; SM
2066                  or CheckCompUni12("S",0x2120,0x2120)))      ; SM
2067
2068      OutputChar("m","M")
2069   else if (Ebene = 3)
2070      send {blind}`%
2071   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x00B9)
2072                           or CheckDeadUni("c5",0x2081)))
2073      Send {blind}{NumPad1}
2074   else if (Ebene = 5)
2075      SendUnicodeChar(0x03BC) ; griechisch mu, micro w�re 0x00B5
2076   else if (Ebene = 6)
2077      SendUnicodeChar(0x21D4) ; doppelter Doppelpfeil (genau dann wenn)
2078return
2079
2080neo_komma:
2081   EbeneAktualisieren()
2082   if (Ebene = 1)
2083      if (GetKeyState("CapsLock","T"))
2084         send {blind}{Shift down},{Shift up}
2085      else
2086         send {blind},
2087   else if (Ebene = 2)
2088       SendUnicodeChar(0x22EE) ;  vertikale ellipse
2089   else if (Ebene = 3)
2090      send {blind}"
2091   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x00B2)
2092                           or CheckDeadUni("c5",0x2082)))
2093      Send {blind}{NumPad2}
2094   else if (Ebene = 5)
2095      SendUnicodeChar(0x03C1) ; rho
2096   else if (Ebene = 6)
2097      SendUnicodeChar(0x21D0) ; Doppelpfeil links
2098return
2099
2100neo_punkt:
2101   EbeneAktualisieren()
2102   if (Ebene = 1)
2103      if (GetKeyState("CapsLock","T"))
2104         send {blind}{Shift down}.{Shift up}
2105      else
2106         send {blind}.
2107   else if (Ebene = 2)
2108      SendUnicodeChar(0x2026)  ; ellipse
2109   else if (Ebene = 3)
2110      send {blind}'
2111   else if ((Ebene = 4) and !(CheckDeadUni("c1",0x00B3)
2112                           or CheckDeadUni("c5",0x2083)))
2113      Send {blind}{NumPad3}
2114   else if (Ebene = 5)
2115      SendUnicodeChar(0x03D1) ; theta symbol (vartheta)
2116   else if (Ebene = 6)
2117      SendUnicodeChar(0x0398)  ; Theta
2118return
2119
2120
2121neo_j:
2122   EbeneAktualisieren()
2123   if (Ebene12 and !(CheckDeadUni12("c1",0x0135,0x0134)
2124                  or CheckDeadUni12("c2",0x01F0,"")
2125                  or CheckCompUni12("i",0x0133,"")          ; ij
2126                  or CheckCompUni12("I","",0x0132)          ; IJ
2127                  or CheckCompUni12("l",0x01C9,"")          ; lj
2128                  or CheckCompUni12("L",0x01C8,0x01C7)      ; Lj/LJ
2129                  or CheckCompUni12("n",0x01CC,"")          ; nj
2130                  or CheckCompUni12("N",0x01CB,0x01CA)))    ; Nj/NJ
2131      OutputChar("j","J")
2132   else if (Ebene = 3)
2133      send {blind}`;
2134   else if (Ebene = 4)
2135      Send {blind}`;
2136   else if (Ebene = 5)
2137      SendUnicodeChar(0x03B8) ; theta
2138   else if (Ebene = 6)
2139      SendUnicodeChar(0x2261) ; identisch
2140return
2141
2142/*
2143   ------------------------------------------------------
2144   Numpad
2145   ------------------------------------------------------
2146
2147   folgende Tasten verhalten sich bei ein- und ausgeschaltetem
2148   NumLock gleich:
2149*/
2150
2151neo_NumpadDiv:
2152   EbeneAktualisieren()
2153   if ((Ebene = 1) or (Ebene = 2))
2154      send {blind}{NumpadDiv}
2155   else if (Ebene = 3)
2156      send {blind}�
2157   else if ((Ebene = 4) or (Ebene = 5))
2158      SendUnicodeChar(0x2215)   ; slash
2159return
2160
2161neo_NumpadMult:
2162   EbeneAktualisieren()
2163   if ((Ebene = 1) or (Ebene = 2))
2164      send {blind}{NumpadMult}
2165   else if (Ebene = 3)
2166      send {blind}�
2167   else if ((Ebene = 4) or (Ebene = 5))
2168      SendUnicodeChar(0x22C5)  ; cdot
2169return
2170
2171neo_NumpadSub:
2172   EbeneAktualisieren()
2173   if (((Ebene = 1) or (Ebene = 2)) and !(CheckDeadUni("c1",0x207B)
2174                                       or CheckDeadUni("c5",0x208B)))
2175      send {blind}{NumpadSub}
2176   else if (Ebene = 3)
2177      SendUnicodeChar(0x2212) ; echtes minus
2178return
2179
2180neo_NumpadAdd:
2181   EbeneAktualisieren()
2182   if (((Ebene = 1) or (Ebene = 2)) and !(CheckDeadUni("c1",0x207A)
2183                                       or CheckDeadUni("c5",0x208A)))
2184      send {blind}{NumpadAdd}
2185   else if (Ebene = 3)
2186      send {blind}�
2187   else if ((Ebene = 4) or (Ebene = 5))
2188      SendUnicodeChar(0x2213)   ; -+
2189return
2190
2191neo_NumpadEnter:
2192   EbeneAktualisieren()
2193   if ((Ebene = 1) or (Ebene = 2))
2194      send {blind}{NumpadEnter}     
2195   else if (Ebene = 3)
2196      SendUnicodeChar(0x2260) ; neq
2197   else if ((Ebene = 4) or (Ebene = 5))
2198      SendUnicodeChar(0x2248) ; approx
2199return
2200
2201/*
2202   folgende Tasten verhalten sich bei ein- und ausgeschaltetem NumLock
2203   unterschiedlich
2204*/
2205
2206
2207
2208neo_Numpad7:
2209   EbeneAktualisieren()
2210   if      ((Ebene = 1) and (NumLock = 0))
2211      send {blind}{NumpadHome}
2212   else if ((Ebene = 2) and (NumLock = 1))
2213      send {blind}{Shift up}{NumpadHome}{Shift down}
2214   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2215   {
2216      if (Ebene = 1)
2217         send {blind}{Numpad7}
2218      else
2219         send {blind){Shift up}{Numpad7}{Shift down}
2220
2221      if (PriorDeadKey = "comp")
2222         CompKey := "Num_7"
2223   }
2224   else if (Ebene = 3)
2225      SendUnicodeChar(0x2195)   ; Hoch-Runter-Pfeil
2226   else if ((Ebene = 4) or (Ebene = 5))
2227      SendUnicodeChar(0x226A)  ; ll
2228return
2229
2230neo_Numpad8:
2231   EbeneAktualisieren()
2232   if      ((Ebene = 1) and (NumLock = 0))
2233      send {blind}{NumpadUp}
2234   else if ((Ebene = 2) and (NumLock = 1))
2235      send {blind}{Shift up}{NumpadUp}{Shift down}
2236   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2237   {
2238      if !(CheckCompUni("Num_1",0x215B) ; 1/8
2239        or CheckCompUni("1",0x215B)     ; 1/8
2240        or CheckCompUni("Num_3",0x215C) ; 3/8
2241        or CheckCompUni("3",0x215C)     ; 3/8
2242        or CheckCompUni("Num_5",0x215D) ; 3/8
2243        or CheckCompUni("5",0x215D)     ; 5/8
2244        or CheckCompUni("Num_7",0x215E) ; 7/8
2245        or CheckCompUni("7",0x215E))    ; 7/8
2246         if (Ebene = 1)
2247            send {blind}{Numpad8}
2248         else
2249            send {blind){Shift up}{Numpad8}{Shift down}
2250
2251      if (PriorDeadKey = "comp")
2252         CompKey := "Num_8"
2253   }
2254   else if (Ebene = 3)
2255      SendUnicodeChar(0x2191)     ; uparrow
2256   else if ((Ebene = 4) or (Ebene = 5))
2257      SendUnicodeChar(0x2229)    ; intersection
2258return
2259
2260neo_Numpad9:
2261   EbeneAktualisieren()
2262   if      ((Ebene = 1) and (NumLock = 0))
2263      send {blind}{NumpadPgUp}
2264   else if ((Ebene = 2) and (NumLock = 1))
2265      send {blind}{Shift up}{NumpadPgUp}{Shift down}
2266   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2267   {
2268      if (Ebene = 1)
2269         send {blind}{Numpad9}
2270      else
2271         send {blind){Shift up}{Numpad9}{Shift down}
2272
2273      if (PriorDeadKey = "comp")
2274         CompKey := "Num_9"
2275   }
2276   else if (Ebene = 3)
2277      SendUnicodeChar(0x2297) ; Tensorprodukt ; Vektor in die Ebene zeigend
2278   else if ((Ebene = 4) or (Ebene = 5))
2279      SendUnicodeChar(0x226B)  ; gg
2280return
2281
2282
2283
2284neo_Numpad4:
2285   EbeneAktualisieren()
2286   if      ((Ebene = 1) and (NumLock = 0))
2287      send {blind}{NumpadLeft}
2288   else if ((Ebene = 2) and (NumLock = 1))
2289      send {blind}{Shift up}{NumpadLeft}{Shift down}
2290   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2291   {
2292      if !(CheckCompUni("Num_1",0x00BC) ; 1/4
2293        or CheckCompUni("1",0x00BE)     ; 1/4
2294        or CheckCompUni("Num_3",0x00BE) ; 3/4
2295        or CheckCompUni("3",0x00BE))    ; 3/4
2296         if (Ebene = 1)
2297            send {blind}{Numpad4}
2298         else
2299            send {blind){Shift up}{Numpad4}{Shift down}
2300
2301      if (PriorDeadKey = "comp")
2302         CompKey := "Num_4"
2303   }
2304   else if (Ebene = 3)
2305      SendUnicodeChar(0x2190)     ; leftarrow
2306   else if ((Ebene = 4) or (Ebene = 5))
2307      SendUnicodeChar(0x2282)  ; subset of
2308return
2309
2310neo_Numpad5:
2311   EbeneAktualisieren()
2312   if      ((Ebene = 1) and (NumLock = 0))
2313      send {blind}{NumpadClear}
2314   else if ((Ebene = 2) and (NumLock = 1))
2315      send {blind}{Shift up}{NumpadClear}{Shift down}
2316   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2317   {
2318      if !(CheckCompUni("Num_1",0x2155) ; 1/5
2319        or CheckCompUni("1",0x2155)     ; 1/5
2320        or CheckCompUni("Num_2",0x2156) ; 2/5
2321        or CheckCompUni("2",0x2156)     ; 2/5
2322        or CheckCompUni("Num_3",0x2157) ; 3/5
2323        or CheckCompUni("3",0x2157)     ; 3/5
2324        or CheckCompUni("Num_4",0x2158) ; 4/5
2325        or CheckCompUni("4",0x2158))    ; 4/5
2326         if (Ebene = 1)
2327            send {blind}{Numpad5}
2328         else
2329            send {blind){Shift up}{Numpad5}{Shift down}
2330
2331      if (PriorDeadKey = "comp")
2332         CompKey := "Num_5"
2333   }
2334   else if (Ebene = 3)
2335      SendUnicodeChar(0x221E) ; INFINITY
2336   else if ((Ebene = 4) or (Ebene = 5))
2337      SendUnicodeChar(0x220B) ; enth�lt das Element
2338return
2339
2340neo_Numpad6:
2341   EbeneAktualisieren()
2342   if      ((Ebene = 1) and (NumLock = 0))
2343      send {blind}{NumpadRight}
2344   else if ((Ebene = 2) and (NumLock = 1))
2345      send {blind}{Shift up}{NumpadRight}{Shift down}
2346   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2347   {
2348      if !(CheckCompUni("Num_1",0x2159) ; 1/6
2349        or CheckCompUni("1",0x2159)     ; 1/6
2350        or CheckCompUni("Num_5",0x215A) ; 5/6
2351        or CheckCompUni("5",0x215A))    ; 5/6
2352         if (Ebene = 1)
2353            send {blind}{Numpad6}
2354         else
2355            send {blind){Shift up}{Numpad6}{Shift down}
2356
2357      if (PriorDeadKey = "comp")
2358         CompKey := "Num_6"
2359   }
2360   else if (Ebene = 3)
2361      SendUnicodeChar(0x2192)     ; rightarrow
2362   else if ((Ebene = 4) or (Ebene = 5))
2363      SendUnicodeChar(0x2283) ; superset of
2364return
2365
2366neo_Numpad1:
2367   EbeneAktualisieren()
2368   if      ((Ebene = 1) and (NumLock = 0))
2369      send {blind}{NumpadEnd}
2370   else if ((Ebene = 2) and (NumLock = 1))
2371      send {blind}{Shift up}{NumpadEnd}{Shift down}
2372   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2373   {
2374      if (Ebene = 1)
2375         send {blind}{Numpad1}
2376      else
2377         send {blind){Shift up}{Numpad1}{Shift down}
2378
2379      if (PriorDeadKey = "comp")
2380         CompKey := "Num_1"
2381   }
2382   else if (Ebene = 3)
2383      SendUnicodeChar(0x2194) ; Links-Rechts-Pfeil
2384   else if ((Ebene = 4) or (Ebene = 5))
2385      SendUnicodeChar(0x2264)   ; leq
2386return
2387
2388neo_Numpad2:
2389   EbeneAktualisieren()
2390   if      ((Ebene = 1) and (NumLock = 0))
2391      send {blind}{NumpadDown}
2392   else if ((Ebene = 2) and (NumLock = 1))
2393      send {blind}{Shift up}{NumpadDown}{Shift down}
2394   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2395   {
2396      if !(CheckCompUni("Num_1",0x00BD) ; 1/2
2397        or CheckCompUni("1",0x00BD))    ; 1/2
2398         if (Ebene = 1)
2399            send {blind}{Numpad2}
2400         else
2401            send {blind){Shift up}{Numpad2}{Shift down}
2402
2403      if (PriorDeadKey = "comp")
2404         CompKey := "Num_2"
2405   }
2406   else if (Ebene = 3)
2407      SendUnicodeChar(0x2193)     ; downarrow
2408   else if ((Ebene = 4) or (Ebene = 5))
2409      SendUnicodeChar(0x222A)  ; vereinigt
2410return
2411
2412neo_Numpad3:
2413   EbeneAktualisieren()
2414   if      ((Ebene = 1) and (NumLock = 0))
2415      send {blind}{NumpadPgDn}
2416   else if ((Ebene = 2) and (NumLock = 1))
2417      send {blind}{Shift up}{NumpadPgDn}{Shift down}
2418   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2419   {
2420      if !(CheckCompUni("Num_1",0x2153) ; 1/3
2421        or CheckCompUni("1",0x2154)     ; 1/3
2422        or CheckCompUni("Num_2",0x2154) ; 2/3
2423        or CheckCompUni("2",0x2154))    ; 2/3
2424         if (Ebene = 1)
2425            send {blind}{Numpad3}
2426         else
2427            send {blind){Shift up}{Numpad3}{Shift down}
2428
2429      if (PriorDeadKey = "comp")
2430         CompKey := "Num_3"
2431   }
2432   else if (Ebene = 3)
2433      SendUnicodeChar(0x21CC) ; RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
2434   else if ((Ebene = 4) or (Ebene = 5))
2435      SendUnicodeChar(0x2265)  ; geq
2436return
2437
2438neo_Numpad0:
2439   EbeneAktualisieren()
2440   if      ((Ebene = 1) and (NumLock = 0))
2441      send {blind}{NumpadIns}
2442   else if ((Ebene = 2) and (NumLock = 1))
2443      send {blind}{Shift up}{NumpadIns}{Shift down}
2444   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2445   {
2446      if (Ebene = 1)
2447         send {blind}{Numpad0}
2448      else
2449         send {blind){Shift up}{Numpad0}{Shift down}
2450
2451      if (PriorDeadKey = "comp")
2452         CompKey := "Num_0"
2453   }
2454   else if (Ebene = 3)
2455      send {blind}`%
2456   else if ((Ebene = 4) or (Ebene = 5))
2457      send �
2458return
2459
2460neo_NumpadDot:
2461   EbeneAktualisieren()
2462   if      ((Ebene = 1) and (NumLock = 0))
2463      send {blind}{NumpadDel}
2464   else if ((Ebene = 2) and (NumLock = 1))
2465      send {blind}{Shift up}{NumpadDel}{Shift down}
2466   else if (((Ebene = 1) and (NumLock = 1)) or ((Ebene = 2) and (NumLock = 0)))
2467      if (Ebene = 1)
2468         send {blind}{NumpadDot}
2469      else
2470         send {blind){Shift up}{NumpadDot}{Shift down}
2471   else if (Ebene = 3)
2472      send {blind}.
2473   else if ((Ebene = 4) or (Ebene = 5))
2474      send `,
2475return
2476
2477
2478/*
2479   ------------------------------------------------------
2480   Sondertasten
2481   ------------------------------------------------------
2482*/
2483*space::
2484   if ((einHandNeo))
2485    spacepressed := 1
2486   else
2487    goto neo_SpaceUp
2488return
2489
2490*space up::
2491   if ((einHandNeo))
2492   {
2493     if ((keypressed))
2494     {
2495       keypressed := 0
2496       spacepressed := 0   
2497     }
2498     else
2499     {
2500        goto neo_SpaceUp
2501     }
2502   }
2503   else
2504     { } ;do nothing
2505return
2506
2507neo_SpaceUp:
2508     EbeneAktualisieren()
2509     if      ((Ebene = 1) and !(CheckComp3Uni("r_1",0x2170)          ; r�misch i
2510                             or CheckComp3Uni("R_1",0x2160)))      ; r�misch I
2511        Send {blind}{Space}
2512     else if  ((Ebene = 2) or (Ebene = 3))
2513        Send {blind}{Space}
2514     else if (Ebene = 4)
2515        if (PriorDeadKey = "c1")            ; circumflex
2516           BSSendUnicodeChar(0x2070)
2517        else if (PriorDeadKey = "c5")       ; toter -
2518           BSSendUnicodeChar(0x2080)
2519        else
2520           Send {blind}{NumPad0}
2521     else if (Ebene = 5)
2522        SendUnicodeChar(0x00A0)   ; gesch�tztes Leerzeichen
2523     else if (Ebene = 6)
2524        SendUnicodeChar(0x202F) ; schmales Leerzeichen
2525     DeadKey := ""   CompKey := ""
2526  spacepressed := 0     
2527  keypressed := 0       
2528return
2529
2530/*
2531   Folgende Tasten sind nur aufgef�hrt, um PriorDeadKey zu leeren.
2532   Irgendwie sieht das noch nicht sch�n aus. Vielleicht l�sst sich dieses
2533   Problem irgendwie eleganter l�sen...
2534   
2535   Nachtrag:
2536   Weil es mit Alt+Tab Probleme gab, wird hier jetzt erstmal rumgeflickschustert,
2537   bis eine allgemeinere L�sung gefunden wurde.
2538*/
2539
2540*Enter::
2541   if (not(lernModus) or lernModus_std_Return)
2542   {
2543     send {Blind}{Enter}
2544     DeadKey := ""   CompKey := ""
2545   }
2546return
2547
2548*Backspace::
2549   if (not(lernModus) or lernModus_std_Backspace)
2550   {
2551     send {Blind}{Backspace}
2552     DeadKey := ""   CompKey := ""
2553   }
2554return
2555
2556*Del::
2557   if (not(lernModus) or lernModus_std_Entf)
2558     send {Blind}{Del}
2559return
2560
2561*Ins::
2562   if (not(lernModus) or lernModus_std_Einf)
2563     send {Blind}{Ins}
2564return
2565
2566
2567
2568
2569
2570/*
2571Auf Mod3+Tab liegt Compose.
2572*/
2573
2574neo_tab:
2575   if (IsMod3Pressed()) ;#
2576   {
2577      #Include *i %a_scriptdir%\ComposeLaunch.ahk
2578      #Include *i %a_scriptdir%\Source\ComposeLaunch.ahk
2579      DeadKey := "comp"
2580      CompKey := ""
2581   }
2582   else
2583   {
2584      send {blind}{Tab}
2585      DeadKey := ""
2586      CompKey := ""
2587   }
2588return
2589
2590*Home::
2591   if (not(lernModus) or lernModus_std_Pos1)
2592   {
2593     send {Blind}{Home}
2594     DeadKey := ""   CompKey := ""
2595   }
2596return
2597
2598*End::
2599   if (not(lernModus) or lernModus_std_Ende)
2600   {
2601     send {Blind}{End}
2602     DeadKey := ""   CompKey := ""
2603   }
2604return
2605
2606*PgUp::
2607   if (not(lernModus) or lernModus_std_PgUp)
2608   {
2609     send {Blind}{PgUp}
2610     DeadKey := ""   CompKey := ""
2611   }
2612return
2613
2614*PgDn::
2615   if (not(lernModus) or lernModus_std_PgDn)
2616   {
2617     send {Blind}{PgDn}
2618     DeadKey := ""   CompKey := ""
2619   }
2620return
2621
2622*Up::
2623   if (not(lernModus) or lernModus_std_Hoch)
2624   {
2625     send {Blind}{Up}
2626     DeadKey := ""   CompKey := ""
2627   }
2628return
2629
2630*Down::
2631   if (not(lernModus) or lernModus_std_Runter)
2632   {
2633     send {Blind}{Down}
2634     DeadKey := ""   CompKey := ""
2635   }
2636return
2637
2638*Left::
2639   if (not(lernModus) or lernModus_std_Links)
2640   {
2641     send {Blind}{Left}
2642     DeadKey := ""   CompKey := ""
2643   }
2644return
2645
2646*Right::
2647   if (not(lernModus) or lernModus_std_Rechts)
2648   {
2649     send {Blind}{Right}
2650     DeadKey := ""   CompKey := ""
2651   }
2652return
2653
2654
2655
2656
2657
2658/*
2659   ------------------------------------------------------
2660   Methode KeyboardLED zur Steuerung der Keyboard-LEDs
2661   (NumLock/CapsLock/ScrollLock-Lichter)
2662   
2663   Benutzungshinweise: Man benutze
2664   KeyboardLED(LEDvalue,"Cmd"), wobei
2665   Cmd = on/off/switch,
2666   LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4
2667   bzw. eine beliebige Summe dieser Werte:
2668   AlleAus=0, CapsLock+NumLock=6, etc.
2669   
2670   Der folgende Code wurde �bernommen von:
2671   http://www.autohotkey.com/forum/viewtopic.php?t=10532
2672   
2673   Um eventuelle Wechselwirkungen mit dem bestehenden
2674   Code (insb. der Unicode-Konvertierung) auszuschie�en,
2675   sind auch alle (Hilfsmethoden) mit dem Postfix LED
2676   versehen worden.
2677   ------------------------------------------------------
2678*/
2679
2680KeyboardLED(LEDvalue, Cmd)  ; LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4 ; Cmd = on/off/switch
2681{
2682  Static h_device
2683  If ! h_device ; initialise
2684    {
2685    device =\Device\KeyBoardClass0
2686    SetUnicodeStrLED(fn,device)
2687    h_device:=NtCreateFileLED(fn,0+0x00000100+0x00000080+0x00100000,1,1,0x00000040+0x00000020,0)
2688    }
2689
2690  VarSetCapacity( output_actual, 4, 0 )
2691  input_size = 4
2692  VarSetCapacity( input, input_size, 0 )
2693
2694  If Cmd= switch  ;switches every LED according to LEDvalue
2695   KeyLED:= LEDvalue
2696  If Cmd= on  ;forces all choosen LED's to ON (LEDvalue= 0 ->LED's according to keystate)
2697   KeyLED:= LEDvalue | (GetKeyState("ScrollLock", "T") + 2*GetKeyState("NumLock", "T") + 4*GetKeyState("CapsLock", "T"))
2698  If Cmd= off  ;forces all choosen LED's to OFF (LEDvalue= 0 ->LED's according to keystate)
2699    {
2700    LEDvalue:= LEDvalue ^ 7
2701    KeyLED:= LEDvalue & (GetKeyState("ScrollLock", "T") + 2*GetKeyState("NumLock", "T") + 4*GetKeyState("CapsLock", "T"))
2702    }
2703  ; EncodeIntegerLED( KeyLED, 1, &input, 2 ) ;input bit pattern (KeyLED): bit 0 = scrolllock ;bit 1 = numlock ;bit 2 = capslock
2704  input := Chr(1) Chr(1) Chr(KeyLED)
2705  input := Chr(1)
2706  input=
2707  success := DllCall( "DeviceIoControl"
2708              , "uint", h_device
2709              , "uint", CTL_CODE_LED( 0x0000000b     ; FILE_DEVICE_KEYBOARD
2710                        , 2
2711                        , 0             ; METHOD_BUFFERED
2712                        , 0  )          ; FILE_ANY_ACCESS
2713              , "uint", &input
2714              , "uint", input_size
2715              , "uint", 0
2716              , "uint", 0
2717              , "uint", &output_actual
2718              , "uint", 0 )
2719}
2720
2721CTL_CODE_LED( p_device_type, p_function, p_method, p_access )
2722{
2723  Return, ( p_device_type << 16 ) | ( p_access << 14 ) | ( p_function << 2 ) | p_method
2724}
2725
2726
2727NtCreateFileLED(ByRef wfilename,desiredaccess,sharemode,createdist,flags,fattribs)
2728{
2729  VarSetCapacity(fh,4,0)
2730  VarSetCapacity(objattrib,24,0)
2731  VarSetCapacity(io,8,0)
2732  VarSetCapacity(pus,8)
2733  uslen:=DllCall("lstrlenW","str",wfilename)*2
2734  InsertIntegerLED(uslen,pus,0,2)
2735  InsertIntegerLED(uslen,pus,2,2)
2736  InsertIntegerLED(&wfilename,pus,4)
2737  InsertIntegerLED(24,objattrib,0)
2738  InsertIntegerLED(&pus,objattrib,8)
2739  status:=DllCall("ntdll\ZwCreateFile","str",fh,"UInt",desiredaccess,"str",objattrib,"str",io,"UInt",0,"UInt",fattribs
2740                  ,"UInt",sharemode,"UInt",createdist,"UInt",flags,"UInt",0,"UInt",0, "UInt")
2741  return ExtractIntegerLED(fh)
2742}
2743
2744
2745SetUnicodeStrLED(ByRef out, str_)
2746{
2747  VarSetCapacity(st1, 8, 0)
2748  InsertIntegerLED(0x530025, st1)
2749  VarSetCapacity(out, (StrLen(str_)+1)*2, 0)
2750  DllCall("wsprintfW", "str", out, "str", st1, "str", str_, "Cdecl UInt")
2751}
2752
2753
2754ExtractIntegerLED(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4)
2755; pSource is a string (buffer) whose memory area contains a raw/binary integer at pOffset.
2756; The caller should pass true for pSigned to interpret the result as signed vs. unsigned.
2757; pSize is the size of PSource's integer in bytes (e.g. 4 bytes for a DWORD or Int).
2758; pSource must be ByRef to avoid corruption during the formal-to-actual copying process
2759; (since pSource might contain valid data beyond its first binary zero).
2760{
2761  Loop %pSize%  ; Build the integer by adding up its bytes.
2762    result += *(&pSource + pOffset + A_Index-1) << 8*(A_Index-1)
2763  if (!pIsSigned OR pSize > 4 OR result < 0x80000000)
2764    return result  ; Signed vs. unsigned doesn't matter in these cases.
2765  ; Otherwise, convert the value (now known to be 32-bit) to its signed counterpart:
2766  return -(0xFFFFFFFF - result + 1)
2767}
2768
2769
2770InsertIntegerLED(pInteger, ByRef pDest, pOffset = 0, pSize = 4)
2771; The caller must ensure that pDest has sufficient capacity.  To preserve any existing contents in pDest,
2772; only pSize number of bytes starting at pOffset are altered in it.
2773{
2774  Loop %pSize%  ; Copy each byte in the integer into the structure as raw binary data.
2775    DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
2776}
2777
2778
2779
2780
2781/*
2782   ------------------------------------------------------
2783   Funktionen
2784   ------------------------------------------------------
2785*/
2786
2787/*
2788Ebenen laut Referenz:
27891. Ebene (kein Mod)      4. Ebene (Mod4)
27902. Ebene (Umschalt)      5. Ebene (Umschalt+Mod3)
27913. Ebene (Mod3)          6. Ebene (Mod3+Mod4)
2792*/
2793
2794EbeneAktualisieren()
2795{
2796   global
2797   PriorDeadKey := DeadKey
2798   PriorCompKey := CompKey
2799   DeadKey := ""
2800   CompKey := ""
2801   Ebene12 := 0
2802   Modstate := IsShiftPressed() . IsMod3Pressed() . IsMod4Pressed()
2803
2804   if (ahkTreiberKombi)
2805      if ( Modstate = "001")
2806         Ebene = 6     
2807      else
2808         Ebene = -1
2809   else
2810     if      (Modstate = "000")
2811         Ebene = 1                 ; Ebene 1: Ohne Mod
2812     else if (Modstate = "100")
2813         Ebene = 2                 ; Ebene 2: Shift
2814     else if (Modstate = "010")
2815         Ebene = 3                 ; Ebene 3: Mod3
2816     else if (Modstate = "001")
2817         Ebene = 4                 ; Ebene 4: Mod4
2818     else if (Modstate = "110")
2819         Ebene = 5                 ; Ebene 5: Shift+Mod3
2820     else if (Modstate = "011")
2821         Ebene = 6                 ; Ebene 6: Mod3+Mod4
2822     else if (Modstate = "101")
2823         Ebene = 4                 ; Ebene 7: Shift+Mod4 impliziert Ebene 4
2824     else if (Modstate = "111")
2825         Ebene = 6                 ; Ebene 8: Shift+Mod3+Mod4 impliziert Ebene 6
2826
2827   Ebene12 := ((Ebene = 1) or (Ebene = 2))
2828
2829   if GetKeyState("NumLock","T")
2830     NumLock = 1
2831   else
2832     NumLock = 0
2833}
2834
2835
2836
2837IsShiftPressed()
2838{
2839  return GetKeyState("Shift","P")
2840}
2841
2842IsMod3Pressed()
2843{
2844   global
2845   if (IsMod3Locked)
2846   {
2847       return (not ( GetKeyState("CapsLock","P") or GetKeyState("#","P") ))  ; # = SC02B
2848   }
2849   else {
2850      return ( GetKeyState("CapsLock","P") or GetKeyState("#","P") )  ; # = SC02B
2851   }
2852}
2853
2854IsMod4Pressed()
2855{
2856   global
2857   if( not(einHandNeo) or not(spacepressed) )
2858   {
2859     if (IsMod4Locked)
2860     {
2861         return (not ( GetKeyState("<","P") or GetKeyState("SC138","P")))
2862     }
2863     else {
2864         return ( GetKeyState("<","P") or GetKeyState("SC138","P"))
2865     }
2866   }
2867   else
2868   {
2869     if (IsMod4Locked)
2870     {
2871         return (not ( GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P")))
2872     }
2873     else {
2874         return ( GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P"))
2875     }
2876   }
2877   
2878}
2879
2880
2881SendUnicodeChar(charCode)
2882{
2883   IfWinActive, ahk_class gdkWindowToplevel
2884   {
2885      StringLower, charCode, charCode
2886      send % "^+u" . SubStr(charCode,3) . " "
2887   } else {
2888      VarSetCapacity(ki, 28 * 2, 0)
2889
2890      EncodeInteger(&ki + 0, 1)
2891      EncodeInteger(&ki + 6, charCode)
2892      EncodeInteger(&ki + 8, 4)
2893      EncodeInteger(&ki +28, 1)
2894      EncodeInteger(&ki +34, charCode)
2895      EncodeInteger(&ki +36, 4|2)
2896
2897      DllCall("SendInput", "UInt", 2, "UInt", &ki, "Int", 28)
2898   }
2899}
2900/*
2901�ber den GTK-Workaround:
2902Dieser basiert auf http://www.autohotkey.com/forum/topic32947.html
2903
2904Der Aufruf von �SubStr(charCode,3)� geht davon aus, dass alle charCodes in Hex mit f�hrendem �0x� angegeben sind. Die abenteuerliche �^+u�-Konstruktion ben�tigt im �brigen den Hex-Wert in Kleinschrift, was derzeit nicht bei den Zeichendefinitionen umgesetzt ist, daher zentral und weniger fehlertr�chtig an dieser Stelle. Au�erdem ein abschlie�end gesendetes Space, sonst bleibt der �eingetippte� Unicode-Wert noch kurz sichtbar stehen, bevor er sich GTK-sei-dank in das gew�nschte Zeichen verwandelt.
2905*/
2906
2907
2908BSSendUnicodeChar(charCode)
2909{
2910   send {bs}
2911   SendUnicodeChar(charCode)
2912}
2913
2914CompUnicodeChar(charCode)
2915{
2916   send {bs}
2917   SendUnicodeChar(charCode)
2918}
2919
2920Comp3UnicodeChar(charCode)
2921{
2922   send {bs}{bs}
2923   SendUnicodeChar(charCode)
2924}
2925
2926
2927EncodeInteger(ref, val)
2928{
2929   DllCall("ntdll\RtlFillMemoryUlong", "Uint", ref, "Uint", 4, "Uint", val)
2930}
2931
2932DeadSilence = 0
2933
2934deadAsc(val)
2935{
2936  global
2937  if (DeadSilence)
2938    {} ; keine Ausgabe
2939  else
2940    send % "{blind}" . val
2941}
2942
2943deadUni(val)
2944{
2945  global
2946  if (DeadSilence)
2947    {} ; keine Ausgabe
2948  else
2949    SendUnicodeChar(val)
2950}
2951
2952undeadAsc(val)
2953{
2954  global
2955  if (DeadSilence)
2956    send % "{blind}" . val
2957  else
2958    send % "{blind}{bs}" . val
2959}
2960
2961undeadUni(val)
2962{
2963  global
2964  if (DeadSilence)
2965    {} ; keine ausgabe
2966  else
2967    send {bs}
2968  SendUnicodeChar(val)   
2969}
2970
2971CheckDeadAsc(d,val)
2972{
2973  global
2974  if (PriorDeadKey == d)
2975  {
2976    undeadAsc(val)
2977    return 1
2978  }
2979  else
2980    return 0
2981}
2982
2983CheckDeadUni(d,val)
2984{
2985  global
2986  if (PriorDeadKey == d)
2987  {
2988    undeadUni(val)
2989    return 1
2990  }
2991  else
2992    return 0
2993}
2994
2995CheckDeadAsc12(d,val1,val2)
2996{
2997  global
2998  if (PriorDeadKey == d)
2999  {
3000    if      ((Ebene = 1) and (val1 != ""))
3001    {
3002      undeadAsc(val1)
3003      return 1
3004    }
3005    else if ((Ebene = 2) and (val2 != ""))
3006    {
3007      undeadAsc(val2)
3008      return 1
3009    }
3010    else
3011      return 0
3012  }
3013  else
3014    return 0
3015}
3016
3017CheckDeadUni12(d,val1,val2)
3018{
3019  global
3020  if (PriorDeadKey == d)
3021  {
3022    if      ((Ebene = 1) and (val1 != ""))
3023    {
3024      undeadUni(val1)
3025      return 1
3026    }
3027    else if ((Ebene = 2) and (val2 != ""))
3028    {
3029      undeadUni(val2)
3030      return 1
3031    }
3032    else
3033      return 0
3034  }
3035  else
3036    return 0
3037}
3038
3039DeadCompose = 0
3040
3041compAsc(val)
3042{
3043  global
3044  if (DeadCompose)
3045    {} ; keine Ausgabe
3046  else
3047    send % "{blind}" . val
3048}
3049
3050compUni(val)
3051{
3052  global
3053  if (DeadCompose)
3054    {} ; keine Ausgabe
3055  else
3056    SendUnicodeChar(val)
3057}
3058
3059uncompAsc(val)
3060{
3061  global
3062  if (DeadCompose)
3063    send % "{blind}" . val
3064  else
3065    send % "{blind}{bs}" . val
3066}
3067
3068uncompUni(val)
3069{
3070  global
3071  if (DeadCompose)
3072    {} ; keine ausgabe
3073  else
3074    send {bs}
3075  SendUnicodeChar(val)   
3076}
3077
3078uncomp3Uni(val)
3079{
3080  global
3081  if (DeadCompose)
3082    {} ; keine ausgabe
3083  else
3084    send {bs}{bs}
3085  SendUnicodeChar(val)   
3086}
3087
3088CheckCompAsc(d,val)
3089{
3090  global
3091  if (PriorCompKey == d)
3092  {
3093    uncompAsc(val)
3094    return 1
3095  }
3096  else
3097    return 0
3098}
3099
3100CheckCompAsc12(d,val1,val2)
3101{
3102  global
3103  if (PriorCompKey == d)
3104    if      ((Ebene = 1) and (val1 != ""))
3105    {
3106      uncompAsc(val1)
3107      return 1
3108    }
3109    else if ((Ebene = 2) and (val2 != ""))
3110    {
3111      uncompAsc(val2)
3112      return 1
3113    }
3114    else
3115      return 0
3116  else
3117    return 0
3118}
3119
3120CheckCompUni(d,val)
3121{
3122  global
3123  if (PriorCompKey == d)
3124  {
3125    uncompUni(val)
3126    return 1
3127  }
3128  else
3129    return 0
3130}
3131
3132CheckCompUni12(d,val1,val2)
3133{
3134  global
3135  if (PriorCompKey == d)
3136  {
3137    if      ((Ebene = 1) and (val1 != ""))
3138    {
3139      uncompUni(val1)
3140      return 1
3141    }
3142    else if ((Ebene = 2) and (val2 != ""))
3143    {
3144      uncompUni(val2)
3145      return 1
3146    }
3147    else
3148      return 0
3149  }
3150  else
3151    return 0
3152}
3153
3154CheckComp3Uni(d,val)
3155{
3156  global
3157  if (PriorCompKey == d)
3158  {
3159    uncomp3Uni(val)
3160    return 1
3161  }
3162  else
3163    return 0
3164}
3165
3166CheckComp3Uni12(d,val1,val2)
3167{
3168  global
3169  if (PriorCompKey == d)
3170  {
3171    if      ((Ebene = 1) and (val1 != ""))
3172    {
3173      uncomp3Uni(val1)
3174      return 1
3175    }
3176    else if ((Ebene = 2) and (val2 != ""))
3177    {
3178      uncomp3Uni(val2)
3179      return 1
3180    }
3181    else
3182      return 0
3183  }
3184  else
3185    return 0
3186}
3187
3188outputChar(val1,val2)
3189{
3190  global
3191  if (Ebene = 1)
3192    c := val1
3193  else
3194    c := val2
3195  send % "{blind}" . c
3196  if (PriorDeadKey = "comp")
3197    CompKey := c
3198}
3199
3200;Tote/Untote Tasten
3201*F9::
3202  if (isMod4pressed())
3203    DeadSilence :=  not(DeadSilence)
3204  else
3205    send {blind}{F9}
3206return
3207
3208;Tote/Untote Compose
3209*F10::
3210  if (isMod4pressed())
3211    DeadCompose :=  not(DeadCompose)
3212  else
3213    send {blind}{F10}
3214return
3215
3216;Lang-s-Tastatur:
3217*F11::
3218  if (isMod4pressed())
3219    LangSTastatur := not(LangSTastatur) ; schaltet die Lang-s-Tastatur ein und aus
3220  else
3221    send {blind}{F11}
3222return
3223
3224
3225/*
3226   ------------------------------------------------------
3227   Methoden zum Senden von Unicode-Zeichen
3228   ------------------------------------------------------
3229*/
3230
3231
3232/************************************************************
3233  Alter Weg � Copy/Paste �ber die Zwischenablage
3234************************************************************/
3235
3236/*
3237Unicode(code)
3238{
3239   saved_clipboard := ClipboardAll
3240   Transform, Clipboard, Unicode, %code%
3241   sendplay ^v
3242   Clipboard := saved_clipboard
3243}
3244
3245BSUnicode(code)
3246{
3247   saved_clipboard := ClipboardAll
3248   Transform, Clipboard, Unicode, %code%
3249   sendplay {bs}^v
3250   Clipboard := saved_clipboard
3251}
3252*/
3253
3254
3255/************************************************************
3256  Neuer Weg � Benutzung der entsprechenden Win32-API-Methode
3257************************************************************/
3258
3259
3260
3261/*
3262   ------------------------------------------------------
3263   BildschirmTastatur
3264   ------------------------------------------------------
3265*/
3266guiErstellt = 0
3267alwaysOnTop = 1
3268
3269*F1::
3270  if (isMod4Pressed() and zeigeBildschirmTastatur)
3271    goto Switch1
3272  else
3273    send {blind}{F1}
3274return
3275
3276*F2::
3277  if (isMod4Pressed() and zeigeBildschirmTastatur)
3278    goto Switch2
3279  else
3280    send {blind}{F2}
3281return
3282
3283*F3::
3284  if (isMod4Pressed() and zeigeBildschirmTastatur)
3285    goto Switch3
3286  else
3287    send {blind}{F3}
3288return
3289
3290*F4::
3291  if (isMod4Pressed() and zeigeBildschirmTastatur)
3292    goto Switch4
3293  else
3294    send {blind}{F4}
3295return
3296
3297*F5::
3298  if (isMod4Pressed() and zeigeBildschirmTastatur)
3299    goto Switch5
3300  else
3301    send {blind}{F5}
3302return
3303
3304*F6::
3305  if (isMod4Pressed() and zeigeBildschirmTastatur)
3306    goto Switch6
3307  else
3308    send {blind}{F6}
3309return
3310
3311*F7::
3312  if (isMod4Pressed() and zeigeBildschirmTastatur)
3313    goto Show
3314  else
3315    send {blind}{F7}
3316return
3317
3318*F8::
3319  if (isMod4Pressed() and zeigeBildschirmTastatur)
3320    goto ToggleAlwaysOnTop
3321  else
3322    send {blind}{F8}
3323return
3324
3325Switch1:
3326  tImage := ResourceFolder . "\ebene1.png"
3327  goto Switch
3328Return
3329
3330Switch2:
3331  tImage := ResourceFolder . "\ebene2.png"
3332  goto Switch
3333Return
3334
3335Switch3:
3336  tImage := ResourceFolder . "\ebene3.png"
3337  goto Switch
3338Return
3339
3340Switch4:
3341  tImage := ResourceFolder . "\ebene4.png"
3342  goto Switch
3343Return
3344
3345Switch5:
3346  tImage := ResourceFolder . "\ebene5.png"
3347  goto Switch
3348Return
3349
3350Switch6:
3351  tImage := ResourceFolder . "\ebene6.png"
3352  goto Switch
3353Return
3354
3355Switch:
3356  if (guiErstellt)
3357  {
3358     if (Image = tImage)
3359        goto Close
3360     else
3361     {
3362       Image := tImage
3363       SetTimer, Refresh
3364     }
3365  }
3366  else
3367  {
3368    Image := tImage
3369    goto Show   
3370  }
3371Return
3372
3373Show:
3374  if (guiErstellt)
3375  {
3376     goto Close
3377  }
3378  else
3379  {
3380    if (Image = "")
3381    {
3382      Image := ResourceFolder . "\ebene1.png"
3383    }     
3384    yPosition := A_ScreenHeight -270
3385    Gui, Color, FFFFFF
3386    Gui, Add, Button, xm+5 gSwitch1, F1
3387    Gui, Add, Text, x+5, kleine Buchstaben
3388    Gui, Add, Button, xm+5 gSwitch2, F2
3389    Gui, Add, Text, x+5, gro�e Buchstaben
3390    Gui, Add, Button, xm+5 gSwitch3, F3
3391    Gui, Add, Text, x+5, Satz-/Sonderzeichen
3392    Gui, Add, Button, xm+5 gSwitch4, F4
3393    Gui, Add, Text, x+5, Zahlen / Steuerung
3394    Gui, Add, Button, xm+5 gSwitch5, F5
3395    Gui, Add, Text, x+5, Sprachen
3396    Gui, Add, Button, xm+5 gSwitch6, F6
3397    Gui, Add, Text, x+5, Mathesymbole
3398    Gui, Add, Button, xm+5 gShow, F7
3399    Gui, Add, Text, x+5, An /
3400    Gui, Add, Text, y+3, Aus
3401    Gui, Add, Button, x+10 y+-30 gShow, F8
3402    Gui, Add, Text, x+5, OnTop
3403    Gui, Add, Picture,AltSubmit ys w564 h200 vPicture, %Image%
3404    Gui, +AlwaysOnTop
3405    Gui, Show, y%yposition% Autosize
3406;    SetTimer, Refresh
3407    guiErstellt = 1
3408  }
3409Return
3410
3411Close:
3412  guiErstellt = 0
3413  Gui, Destroy
3414Return
3415
3416Refresh:
3417   If (Image != OldImage)
3418   {
3419      GuiControl, , Picture, %Image%
3420      OldImage := Image
3421   }
3422Return
3423
3424ToggleAlwaysOnTop:
3425    if (alwaysOnTop)
3426    {
3427      Gui, -AlwaysOnTop
3428      alwaysOnTop = 0   
3429    }
3430    else
3431    {
3432      Gui, +AlwaysOnTop
3433      alwaysOnTop = 1
3434    }
3435Return
3436 ; Ende der BildschirmTastatur
3437
3438
3439/*
3440   ------------------------------------------------------
3441   Shift+Pause "pausiert" das Script.
3442   ------------------------------------------------------
3443*/
3444
3445*pause::
3446Suspend, Permit
3447   if isshiftpressed()
3448     goto togglesuspend
3449   else
3450     send {blind}{pause}
3451return
3452
3453; ------------------------------------
3454
3455^.::einHandNeo := not(einHandNeo)  ; Punkt
3456^,::lernModus := not(lernModus)    ; Komma
3457
3458
3459
3460togglesuspend:
3461   if A_IsSuspended
3462   {
3463      menu, tray, rename, %enable%, %disable%
3464      menu, tray, tip, %name%
3465      if (iconBenutzen)
3466          menu, tray, icon, %ResourceFolder%\neo.ico,,1 
3467      suspend , off ; Schaltet Suspend aus -> NEO
3468   }
3469   else
3470   {
3471      menu, tray, rename, %disable%, %enable%
3472      menu, tray, tip, %name% : Deaktiviert
3473      if (iconBenutzen)
3474         menu, tray, icon, %ResourceFolder%\neo_disabled.ico,,1
3475      suspend , on  ; Schaltet Suspend ein -> QWERTZ
3476   }
3477
3478return
3479
3480
3481help:
3482   Run, %A_WinDir%\hh mk:@MSITStore:autohotkey.chm
3483return
3484
3485
3486about:
3487   msgbox, 64, %name% � Ergonomische Tastaturbelegung,
3488   (
3489   %name%
3490   `nDas Neo-Layout ersetzt das �bliche deutsche
3491   Tastaturlayout mit der Alternative Neo,
3492   beschrieben auf http://neo-layout.org/.
3493   `nDazu sind keine Administratorrechte n�tig.
3494   `nWenn Autohotkey aktiviert ist, werden alle Tastendrucke
3495   abgefangen und statt dessen eine �bersetzung weitergeschickt.
3496   `nDies geschieht transparent f�r den Anwender,
3497   es muss nichts installiert werden.
3498   `nDie Zeichen�bersetzung kann leicht �ber das Icon im
3499   Systemtray deaktiviert werden.  `n
3500   )
3501return
3502
3503
3504neo:
3505   run http://neo-layout.org/
3506return
3507
3508autohotkey:
3509   run http://autohotkey.com/
3510return
3511
3512open:
3513   ListLines ; shows the Autohotkey window
3514return
3515
3516edit:
3517   edit
3518return
3519
3520reload:
3521   Reload
3522return
3523
3524hide:
3525   menu, tray, noicon
3526return
3527
3528exitprogram:
3529   exitapp
3530return
3531
Note: See TracBrowser for help on using the browser.