From 10462b21c85e43ad2129bc2005068fe1fa763b51 Mon Sep 17 00:00:00 2001
From: martin_r <martin_r@b9310e46-f624-0410-8ea1-cfbb3a30dc96>
Date: Wed, 27 Aug 2008 01:23:34 +0000
Subject: DeadCompose implementiert, uncomp…-Methoden gelöscht, »return
 0«-Zeilen entfernt (wird sowieso gemacht). checkComp ausgebessert: »global«
 hatte gefehlt. (Damit wurde ›ſt‹(ſt-Ligatur) ermöglicht (war defekt)).
 ahkTreiberKombi rausgeschmissen (war für den gelöschten msklc-Treiber
 gedacht). Massenweise Formatierungen normalisiert. Zusätzliche
 Compose-Aktivierung über Mod3+Mod3. Einhand- und Lernmodus wiederhergestellt.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

git-svn-id: https://svn.neo-layout.org@810 b9310e46-f624-0410-8ea1-cfbb3a30dc96
---
 windows/autohotkey/Changelog-and-Todo.txt     |  17 +-
 windows/autohotkey/Source/Global-Part.ahk     | 180 ++++++-----
 windows/autohotkey/Source/Keys-Neo.ahk        |  10 +-
 windows/autohotkey/Source/Methods-Layers.ahk  | 103 +++---
 windows/autohotkey/Source/Methods-Other.ahk   |  90 ++----
 windows/autohotkey/Source/Methods-Unicode.ahk |   7 +-
 windows/autohotkey/neo20.ahk                  | 433 ++++++++++----------------
 windows/autohotkey/neo20.exe                  | Bin 424878 -> 424287 bytes
 8 files changed, 352 insertions(+), 488 deletions(-)

diff --git a/windows/autohotkey/Changelog-and-Todo.txt b/windows/autohotkey/Changelog-and-Todo.txt
index 1bdd9df..86b3040 100644
--- a/windows/autohotkey/Changelog-and-Todo.txt
+++ b/windows/autohotkey/Changelog-and-Todo.txt
@@ -8,7 +8,7 @@ Stefan Mayer <stm (at) neo-layout. o r g>
 Nora Geißler <nora_geissler (at) yahoo. d e>
 Matthias Berg <neo (at) matthias-berg. e u>
 Martin Roppelt <m.p.roppelt (at) web. d e>
-Dennis Heidsiek <HeidsiekB (at) aol. c o m>
+Dennis Heidsiek <heidsiekb (at) aol. c o m>
 Matthias Wächter <matthias (at) waechter.wiz. a t>
 
 
@@ -16,20 +16,27 @@ Matthias Wächter <matthias (at) waechter.wiz. a t>
 - Ausgiebig testen … (besonders Vollständigkeit bei Deadkeys).
 - Compose vollständig implementieren (Welche Methode ist hierzu am besten geeignet?).
 - Bessere Lösung für das Leeren von PriorDeadKey finden, damit die Sondertasten nicht mehr abgefangen werden müssen.
-- Blindes Compose implementieren.
-- CapsLock-Abhängigkeiten entfernen.
 
 === Ideen und Vorschläge ===
-- Modi für vertauschte Ziffern in der Zahlenreihe und auf der 4. Ebene.
 - Die Compose-Kombinationen sollten automatisch aus den Referenzdateien im Compose-Verzeichnis erzeugt werden.
+- Modi für vertauschte Ziffern in der Zahlenreihe und auf der 4. Ebene.
+- Tote Zeichen durch Verbindungszeichen ersetzen, sie können in Abhängigkeit des vorigen Zeichens zusammengezogen werden. Alle Akzente sind an einer Stelle
 
 === Änderungshistorie ===
 
+Revision 810 (von Martin Roppelt)
+- DeadCompose implementiert, uncomp…-Methoden gelöscht, »return 0«-Zeilen entfernt (wird sowieso gemacht).
+- checkComp ausgebessert: »global« hatte gefehlt.
+  • Damit wurde ›ſt‹ ermöglicht (war defekt).
+- ahkTreiberKombi rausgeschmissen (war für den gelöschten msklc-Treiber gedacht).
+- Massenweise Formatierungen normalisiert.
+- Zusätzliche Compose-Aktivierung über Mod3+Mod3.
+- Einhand- und Lernmodus wiederhergestellt.
 Revision 806 (von Dennis Heidsiek)
 - Die automatisch erzeugte Datei neo20.ahk wird wieder um die SVN-Keywords (Date, Author, Revision) ergänzt.
 Revision 804 (von Martin Roppelt)
 - Formatierung vereinfacht und vereinheitlicht.
-- Compose-Ligaturen implementiert: fl, …
+- Compose-Ligaturen implementiert: ›fl‹, ›ffl‹(♫Fl), ›fi‹, ›ffi‹(♫Fi), ›ff‹, ›st‹, ›ſt‹.
 Revision 789 (von Martin Roppelt)
 - NumLock-Bug ausgebessert (NumLock konnte nach dem Beenden von Neo nicht mehr aktiviert werden).
 Revision 778 (von Martin Roppelt)
diff --git a/windows/autohotkey/Source/Global-Part.ahk b/windows/autohotkey/Source/Global-Part.ahk
index 0a748ad..a2bbd5f 100644
--- a/windows/autohotkey/Source/Global-Part.ahk
+++ b/windows/autohotkey/Source/Global-Part.ahk
@@ -2,10 +2,10 @@
 * Initialisierung *
 *******************
 */
-DeadKey = ""
-CompKey = ""
-PriorDeadKey = ""
-PriorCompKey = ""
+DeadKey := ""
+CompKey := ""
+PriorDeadKey := ""
+PriorCompKey := ""
 Ebene12 = 0
 noCaps = 0
 
@@ -50,9 +50,6 @@ bildschirmTastaturEinbinden := 1
 
 ; Syntaxhinweis: IniRead, Variable, InputFilename, Section, Key [, DefaultValue]
 
-; Sollen Ebenen 1-4 ignoriert werden (kann z.B. vom dll Treiber �bernommen werden)?
-IniRead,ahkTreiberKombi,%ini%,Global,ahkTreiberKombi,0
-
 ; Soll der Treiber im Einhandmodus betrieben werden?
 IniRead,einHandNeo,%ini%,Global,einHandNeo,0
 
@@ -71,22 +68,24 @@ If LangSTastatur
   KeyboardLED(2,"on")
 
 ; Sollen tote Tasten blind angezeigt werden?
-IniRead,DeadCompose,%ini%,Global,DeadCompose,0
+IniRead,DeadSilence,%ini%,Global,DeadSilence,0
 
 ;Sollen Compose-Tasten blind angezeigt werden?
-IniRead,DeadSilence,%ini%,Global,DeadSilence,0
+IniRead,DeadCompose,%ini%,Global,DeadCompose,0
 
+:Soll der Mod2Lock auch auf die Akzente, die Ziffernreihe und das Numpad angewandt werden?
+IniRead,striktesMod2Lock,%ini%,Global,striktesMod2Lock,0
 
 /***********************
 * Recourcen-Verwaltung *
 ************************
 */
-if(FileExist("ResourceFolder")<>false){
+if (FileExist("ResourceFolder")<>false) {
   ; Versuche, alle m�glicherweise in die EXE eingebundenen Dateien zu extrahieren 
   FileInstall,neo.ico,%ResourceFolder%\neo.ico,1
   FileInstall,neo_disabled.ico,%ResourceFolder%\neo_disabled.ico,1
   iconBenutzen=1
-  if (bildschirmTastaturEinbinden=1){
+  if (bildschirmTastaturEinbinden=1) {
     FileInstall,ebene1.png,%ResourceFolder%\ebene1.png,1
     FileInstall,ebene2.png,%ResourceFolder%\ebene2.png,1
     FileInstall,ebene3.png,%ResourceFolder%\ebene3.png,1
@@ -95,14 +94,12 @@ if(FileExist("ResourceFolder")<>false){
     FileInstall,ebene6.png,%ResourceFolder%\ebene6.png,1
     zeigeBildschirmTastatur=1
   }
-}else{
-  MsgBox,"Das Verzeichnis %ResourceFolder% konnte nicht angelegt werden!" ; Diese Zeile dient nur der eventuellen Fehlersuche und sollte eigentlich niemals auftauchen.
 }
 
 ; Benutze die Dateien auch dann, wenn sie eventuell im aktuellen Verzeichnis vorhanden sind 
-if(FileExist("ebene1.png")&&FileExist("ebene2.png")&&FileExist("ebene3.png")&&FileExist("ebene4.png")&&FileExist("ebene5.png")&&FileExist("ebene6.png"))
+if (FileExist("ebene1.png")&&FileExist("ebene2.png")&&FileExist("ebene3.png")&&FileExist("ebene4.png")&&FileExist("ebene5.png")&&FileExist("ebene6.png"))
   zeigeBildschirmTastatur=1
-if(FileExist("neo.ico")&&FileExist("neo_disabled.ico"))
+if (FileExist("neo.ico")&&FileExist("neo_disabled.ico"))
   iconBenutzen=1
 
 /*******************************************
@@ -154,6 +151,74 @@ menu,tray,add,%name% beenden, exitprogram
 menu,tray,default,%disable%
 menu,tray,tip,%name%
 
+/**************************
+* lernModus Konfiguration *
+* nur relevant wenn       *
+* lernModus = 1           *
+* Strg+Komma schaltet um  *
+***************************
+*/
+; 0 = aus, 1 = an
+
+; die Nachfolgenden sind n�tzlich um sich die Qwertz-Tasten abzugew�hnen, da alle auf der 4. Ebene vorhanden.
+lernModus_std_Return = 0
+lernModus_std_Backspace = 0
+lernModus_std_PgUp = 0
+lernModus_std_PgDn = 0
+lernModus_std_Einf = 0
+lernModus_std_Entf = 0
+lernModus_std_Pos0 = 0
+lernModus_std_Ende = 0
+lernModus_std_Hoch = 0
+lernModus_std_Runter = 0
+lernModus_std_Links = 0
+lernModus_std_Rechts = 0
+lernModus_std_ZahlenReihe = 0
+
+; im folgenden kann man auch noch ein paar Tasten der 4. Ebene deaktivieren
+; n�tzlich um sich zu zwingen, richtig zu schreiben
+lernModus_neo_Backspace = 0
+lernModus_neo_Entf = 1
+
+/****************************
+* EinHandNeo                *
+* Umschalten mit Strg+Punkt *
+*****************************
+*/
+spacepressed := 0
+keypressed := 0
+
+; Reihe 1
+gespiegelt_7 = neo_6
+gespiegelt_8 = neo_5
+gespiegelt_9 = neo_4
+gespiegelt_0 = neo_3
+gespiegelt_strich = neo_2
+gespiegelt_tot2 = neo_1
+
+; Reihe 2
+gespiegelt_k = neo_w
+gespiegelt_h = neo_c
+gespiegelt_g = neo_l
+gespiegelt_f = neo_v
+gespiegelt_q = neo_x
+gespiegelt_sz = neo_tab 
+gespiegelt_tot3 = neo_tot1
+
+; Reihe 3
+gespiegelt_s = neo_o
+gespiegelt_n = neo_e
+gespiegelt_r = neo_a
+gespiegelt_t = neo_i
+gespiegelt_d = neo_u
+
+; Reihe 4
+gespiegelt_b = neo_z
+gespiegelt_m = neo_p
+gespiegelt_komma = neo_�
+gespiegelt_punkt = neo_�
+gespiegelt_j = neo_�
+
 /**********************
 * Tastenkombinationen *
 ***********************
@@ -161,29 +226,28 @@ menu,tray,tip,%name%
 ;Blinde/Sichtbare Tote Tasten
 *F9::
   if isMod4pressed()
-    DeadSilence := !(DeadSilence)
+    DeadSilence := !DeadSilence
   else send {blind}{F9}
 return
 
 ;Blinde/Sichtbare Compose
 *F10::
   if isMod4pressed()
-    DeadCompose := !(DeadCompose)
+    DeadCompose := !DeadCompose
   else send {blind}{F10}
 return
 
 ;Lang-s-Tastatur:
 *F11::
   if isMod4pressed() {
-    LangSTastatur := !(LangSTastatur)
+    LangSTastatur := !LangSTastatur
     if LangSTastatur
       KeyboardLED(2,"on")
     else KeyboardLED(2,"off")
   } else send {blind}{F11}
 return
 
-;Alle Modi und Locks in den Normalzustand versetzen
-;bzw. Skript neu laden:
+;Alle Modi und Locks in den Normalzustand versetzen, bzw. Skript neu laden:
 *Esc::
   if isMod4pressed()
     reload
@@ -197,6 +261,10 @@ Suspend, Permit
   else send {blind}{pause}
 return
 
+^,::lernModus := not(lernModus)
+
+^.::einHandNeo := !einHandNeo
+
 /*****************
 * Men�funktionen *
 ******************
@@ -264,75 +332,3 @@ return
 exitprogram:
   exitapp
 return
-
-/**************************
-* lernModus Konfiguration *
-* nur relevant wenn       *
-* lernModus = 1           *
-* Strg+Komma schaltet um  *
-***************************
-*/
-^,::lernModus := not(lernModus)
-
-; 0 = aus, 1 = an
-
-; die Nachfolgenden sind n�tzlich um sich die Qwertz-Tasten abzugew�hnen, da alle auf der 4. Ebene vorhanden.
-lernModus_std_Return = 0
-lernModus_std_Backspace = 0
-lernModus_std_PgUp = 0
-lernModus_std_PgDn = 0
-lernModus_std_Einf = 0
-lernModus_std_Entf = 0
-lernModus_std_Pos0 = 0
-lernModus_std_Ende = 0
-lernModus_std_Hoch = 0
-lernModus_std_Runter = 0
-lernModus_std_Links = 0
-lernModus_std_Rechts = 0
-lernModus_std_ZahlenReihe = 0
-
-; im folgenden kann man auch noch ein paar Tasten der 4. Ebene deaktivieren
-; n�tzlich um sich zu zwingen, richtig zu schreiben
-lernModus_neo_Backspace = 0
-lernModus_neo_Entf = 1
-
-/****************************
-* EinHandNeo                *
-* Umschalten mit Strg+Punkt *
-*****************************
-*/
-^.::einHandNeo := not(einHandNeo)
-
-spacepressed := 0
-keypressed:= 0
-
-; Reihe 1
-gespiegelt_7 = neo_6
-gespiegelt_8 = neo_5
-gespiegelt_9 = neo_4
-gespiegelt_0 = neo_3
-gespiegelt_strich = neo_2
-gespiegelt_tot2 = neo_1
-
-; Reihe 2
-gespiegelt_k = neo_w
-gespiegelt_h = neo_c
-gespiegelt_g = neo_l
-gespiegelt_f = neo_v
-gespiegelt_q = neo_x
-gespiegelt_sz = neo_tab 
-gespiegelt_tot3 = neo_tot1
-
-; Reihe 3
-gespiegelt_s = neo_o
-gespiegelt_n = neo_e
-gespiegelt_r = neo_a
-gespiegelt_t = neo_i
-gespiegelt_d = neo_u
-
-; Reihe 4
-gespiegelt_b = neo_z
-gespiegelt_m = neo_p
-gespiegelt_komma = neo_�
-gespiegelt_punkt = neo_�
-gespiegelt_j = neo_�
diff --git a/windows/autohotkey/Source/Keys-Neo.ahk b/windows/autohotkey/Source/Keys-Neo.ahk
index ac6868a..6186d62 100644
--- a/windows/autohotkey/Source/Keys-Neo.ahk
+++ b/windows/autohotkey/Source/Keys-Neo.ahk
@@ -27,7 +27,7 @@ neo_tot1:
     deadUni(0x002D) ; Querstrich, tot
     DeadKey = c5
   } else if (Ebene = 6) {
-    deadUni(0x0323) ; Punkt drunter (Colon), tot
+    deadUni(0x002E) ; Punkt drunter (Colon), tot
     DeadKey = c6
   } CompKey := PriorCompKey
 return
@@ -481,8 +481,8 @@ neo_sz:
     if LangSTastatur
       send �
     else {
-      SendUnicodeChar(0x017F) ; langes s
-      CheckComp("lang_s")
+      if !checkComp("lang_s")
+        SendUnicodeChar(0x017F) ; langes s
   } else if (Ebene = 5)
     SendUnicodeChar(0x03C2) ; varsigma
   else if (Ebene = 6)
@@ -658,8 +658,8 @@ neo_s:
                  or CheckDeadUni12("c6",0x1E63,0x1A62)))
     {
       if LangSTastatur and (Ebene = 1) {
-        SendUnicodeChar(0x017F) ;langes S
-        CheckComp("lang_s")
+        if !checkComp("lang_s")
+          SendUnicodeChar(0x017F) ; langes s
       } else outputChar("s","S")
     } else if (Ebene = 3)
     send {blind}?
diff --git a/windows/autohotkey/Source/Methods-Layers.ahk b/windows/autohotkey/Source/Methods-Layers.ahk
index ef12e58..fe93848 100644
--- a/windows/autohotkey/Source/Methods-Layers.ahk
+++ b/windows/autohotkey/Source/Methods-Layers.ahk
@@ -11,15 +11,11 @@
 isMod2Locked = 0
 VKA1SC136 & VKA0SC02A:: ; RShift, dann LShift
 VKA0SC02A & VKA1SC136:: ; LShift, dann RShift
-  if (GetKeyState("VKA1SC136", "P") and GetKeyState("VKA0SC02A", "P"))
-  {
-    if isMod2Locked
-    {
+  if (GetKeyState("VKA1SC136", "P") and GetKeyState("VKA0SC02A", "P")) {
+    if isMod2Locked {
       isMod2Locked = 0
       KeyboardLED(4,"off")
-    }
-    else
-    {
+    } else {
       isMod2Locked = 1
       KeyBoardLED(4,"on")
     }
@@ -29,6 +25,10 @@ return
 ;Mod3-Tasten (Wichtig, sie werden sonst nicht verarbeitet!)
 *VKBFSC02B:: ; #
 *VK14SC03A:: ; CapsLock
+  if (GetKeyState("VKBFSC02B", "P") and GetKeyState("VK14SC03A", "P")) {
+    DeadKey := "comp"
+    CompKey := ""
+  }
 return
 
 ;Mod4+Mod4 == Mod4-Lock
@@ -40,18 +40,14 @@ return
 IsMod4Locked := 0
 *VKA5SC138::
 *VKE2SC056::
-  if (GetKeyState("VKA5SC138", "P") and GetKeyState("VKE2SC056", "P"))
-  {
-    if IsMod4Locked
-    {
+  if (GetKeyState("VKA5SC138", "P") and GetKeyState("VKE2SC056", "P")) {
+    if IsMod4Locked {
       if zeigeLockBox
         MsgBox Mod4-Feststellung aufgebehoben!
        IsMod4Locked = 0
       if UseMod4Light
         KeyboardLED(1,"off")
-    }
-    else
-    {
+    } else {
       if zeigeLockBox
         MsgBox Mod4 festgestellt: Um Mod4 wieder zu l�sen, dr�cke beide Mod4-Tasten gleichzeitig!
       IsMod4Locked = 1
@@ -61,8 +57,7 @@ IsMod4Locked := 0
   }
 return
 
-EbeneAktualisieren()
-{
+EbeneAktualisieren() {
   global
   PriorDeadKey := DeadKey
   PriorCompKey := CompKey
@@ -71,35 +66,25 @@ EbeneAktualisieren()
   Modstate := IsMod4Pressed() . IsMod3Pressed() . IsShiftPressed()
   Ebene7 := 0
   Ebene8 := 0
-  if ahkTreiberKombi
-    if ( Modstate = "001")
-      Ebene = 6
-    else
-      Ebene = -1
-  else
-    if      (Modstate = "000") ; Ebene 1: Ohne Mod
-      Ebene = 1
-    else if (Modstate = "001") ; Ebene 2: Shift
-      Ebene = 2
-    else if (Modstate = "010") ; Ebene 3: Mod3
-      Ebene = 3
-    else if (Modstate = "100") ; Ebene 4: Mod4
-      Ebene = 4
-    else if (Modstate = "011") ; Ebene 5: Shift+Mod3
-      Ebene = 5
-    else if (Modstate = "110") ; Ebene 6: Mod3+Mod4
-      Ebene = 6
-    else if (Modstate = "101") ; Ebene 7: Shift+Mod4 impliziert Ebene 4
-    {
-      Ebene = 4
-      Ebene7 = 1
-    }
-    else if (Modstate = "111") ; Ebene 8: Shift+Mod3+Mod4 impliziert Ebene 6
-    {
-      Ebene = 6
-      Ebene8 = 1
-    }
-  Ebene12 := ((Ebene = 1) or (Ebene = 2))
+  if      (Modstate = "000") ; Ebene 1: Ohne Mod
+    Ebene = 1
+  else if (Modstate = "001") ; Ebene 2: Shift
+    Ebene = 2
+  else if (Modstate = "010") ; Ebene 3: Mod3
+    Ebene = 3
+  else if (Modstate = "100") ; Ebene 4: Mod4
+    Ebene = 4
+  else if (Modstate = "011") ; Ebene 5: Shift+Mod3
+    Ebene = 5
+  else if (Modstate = "110") ; Ebene 6: Mod3+Mod4
+    Ebene = 6
+  else if (Modstate = "101") { ; Ebene 7: Shift+Mod4 impliziert Ebene 4
+    Ebene = 4
+    Ebene7 = 1
+  } else if (Modstate = "111") { ; Ebene 8: Shift+Mod3+Mod4 impliziert Ebene 6
+    Ebene = 6
+    Ebene8 = 1
+  } Ebene12 := ((Ebene = 1) or (Ebene = 2))
   Ebene14 := ((Ebene = 1) or (Ebene = 4))
   NumLock := GetKeyState("NumLock","T")
 }
@@ -107,6 +92,8 @@ EbeneAktualisieren()
 IsShiftPressed()
 {
   global
+  if striktesMod2Lock
+    noCaps = 0
   if GetKeyState("Shift","P")
     if isMod2Locked and !noCaps
       return 0
@@ -122,21 +109,21 @@ IsShiftPressed()
 
 IsMod3Pressed()
 {
-   global
-   return ((GetKeyState("CapsLock","P")) or (GetKeyState("#","P")))
+  global
+  return (GetKeyState("VKBFSC02B","P") or GetKeyState("VK14SC03A","P"))
 }
 
 IsMod4Pressed()
 {
-   global
-   if( not(einHandNeo) or not(spacepressed))
-     if IsMod4Locked
-         return (not ( GetKeyState("<","P") or GetKeyState("SC138","P")))
-     else
-         return ( GetKeyState("<","P") or GetKeyState("SC138","P"))
-   else
-     if IsMod4Lock
-       return (not ( GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P")))
-     else
-       return ( GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P"))
+  global
+  if !(einHandNeo) or !(spacepressed)
+    if IsMod4Locked
+      return !(GetKeyState("<","P") or GetKeyState("SC138","P"))
+    else
+      return (GetKeyState("<","P") or GetKeyState("SC138","P"))
+  else
+    if IsMod4Locked
+      return !(GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P"))
+    else
+      return (GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P"))
 }
diff --git a/windows/autohotkey/Source/Methods-Other.ahk b/windows/autohotkey/Source/Methods-Other.ahk
index cb95c99..1acfccf 100644
--- a/windows/autohotkey/Source/Methods-Other.ahk
+++ b/windows/autohotkey/Source/Methods-Other.ahk
@@ -30,7 +30,7 @@ CheckDeadAsc(d,val) {
   if (PriorDeadKey == d) {
     undeadAsc(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckDeadUni(d,val) {
@@ -38,7 +38,7 @@ CheckDeadUni(d,val) {
   if (PriorDeadKey == d) {
     undeadUni(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckDeadAsc12(d,val1,val2) {
@@ -50,8 +50,8 @@ CheckDeadAsc12(d,val1,val2) {
     } else if (Ebene = 2) and (val2 != "") {
       undeadAsc(val2)
       return 1
-    } else return 0
-  } else return 0
+    }
+  }
 }
 
 CheckDeadUni12(d,val1,val2) {
@@ -63,104 +63,70 @@ CheckDeadUni12(d,val1,val2) {
     } else if (Ebene = 2) and (val2 != "") {
       undeadUni(val2)
       return 1
-    } else return 0
-  } else return 0
-}
-
-compAsc(val) {
-  global
-  if !DeadCompose
-    send % val
-}
-
-compUni(val) {
-  global
-  if !DeadCompose
-    SendUnicodeChar(val)
-}
-
-uncompAsc(val) {
-  global
-  if DeadCompose
-    send % val
-  else send % "{bs}" . val
-}
-
-uncompUni(val) {
-  global
-  if !DeadCompose
-    send {bs}
-  SendUnicodeChar(val)    
-}
-
-uncomp3Uni(val) {
-  global
-  if !DeadCompose
-    send {bs}{bs}
-  SendUnicodeChar(val)    
+    }
+  }
 }
 
 CheckCompAsc(d,val) {
   global
   if (PriorCompKey == d) {
-    uncompAsc(val)
+    send % val
     return 1
-  } else return 0
+  }
 }
 
 CheckCompAsc12(d,val1,val2) {
   global
   if (PriorCompKey == d)
     if (Ebene = 1) and (val1 != "") {
-      uncompAsc(val1)
+      send % val1
       return 1
     } else if (Ebene = 2) and (val2 != "") {
-      uncompAsc(val2)
+      send % val2
       return 1
-    } else return 0
-  else return 0
+    }
 }
 
 CheckCompUni(d,val) {
   global
   if (PriorCompKey == d) {
-    uncompUni(val)
+    SendUnicodeChar(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckCompUni12(d,val1,val2){
   global
   if (PriorCompKey == d) {
     if (Ebene = 1) and (val1 != "") {
-      uncompUni(val1)
+      SendUnicodeChar(val1)
       return 1
     }else if (Ebene = 2) and (val2 != "") {
-      uncompUni(val2)
+      SendUnicodeChar(val2)
       return 1
-    } else return 0
-  } else return 0
+    }
+  }
 }
 
 CheckComp3Uni(d,val) {
   global
   if (PriorCompKey == d) {
-    uncomp3Uni(val)
+    SendUnicodeChar(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckComp3Uni12(d,val1,val2) {
   global
   if (PriorCompKey == d) {
     if (Ebene = 1) and (val1 != "") {
-      uncomp3Uni(val1)
+      SendUnicodeChar(val1)
       return 1
     } else if (Ebene = 2) and (val2 != "") {
-      uncomp3Uni(val2)
+      SendUnicodeChar(val2)
       return 1
-    } else return 0
-  } else return 0
+    }
+  }
 }
 
 outputChar(val1,val2) {
@@ -168,14 +134,14 @@ outputChar(val1,val2) {
   if (Ebene = 1)
     c := val1
   else c := val2
-  if GetKeyState("Shift","P") and isMod2Locked
-    send % "{blind}{Shift Up}" . c . "{Shift Down}"
-  else send % "{blind}" . c
-  if (PriorDeadKey = "comp")
-    CompKey := c
+  if !(CheckComp(c) and DeadCompose or PriorCompKey)
+    if GetKeyState("Shift","P") and isMod2Locked
+      send % "{blind}{Shift Up}" . c . "{Shift Down}"
+    else send % "{blind}" . c
 }
 
 checkComp(d) {
+  global
   if (PriorDeadKey = "comp") {
     CompKey := d
     return 1
diff --git a/windows/autohotkey/Source/Methods-Unicode.ahk b/windows/autohotkey/Source/Methods-Unicode.ahk
index deaf5e0..86e3b36 100644
--- a/windows/autohotkey/Source/Methods-Unicode.ahk
+++ b/windows/autohotkey/Source/Methods-Unicode.ahk
@@ -8,12 +8,13 @@ Dieser basiert auf http://www.autohotkey.com/forum/topic32947.html
 Der 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.
 */
 
-SendUnicodeChar(charCode){
+SendUnicodeChar(charCode) {
+
   IfWinActive,ahk_class gdkWindowToplevel
   {
     StringLower,charCode,charCode
     send % "^+u" . SubStr(charCode,3) . " "
-  }else{
+  } else {
     VarSetCapacity(ki,28*2,0)
     EncodeInteger(&ki+0,1)
     EncodeInteger(&ki+6,charCode)
@@ -25,6 +26,6 @@ SendUnicodeChar(charCode){
   }
 }
 
-EncodeInteger(ref,val){
+EncodeInteger(ref,val) {
   DllCall("ntdll\RtlFillMemoryUlong","Uint",ref,"Uint",4,"Uint",val)
 }
diff --git a/windows/autohotkey/neo20.ahk b/windows/autohotkey/neo20.ahk
index 39d5cac..ef19a6e 100644
--- a/windows/autohotkey/neo20.ahk
+++ b/windows/autohotkey/neo20.ahk
@@ -1,54 +1,11 @@
-/*
-*******************************************
-WICHTIGE WARNUNG:
-
-Dies ist inzwischen eine automatisch generierte
-Datei! Sie wird regelm��ig �berschrieben und
-sollte deshalb nicht mehr direkt bearbeitet werden!
-
-Alle weiterf�hrende Informationen finden sich im Abschnitt 
-== Hinweise f�r Entwickler ==
-in der Datei README.txt!
-
-Versionshinweise (SVN Keywords) f�r diese Datei:
-$LastChangedRevision$
-$LastChangedDate$
-$LastChangedBy$
-$HeadURL$
-*******************************************
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-*******************************************
-Das war die letzte WARNUNG, ich hoffe nur dass
-Sie wirklich wissen was Sie hier tun wollen ...
-*******************************************
-*/
 /******************
 * Initialisierung *
 *******************
 */
-DeadKey = ""
-CompKey = ""
-PriorDeadKey = ""
-PriorCompKey = ""
+DeadKey := ""
+CompKey := ""
+PriorDeadKey := ""
+PriorCompKey := ""
 Ebene12 = 0
 noCaps = 0
 
@@ -93,9 +50,6 @@ bildschirmTastaturEinbinden := 1
 
 ; Syntaxhinweis: IniRead, Variable, InputFilename, Section, Key [, DefaultValue]
 
-; Sollen Ebenen 1-4 ignoriert werden (kann z.B. vom dll Treiber �bernommen werden)?
-IniRead,ahkTreiberKombi,%ini%,Global,ahkTreiberKombi,0
-
 ; Soll der Treiber im Einhandmodus betrieben werden?
 IniRead,einHandNeo,%ini%,Global,einHandNeo,0
 
@@ -114,22 +68,24 @@ If LangSTastatur
   KeyboardLED(2,"on")
 
 ; Sollen tote Tasten blind angezeigt werden?
-IniRead,DeadCompose,%ini%,Global,DeadCompose,0
+IniRead,DeadSilence,%ini%,Global,DeadSilence,0
 
 ;Sollen Compose-Tasten blind angezeigt werden?
-IniRead,DeadSilence,%ini%,Global,DeadSilence,0
+IniRead,DeadCompose,%ini%,Global,DeadCompose,0
 
+:Soll der Mod2Lock auch auf die Akzente, die Ziffernreihe und das Numpad angewandt werden?
+IniRead,striktesMod2Lock,%ini%,Global,striktesMod2Lock,0
 
 /***********************
 * Recourcen-Verwaltung *
 ************************
 */
-if(FileExist("ResourceFolder")<>false){
+if (FileExist("ResourceFolder")<>false) {
   ; Versuche, alle m�glicherweise in die EXE eingebundenen Dateien zu extrahieren 
   FileInstall,neo.ico,%ResourceFolder%\neo.ico,1
   FileInstall,neo_disabled.ico,%ResourceFolder%\neo_disabled.ico,1
   iconBenutzen=1
-  if (bildschirmTastaturEinbinden=1){
+  if (bildschirmTastaturEinbinden=1) {
     FileInstall,ebene1.png,%ResourceFolder%\ebene1.png,1
     FileInstall,ebene2.png,%ResourceFolder%\ebene2.png,1
     FileInstall,ebene3.png,%ResourceFolder%\ebene3.png,1
@@ -138,14 +94,12 @@ if(FileExist("ResourceFolder")<>false){
     FileInstall,ebene6.png,%ResourceFolder%\ebene6.png,1
     zeigeBildschirmTastatur=1
   }
-}else{
-  MsgBox,"Das Verzeichnis %ResourceFolder% konnte nicht angelegt werden!" ; Diese Zeile dient nur der eventuellen Fehlersuche und sollte eigentlich niemals auftauchen.
 }
 
 ; Benutze die Dateien auch dann, wenn sie eventuell im aktuellen Verzeichnis vorhanden sind 
-if(FileExist("ebene1.png")&&FileExist("ebene2.png")&&FileExist("ebene3.png")&&FileExist("ebene4.png")&&FileExist("ebene5.png")&&FileExist("ebene6.png"))
+if (FileExist("ebene1.png")&&FileExist("ebene2.png")&&FileExist("ebene3.png")&&FileExist("ebene4.png")&&FileExist("ebene5.png")&&FileExist("ebene6.png"))
   zeigeBildschirmTastatur=1
-if(FileExist("neo.ico")&&FileExist("neo_disabled.ico"))
+if (FileExist("neo.ico")&&FileExist("neo_disabled.ico"))
   iconBenutzen=1
 
 /*******************************************
@@ -197,6 +151,74 @@ menu,tray,add,%name% beenden, exitprogram
 menu,tray,default,%disable%
 menu,tray,tip,%name%
 
+/**************************
+* lernModus Konfiguration *
+* nur relevant wenn       *
+* lernModus = 1           *
+* Strg+Komma schaltet um  *
+***************************
+*/
+; 0 = aus, 1 = an
+
+; die Nachfolgenden sind n�tzlich um sich die Qwertz-Tasten abzugew�hnen, da alle auf der 4. Ebene vorhanden.
+lernModus_std_Return = 0
+lernModus_std_Backspace = 0
+lernModus_std_PgUp = 0
+lernModus_std_PgDn = 0
+lernModus_std_Einf = 0
+lernModus_std_Entf = 0
+lernModus_std_Pos0 = 0
+lernModus_std_Ende = 0
+lernModus_std_Hoch = 0
+lernModus_std_Runter = 0
+lernModus_std_Links = 0
+lernModus_std_Rechts = 0
+lernModus_std_ZahlenReihe = 0
+
+; im folgenden kann man auch noch ein paar Tasten der 4. Ebene deaktivieren
+; n�tzlich um sich zu zwingen, richtig zu schreiben
+lernModus_neo_Backspace = 0
+lernModus_neo_Entf = 1
+
+/****************************
+* EinHandNeo                *
+* Umschalten mit Strg+Punkt *
+*****************************
+*/
+spacepressed := 0
+keypressed := 0
+
+; Reihe 1
+gespiegelt_7 = neo_6
+gespiegelt_8 = neo_5
+gespiegelt_9 = neo_4
+gespiegelt_0 = neo_3
+gespiegelt_strich = neo_2
+gespiegelt_tot2 = neo_1
+
+; Reihe 2
+gespiegelt_k = neo_w
+gespiegelt_h = neo_c
+gespiegelt_g = neo_l
+gespiegelt_f = neo_v
+gespiegelt_q = neo_x
+gespiegelt_sz = neo_tab 
+gespiegelt_tot3 = neo_tot1
+
+; Reihe 3
+gespiegelt_s = neo_o
+gespiegelt_n = neo_e
+gespiegelt_r = neo_a
+gespiegelt_t = neo_i
+gespiegelt_d = neo_u
+
+; Reihe 4
+gespiegelt_b = neo_z
+gespiegelt_m = neo_p
+gespiegelt_komma = neo_�
+gespiegelt_punkt = neo_�
+gespiegelt_j = neo_�
+
 /**********************
 * Tastenkombinationen *
 ***********************
@@ -204,29 +226,28 @@ menu,tray,tip,%name%
 ;Blinde/Sichtbare Tote Tasten
 *F9::
   if isMod4pressed()
-    DeadSilence := !(DeadSilence)
+    DeadSilence := !DeadSilence
   else send {blind}{F9}
 return
 
 ;Blinde/Sichtbare Compose
 *F10::
   if isMod4pressed()
-    DeadCompose := !(DeadCompose)
+    DeadCompose := !DeadCompose
   else send {blind}{F10}
 return
 
 ;Lang-s-Tastatur:
 *F11::
   if isMod4pressed() {
-    LangSTastatur := !(LangSTastatur)
+    LangSTastatur := !LangSTastatur
     if LangSTastatur
       KeyboardLED(2,"on")
     else KeyboardLED(2,"off")
   } else send {blind}{F11}
 return
 
-;Alle Modi und Locks in den Normalzustand versetzen
-;bzw. Skript neu laden:
+;Alle Modi und Locks in den Normalzustand versetzen, bzw. Skript neu laden:
 *Esc::
   if isMod4pressed()
     reload
@@ -240,6 +261,10 @@ Suspend, Permit
   else send {blind}{pause}
 return
 
+^,::lernModus := not(lernModus)
+
+^.::einHandNeo := !einHandNeo
+
 /*****************
 * Men�funktionen *
 ******************
@@ -307,78 +332,6 @@ return
 exitprogram:
   exitapp
 return
-
-/**************************
-* lernModus Konfiguration *
-* nur relevant wenn       *
-* lernModus = 1           *
-* Strg+Komma schaltet um  *
-***************************
-*/
-^,::lernModus := not(lernModus)
-
-; 0 = aus, 1 = an
-
-; die Nachfolgenden sind n�tzlich um sich die Qwertz-Tasten abzugew�hnen, da alle auf der 4. Ebene vorhanden.
-lernModus_std_Return = 0
-lernModus_std_Backspace = 0
-lernModus_std_PgUp = 0
-lernModus_std_PgDn = 0
-lernModus_std_Einf = 0
-lernModus_std_Entf = 0
-lernModus_std_Pos0 = 0
-lernModus_std_Ende = 0
-lernModus_std_Hoch = 0
-lernModus_std_Runter = 0
-lernModus_std_Links = 0
-lernModus_std_Rechts = 0
-lernModus_std_ZahlenReihe = 0
-
-; im folgenden kann man auch noch ein paar Tasten der 4. Ebene deaktivieren
-; n�tzlich um sich zu zwingen, richtig zu schreiben
-lernModus_neo_Backspace = 0
-lernModus_neo_Entf = 1
-
-/****************************
-* EinHandNeo                *
-* Umschalten mit Strg+Punkt *
-*****************************
-*/
-^.::einHandNeo := not(einHandNeo)
-
-spacepressed := 0
-keypressed:= 0
-
-; Reihe 1
-gespiegelt_7 = neo_6
-gespiegelt_8 = neo_5
-gespiegelt_9 = neo_4
-gespiegelt_0 = neo_3
-gespiegelt_strich = neo_2
-gespiegelt_tot2 = neo_1
-
-; Reihe 2
-gespiegelt_k = neo_w
-gespiegelt_h = neo_c
-gespiegelt_g = neo_l
-gespiegelt_f = neo_v
-gespiegelt_q = neo_x
-gespiegelt_sz = neo_tab 
-gespiegelt_tot3 = neo_tot1
-
-; Reihe 3
-gespiegelt_s = neo_o
-gespiegelt_n = neo_e
-gespiegelt_r = neo_a
-gespiegelt_t = neo_i
-gespiegelt_d = neo_u
-
-; Reihe 4
-gespiegelt_b = neo_z
-gespiegelt_m = neo_p
-gespiegelt_komma = neo_�
-gespiegelt_punkt = neo_�
-gespiegelt_j = neo_�
 ; LShift+RShift == CapsLock (simuliert)
 ; Es werden nur die beiden Tastenkombinationen abgefragt,
 ; daher kommen LShift und RShift ungehindert bis in die
@@ -392,15 +345,11 @@ gespiegelt_j = neo_
 isMod2Locked = 0
 VKA1SC136 & VKA0SC02A:: ; RShift, dann LShift
 VKA0SC02A & VKA1SC136:: ; LShift, dann RShift
-  if (GetKeyState("VKA1SC136", "P") and GetKeyState("VKA0SC02A", "P"))
-  {
-    if isMod2Locked
-    {
+  if (GetKeyState("VKA1SC136", "P") and GetKeyState("VKA0SC02A", "P")) {
+    if isMod2Locked {
       isMod2Locked = 0
       KeyboardLED(4,"off")
-    }
-    else
-    {
+    } else {
       isMod2Locked = 1
       KeyBoardLED(4,"on")
     }
@@ -410,6 +359,10 @@ return
 ;Mod3-Tasten (Wichtig, sie werden sonst nicht verarbeitet!)
 *VKBFSC02B:: ; #
 *VK14SC03A:: ; CapsLock
+  if (GetKeyState("VKBFSC02B", "P") and GetKeyState("VK14SC03A", "P")) {
+    DeadKey := "comp"
+    CompKey := ""
+  }
 return
 
 ;Mod4+Mod4 == Mod4-Lock
@@ -421,18 +374,14 @@ return
 IsMod4Locked := 0
 *VKA5SC138::
 *VKE2SC056::
-  if (GetKeyState("VKA5SC138", "P") and GetKeyState("VKE2SC056", "P"))
-  {
-    if IsMod4Locked
-    {
+  if (GetKeyState("VKA5SC138", "P") and GetKeyState("VKE2SC056", "P")) {
+    if IsMod4Locked {
       if zeigeLockBox
         MsgBox Mod4-Feststellung aufgebehoben!
        IsMod4Locked = 0
       if UseMod4Light
         KeyboardLED(1,"off")
-    }
-    else
-    {
+    } else {
       if zeigeLockBox
         MsgBox Mod4 festgestellt: Um Mod4 wieder zu l�sen, dr�cke beide Mod4-Tasten gleichzeitig!
       IsMod4Locked = 1
@@ -442,8 +391,7 @@ IsMod4Locked := 0
   }
 return
 
-EbeneAktualisieren()
-{
+EbeneAktualisieren() {
   global
   PriorDeadKey := DeadKey
   PriorCompKey := CompKey
@@ -452,35 +400,25 @@ EbeneAktualisieren()
   Modstate := IsMod4Pressed() . IsMod3Pressed() . IsShiftPressed()
   Ebene7 := 0
   Ebene8 := 0
-  if ahkTreiberKombi
-    if ( Modstate = "001")
-      Ebene = 6
-    else
-      Ebene = -1
-  else
-    if      (Modstate = "000") ; Ebene 1: Ohne Mod
-      Ebene = 1
-    else if (Modstate = "001") ; Ebene 2: Shift
-      Ebene = 2
-    else if (Modstate = "010") ; Ebene 3: Mod3
-      Ebene = 3
-    else if (Modstate = "100") ; Ebene 4: Mod4
-      Ebene = 4
-    else if (Modstate = "011") ; Ebene 5: Shift+Mod3
-      Ebene = 5
-    else if (Modstate = "110") ; Ebene 6: Mod3+Mod4
-      Ebene = 6
-    else if (Modstate = "101") ; Ebene 7: Shift+Mod4 impliziert Ebene 4
-    {
-      Ebene = 4
-      Ebene7 = 1
-    }
-    else if (Modstate = "111") ; Ebene 8: Shift+Mod3+Mod4 impliziert Ebene 6
-    {
-      Ebene = 6
-      Ebene8 = 1
-    }
-  Ebene12 := ((Ebene = 1) or (Ebene = 2))
+  if      (Modstate = "000") ; Ebene 1: Ohne Mod
+    Ebene = 1
+  else if (Modstate = "001") ; Ebene 2: Shift
+    Ebene = 2
+  else if (Modstate = "010") ; Ebene 3: Mod3
+    Ebene = 3
+  else if (Modstate = "100") ; Ebene 4: Mod4
+    Ebene = 4
+  else if (Modstate = "011") ; Ebene 5: Shift+Mod3
+    Ebene = 5
+  else if (Modstate = "110") ; Ebene 6: Mod3+Mod4
+    Ebene = 6
+  else if (Modstate = "101") { ; Ebene 7: Shift+Mod4 impliziert Ebene 4
+    Ebene = 4
+    Ebene7 = 1
+  } else if (Modstate = "111") { ; Ebene 8: Shift+Mod3+Mod4 impliziert Ebene 6
+    Ebene = 6
+    Ebene8 = 1
+  } Ebene12 := ((Ebene = 1) or (Ebene = 2))
   Ebene14 := ((Ebene = 1) or (Ebene = 4))
   NumLock := GetKeyState("NumLock","T")
 }
@@ -488,6 +426,8 @@ EbeneAktualisieren()
 IsShiftPressed()
 {
   global
+  if striktesMod2Lock
+    noCaps = 0
   if GetKeyState("Shift","P")
     if isMod2Locked and !noCaps
       return 0
@@ -503,23 +443,23 @@ IsShiftPressed()
 
 IsMod3Pressed()
 {
-   global
-   return ((GetKeyState("CapsLock","P")) or (GetKeyState("#","P")))
+  global
+  return ((GetKeyState("CapsLock","P")) or (GetKeyState("#","P")))
 }
 
 IsMod4Pressed()
 {
-   global
-   if( not(einHandNeo) or not(spacepressed))
-     if IsMod4Locked
-         return (not ( GetKeyState("<","P") or GetKeyState("SC138","P")))
-     else
-         return ( GetKeyState("<","P") or GetKeyState("SC138","P"))
-   else
-     if IsMod4Lock
-       return (not ( GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P")))
-     else
-       return ( GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P"))
+  global
+  if !(einHandNeo) or !(spacepressed)
+    if IsMod4Locked
+      return !(GetKeyState("<","P") or GetKeyState("SC138","P"))
+    else
+      return (GetKeyState("<","P") or GetKeyState("SC138","P"))
+  else
+    if IsMod4Locked
+      return !(GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P"))
+    else
+      return (GetKeyState("<","P") or GetKeyState("SC138","P") or GetKeyState("�","P"))
 }
 /*
    ------------------------------------------------------
@@ -855,7 +795,7 @@ neo_tot1:
     deadUni(0x002D) ; Querstrich, tot
     DeadKey = c5
   } else if (Ebene = 6) {
-    deadUni(0x0323) ; Punkt drunter (Colon), tot
+    deadUni(0x002E) ; Punkt drunter (Colon), tot
     DeadKey = c6
   } CompKey := PriorCompKey
 return
@@ -1309,8 +1249,8 @@ neo_sz:
     if LangSTastatur
       send �
     else {
-      SendUnicodeChar(0x017F) ; langes s
-      CheckComp("lang_s")
+      if !checkComp("lang_s")
+        SendUnicodeChar(0x017F) ; langes s
   } else if (Ebene = 5)
     SendUnicodeChar(0x03C2) ; varsigma
   else if (Ebene = 6)
@@ -1486,8 +1426,8 @@ neo_s:
                  or CheckDeadUni12("c6",0x1E63,0x1A62)))
     {
       if LangSTastatur and (Ebene = 1) {
-        SendUnicodeChar(0x017F) ;langes S
-        CheckComp("lang_s")
+        if !checkComp("lang_s")
+          SendUnicodeChar(0x017F) ; langes s
       } else outputChar("s","S")
     } else if (Ebene = 3)
     send {blind}?
@@ -2340,7 +2280,7 @@ CheckDeadAsc(d,val) {
   if (PriorDeadKey == d) {
     undeadAsc(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckDeadUni(d,val) {
@@ -2348,7 +2288,7 @@ CheckDeadUni(d,val) {
   if (PriorDeadKey == d) {
     undeadUni(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckDeadAsc12(d,val1,val2) {
@@ -2360,8 +2300,8 @@ CheckDeadAsc12(d,val1,val2) {
     } else if (Ebene = 2) and (val2 != "") {
       undeadAsc(val2)
       return 1
-    } else return 0
-  } else return 0
+    }
+  }
 }
 
 CheckDeadUni12(d,val1,val2) {
@@ -2373,104 +2313,70 @@ CheckDeadUni12(d,val1,val2) {
     } else if (Ebene = 2) and (val2 != "") {
       undeadUni(val2)
       return 1
-    } else return 0
-  } else return 0
-}
-
-compAsc(val) {
-  global
-  if !DeadCompose
-    send % val
-}
-
-compUni(val) {
-  global
-  if !DeadCompose
-    SendUnicodeChar(val)
-}
-
-uncompAsc(val) {
-  global
-  if DeadCompose
-    send % val
-  else send % "{bs}" . val
-}
-
-uncompUni(val) {
-  global
-  if !DeadCompose
-    send {bs}
-  SendUnicodeChar(val)    
-}
-
-uncomp3Uni(val) {
-  global
-  if !DeadCompose
-    send {bs}{bs}
-  SendUnicodeChar(val)    
+    }
+  }
 }
 
 CheckCompAsc(d,val) {
   global
   if (PriorCompKey == d) {
-    uncompAsc(val)
+    send % val
     return 1
-  } else return 0
+  }
 }
 
 CheckCompAsc12(d,val1,val2) {
   global
   if (PriorCompKey == d)
     if (Ebene = 1) and (val1 != "") {
-      uncompAsc(val1)
+      send % val1
       return 1
     } else if (Ebene = 2) and (val2 != "") {
-      uncompAsc(val2)
+      send % val2
       return 1
-    } else return 0
-  else return 0
+    }
 }
 
 CheckCompUni(d,val) {
   global
   if (PriorCompKey == d) {
-    uncompUni(val)
+    SendUnicodeChar(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckCompUni12(d,val1,val2){
   global
   if (PriorCompKey == d) {
     if (Ebene = 1) and (val1 != "") {
-      uncompUni(val1)
+      SendUnicodeChar(val1)
       return 1
     }else if (Ebene = 2) and (val2 != "") {
-      uncompUni(val2)
+      SendUnicodeChar(val2)
       return 1
-    } else return 0
-  } else return 0
+    }
+  }
 }
 
 CheckComp3Uni(d,val) {
   global
   if (PriorCompKey == d) {
-    uncomp3Uni(val)
+    SendUnicodeChar(val)
     return 1
-  } else return 0
+  }
 }
 
 CheckComp3Uni12(d,val1,val2) {
   global
   if (PriorCompKey == d) {
     if (Ebene = 1) and (val1 != "") {
-      uncomp3Uni(val1)
+      SendUnicodeChar(val1)
       return 1
     } else if (Ebene = 2) and (val2 != "") {
-      uncomp3Uni(val2)
+      SendUnicodeChar(val2)
       return 1
-    } else return 0
-  } else return 0
+    }
+  }
 }
 
 outputChar(val1,val2) {
@@ -2478,14 +2384,14 @@ outputChar(val1,val2) {
   if (Ebene = 1)
     c := val1
   else c := val2
-  if GetKeyState("Shift","P") and isMod2Locked
-    send % "{blind}{Shift Up}" . c . "{Shift Down}"
-  else send % "{blind}" . c
-  if (PriorDeadKey = "comp")
-    CompKey := c
+  if !(CheckComp(c) and DeadCompose or PriorCompKey)
+    if GetKeyState("Shift","P") and isMod2Locked
+      send % "{blind}{Shift Up}" . c . "{Shift Down}"
+    else send % "{blind}" . c
 }
 
 checkComp(d) {
+  global
   if (PriorDeadKey = "comp") {
     CompKey := d
     return 1
@@ -2501,12 +2407,13 @@ Dieser basiert auf http://www.autohotkey.com/forum/topic32947.html
 Der 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.
 */
 
-SendUnicodeChar(charCode){
+SendUnicodeChar(charCode) {
+
   IfWinActive,ahk_class gdkWindowToplevel
   {
     StringLower,charCode,charCode
     send % "^+u" . SubStr(charCode,3) . " "
-  }else{
+  } else {
     VarSetCapacity(ki,28*2,0)
     EncodeInteger(&ki+0,1)
     EncodeInteger(&ki+6,charCode)
@@ -2518,7 +2425,7 @@ SendUnicodeChar(charCode){
   }
 }
 
-EncodeInteger(ref,val){
+EncodeInteger(ref,val) {
   DllCall("ntdll\RtlFillMemoryUlong","Uint",ref,"Uint",4,"Uint",val)
 }
 /*
diff --git a/windows/autohotkey/neo20.exe b/windows/autohotkey/neo20.exe
index 42533ad..c4cd3f9 100644
Binary files a/windows/autohotkey/neo20.exe and b/windows/autohotkey/neo20.exe differ
-- 
cgit v1.2.3