
# Treiber-Know-How

Auf dieser Seite sollen Interna der Treiberentwicklung festgehalten werden.
Mit welchen Programmen lassen sich die Treiber bearbeiten, welche Möglichkeiten sind schon getestet worden, was kann in der Zukunft noch probiert werden?

Auch Sackgassen sollten dokumentiert werden, damit nicht die nächsten wieder reinlaufen!

Natürlich kann diese Seite auch denjenigen helfen, die sich ihre Treiber individuell anpassen wollen. 
Dafür gibt es wohl vor allem zwei Gründe: 

  * spezielle Bedürfnisse, die in der allgemeinen Referenz nicht berücksichtigt werden können 
  * spezielle Hardware, die Anpassungen nötig macht

## Windows
Für Windows gibt es aktuell vier verschiedene Neo-Treiber. Infos zur [Einrichtung der Treiber](../Einrichtung/index.md#windows) gibt es auf einer Extraseite.

### kbdneo
[kbdneo](../Einrichtung/kbdneo.md) ist eine native Tastaturlayout-Definition, vergleichbar mit den mitgelieferten Layouts wie Qwertz oder Dvorak. Die Tastendrücke werden entsprechend der Definition in Zeichen umgesetzt und die verschiedenen Ebenen berücksichtigt. Leider sind technisch nicht alle Funktionen der Referenz möglich (insbesondere auf der vierten Ebene). Diese können mittels ReNeo nachgerüstet werden.

Für die Entwicklung des kbdneo-Treibers wird momentan das [Windows Driver Kit](https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) verwendet.
Für die Mod3-Ebene wird ein neu geschaffener Modifier verwendet, für die Mod4-Ebene der japanische Kana-Modifier.

Näheres zur Kompilierung siehe [Build-Anleitung](https://git.neo-layout.org/neo/neo-layout/src/branch/master/windows/kbdneo2) im kbdneo-Verzeichnis. Für weitere Infos: qwertfisch fragen (z.B. im IRC).

### ReNeo

[ReNeo](../Einrichtung/reneo.md) ist von Grund auf neu geschrieben und ein schlanker Treiber, der keine weiteren Abhängigkeiten hat und keine Admin-Rechte benötigt. Er unterstützt alle Features des Neo-Layouts und zeigt sich bislang deutlich stabiler als frühere Treiber. Der Treiber wird [aktiv weiterentwickelt](https://github.com/Rojetto/ReNeo).

Für ReNeo existieren zwei Betriebsmodi:

  - der Standalone-Modus ohne weitere Voraussetzungen
  - der Erweiterungsmodus, bei die Vorteile von ReNeo mit den Vorteilen des nativen Treibers kbdneo verbunden werden.

Vorteile gegenüber kbdneo alleine sind:

  - verbesserte Kompatibilität mit Qt- und GTK-Anwendungen
  - vollständige Compose-Unterstützung, Erzeugung von mehreren Zeichen auf einmal
  - die Compose-Taste ++Mod3+Tab++ sendet keinen ++Tab++ mehr an die Anwendung
  - stabilere Nutzung ohne den Umweg über AutoHotkey

Außerdem erkennt ReNeo den Wechsel des Tastaturlayouts (falls man z.B. normales Qwertz zusätzlich installiert hat) und (de-)aktiviert sich entsprechend.

Technisch ist ReNeo mit [neo2-llkh](#neo2-llkh) zu vergleichen, da in beiden Fällen ein schlankes Programm für die Umsetzung der Tastendrücke sorgt. ReNeo im Standalone-Modus arbeitet nach demselben Prinzip, ist aber besonders in Hinblick auf Stabilität, Fehlerfreiheit und Unterstützung älterer Windows-Versionen entwickelt. Der Erweiterungsmodus verbindet diese Eigenschaften mit den Vorteilen eines nativen Layouts (siehe [hier](../Einrichtung/kbdneo.md#vorteile-und-unterschiede-zu-reneo)).

### Neovars
Neovars ist in der Skriptsprache [AutoHotkey](https://www.autohotkey.com/) geschrieben. Dies ermöglicht die komplette Umsetzung der Referenz (und noch mehr). Die Skripte sowie die fertig kompilierte exe-Dateien lassen sich ohne Administratorrechte ausführen. Allerdings kann mit dieser Herangehensweise kein echtes Tastaturlayout realisiert werden, da die Tastendrucke abgefangen und über mehrere Schichten hinweg (bedingt durch AutoHotkey) umgewandelt werden, was zu ganz eigenen Problemen führt.

NeoVars ist der langjährige Vorläufer von ReNeo und ist hier insbesondere aufgeführt, da es noch viele bestehende Nutzer gibt. Entsprechend bleibt die [Dokumentation](../Einrichtung/neovars.md) für Nutzer erhalten. Dieser Treiber sollte aber nicht mehr verwendet werden.

Die sehr alte Version des AHK-Treibers vor der Neuimplementierung (vor 2010) steht [im Repository](https://git.neo-layout.org/neo/neo-layout/src/branch/master/windows/ahk-auslaufend) zur Verfügung, jedoch nur noch aus historischen Gründen.


### neo2-llkh
[neo2-llkh](https://github.com/MaxGyver83/neo2-llkh) ist ein sehr schlanker Treiber, der weder Autohotkey noch Admin-Rechte benötigt. Er unterstützt alle sechs Ebenen und entstand aus dem Bedürfnis heraus, NeoVars spezifisch an einzelne Anforderungen anpassen zu wollen (z.B. Umbelegung der Modifier-Tasten). Der technische Ansatz entspricht demselben wie ReNeo, mit dem Fokus auf freie Anpassung und Positierung von Modifiern (darunter auch ++Alt++, ++Strg++ und ++Win++). Dies ist in ReNeo zwar auch möglich, jedoch nicht über einfache Einstellungen in einer Textdatei. Weiterhin kann CapsLock als zusätzliche Escape-Taste konfiguriert werden, oder es lässt sich einstellen, dass für ++Strg++-Shortcuts das Qwertz-Layout gelten soll.

Dieser Treiber ist mit der jüngste in der Liste und deshalb auch nicht so gut erprobt wie die anderen. Die Funktionsfähigkeit wird erst ab Windows 10 gewährleistet.

### Weitere Programme
Es gibt noch einige andere, deutlich ältere Programme, mit denen ebenfalls die Änderung des Windows-Tastaturlayouts möglich ist. Sie sind jedoch den oben beschriebenen aus verschiedenen Gründen unterlegen:

  * [MSKLC 1.4](https://www.microsoft.com/en-us/download/details.aspx?id=102134) ist für Windows, kostenlos und gut, wenn man „nur“ 4 Ebenen hat. Es ist in der Hilfedatei hervorragend beschrieben. Man erstellt wie mit dem WDK ([kbdneo](#kbdneo)) ein „echtes“ Tastaturlayout. Wurde für Neo1 verwendet.
  * [KbdEdit](http://www.kbdedit.com/): Ein vielversprechendes Programm zur Erstellung von Tastaturlayouts. Doch da nicht nur die Entwicklerversion Geld kostet, sondern auch das fertige Layout nur mit dem kostenpflichtigen Player verwendet werden kann, kommt es für Neo leider nicht in Frage.
  * [KeyTweak](http://webpages.charter.net/krumsick/):  Greift direkt in die Registry ein und ermöglicht so nicht das Umschalten zwischen Neo und qwertz. Kann aber z.B. CapsLock dauerhaft zu AltGr ändern.

    !!! fail "Achtung"
        Der Link funktioniert nicht mehr.


## Linux
Hier ist [die Einrichtung von Neo unter Linux](../Einrichtung/Linux.md) beschrieben.

Die Linux-„Treiber“ sind reine Textdateien, lassen sich also mit dem Editor bearbeiten.
Interessant sind also vor allem Probleme, die beim Bearbeiten aufgetaucht sind.

Falls Linux mit einer **Mac-Tastatur** betrieben werden soll (adb, z.B. Installation auf einem iBook), gibt es wohl Probleme, CapsLock umzubelegen. Dazu ist ein Patch (macintosh-mangle-caps-lock-events-on-adb-keyboards.patch) notwendig, der einen Eintrag /proc/sys/dev/adbhid/mangle_caps_lock_events hinzufügt (siehe dazu [hier](http://hans.fugal.net/yodl/blosxom.cgi/mac/caps.html) und [hier](https://lists.debian.org/debian-powerpc/2005/12/msg00214.html)). 
Dieser [Patch](https://mirrors.edge.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/) befand sich auch eine Weile im ­mm Zweig des Kernels, ist aber inzwischen wieder rausgeflogen.

### Xmodmap
Zur Info die allgemeine [Man-Page](http://www.xfree86.org/4.0.1/xmodmap.1.html) zur Xmodmap, sowie eine deutsche Seite aus dem [Ubuntu-Wiki](https://wiki.ubuntuusers.de/Xmodmap/). Generell ist die Verwendung von Xmodmap veraltet und sollte nur noch in Ausnahmefällen zum Tragen kommen.

### Xkbmap
Einige Ressourcen, die beim Entwickeln von xkb helfen können: 

  * [„X keyboard extension“](https://wiki.archlinux.org/index.php/X_keyboard_extension), die umfangreiche Dokumentationsseite zu xkb vom Archwiki.
  * [„XKB configuration guide“](https://www.x.org/releases/current/doc/xorg-docs/input/XKB-Config.html), hier wird die Einrichtung von Xorg XKB beschrieben, das Manual richtet sich vor allem an Anwender.
  * [„How to further enhance XKB configuration“](https://www.x.org/releases/current/doc/xorg-docs/input/XKB-Enhancing.html), hier wird vor allem für Entwickler die Erstellung von neuen (internationalisierten) Tastaturlayouts beschrieben. Für ein einfaches Layout ohne komplizierte Modifier-Verhalten sollte diese Anleitung ausreichen.
  * [„An Unreliable Guide to XKB Configuration“](http://www.charvolant.org/doug/xkb/html/index.html), vermutlich nicht ganz so unverlässlich, wie es sich selbst schimpft :-)
  * [X Keyboard Extension von Ivan Pascal](http://pascal.tsu.ru/en/xkb/), auch wenn Sprache und Rechtschreibung dort sehr zu wünschen übrig lassen, bekommt man dort einen weitaus tieferen Einblick als in all den anderen Anleitungen.
  * [XKB protocol specifications](http://www.x.org/releases/current/doc/kbproto/xkbproto.pdf), eine umfangreiche Beschreibung aller XKB-Features. Erfahrung mit XKB ist notwendig, da die Beschreibung auf Protokollebene erfolgt.

Es wurde viel diskutiert, wie der Name des Layouts in den Treibern und im X-Server sein soll. 
Für die Aufnahme in den offiziellen X-Server muss das Layout »de_neo« heißen, im X-Server wird also „neo“ als Option des Layouts „de“ ausgewählt.

### Compose

Es gibt eine eigene Seite zum [Einrichten der Neo-Composedatei](../Benutzerhandbuch/Tote-Tasten-und-Compose.md#linux).

## Mac OS
Allgemeine Infos gibt es unter [Einrichtung von Neo auf einem Mac](../Einrichtung/macOS.md).

!!! warning "Warnung"
    Die folgenden genannten Alternativen sind veraltet und die Links zu den E-Mails nicht mehr gültig. Das macOS-Layout wird aktuell über ein natives Keylayout sowie Erweiterungen mittels Karabiner Elements hergestellt.

Eventuelle Alternativen zum [neo.keylayout](#neokeylayout):

  * Wird ein X-Server installiert, läßt sich auch eine Xmodmap laden. Allerdings benötigt man eine speziell angepaßte Version der Xmodmap, und sie wirkt sich nur auf Programme aus, die unter X11 laufen. Zu finden ist diese angepaßte Version im Anhang von Pascals Mail auf der Mailingliste: [neo_mac.xmodmap](http://lists.neo-layout.org/pipermail/diskussion/2009-June/013158.html) (ab »nächster Teil«). Allerdings funktionieren dabei nicht die Ebenen 4 und 6 (siehe entsprechende [Diskussion](http://lists.neo-layout.org/pipermail/diskussion/2009-June/013159.html)).
  * Vielleicht wird es irgendwann auch eine Dotnet-Implementierung für AHK geben, dann könnte man auch den AHK-Treiber am Mac benutzen ([die Meldung dazu](http://www.autohotkey.com/forum/topic34421-30.html)).

### neo.keylayout
Es ist nicht schwierig, die Datei [neo.keylayout](https://git.neo-layout.org/neo/neo-layout/raw/branch/master/mac_osx/neo.keylayout) zu bearbeiten, da Apple sich hier für das mensch- wie maschinenlesbare XML-Format entschieden hat.

  * **code** gibt die Nummer der Taste an, durch deren Drücken man das dahinter geschriebene Zeichen erhält. 
  * Nach Tasten mit **action** wartet der Computer auf eine zweite Eingabe. 
  * Welches Zeichen man durch die Kombinationen erhält, kann man am Ende der Datei unter **actions** definieren.
  * Weitere Infos gibt’s in einer [Technical Note](http://developer.apple.com/technotes/tn2002/tn2056.html).

[Ukelele](https://software.sil.org/ukelele/) ist ein sehr guter Keyboardlayouteditor für Mac, sowohl was Handhabung als auch Dokumentation angeht. Dies ist komfortabler, als die XML-Datei mit einem normalen Texteditor zu bearbeiten.

### Modifier
Neo verwendet die „Alt-/Optionstaste“ als M3, also ist Ebene 3 mit „Alt/Option“, Ebene 5 mit „Alt/Option“ + „Shift“ erreichbar. In den Systemeinstellungen verbirgt sich unter „Tastatur“ das „Sondertasten-Menü“ (engl. bei den System Preferences „Keyboard“ → „Modifier“). Dort können CapsLock, Ctrl, Alt/Option/Wahltaste und Apfel/Befehlstaste neu belegt werden. Es wird empfohlen, dort für CapsLock die Funtkion „Alt/Option“ einzustellen, um den linken Mod3 am gewohnten Platz vorzufinden.

Die Tasten # und < lassen sich in den Systemeinstellungen nicht als Modifier einstellen. Das ist jedoch über das Programm [KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html) möglich in Kombination mit der für Neo angepassten [http://neo-layout.org/private.xml](http://wiki.neo-layout.org/browser/mac_osx/private.xml?format=raw). Diese xml-Datei lässt sich auch noch weiter bearbeiten und an individuelle Bedürfnisse anpassen.

#### M4 und rechte CMD-Taste

Wer eine Apple-Tastatur besitzt, bei der rechts neben der Leertaste eine weitere CMD-Taste existiert, kann über folgende Lösung diese Taste als weitere CMD- und nicht als M4-Taste nutzen (M4 wird dann über die rechte ALT-Taste bedient). Dann können Shortcuts mit Command-Key auch per Zehnfingerstystem und ohne Klammergriff bedient werden können.

Hierzu einfach die [KeyRemap4MacBook XML Datei](https://git.neo-layout.org/neo/neo-layout/raw/branch/master/mac_osx/private.xml) anpassen:

```
<!-- Mod 4 Modifiers and Mod 4 Locks -->

<autogen>--KeyOverlaidModifier-- KeyCode::OPTION_R, ModifierFlag::EXTRA1,
 KeyCode::VK_MODIFIER_EXTRA1, KeyCode::VK_LOCK_EXTRA1</autogen>
<autogen>--KeyToKey-- KeyCode::OPTION_R, KeyCode::VK_MODIFIER_EXTRA1</autogen>
```

Ein umbinden der rechten Option auf rechte Command ist danach auch nicht mehr nötig in KeyRemap4MacBook.

## Compose

Zur Aufnahme oder Änderung von [Compose](../Benutzerhandbuch/Tote-Tasten-und-Compose.md#compose)-Kombinationen muss die Datei /Compose/src/base.module im Repository um die entsprechenden Einträge ergänzt werden. Diese UTF-8-Datei ist im Standard-Compose-Format für Linux geschrieben. Die Compose-Funktion unter Windows (beispielsweise die von ReNeo) wird hieraus automatisch generiert.

### Beschreibung einer typischen Kombination
Die Coko ♫|C=ℂ würde beispielsweise durch die folgende Zeile umgesetzt werden:
> `<Multi_key> <bar> <C>                   : "ℂ" U02102 # DOUBLE-STRUCK CAPITAL C`

Dabei steht…

  * `<Multi_key>` für ♫,
  * `<bar>` für | (symbolischer Linux-Name in ASCII),
  * `<C>` für C (auch ASCII ;-)),
  * `"ℂ"` für die Ausgabe (diesmal als echtes, d.h. UTF-8-kodiertes Unicode-Zeichen zwischen den Anführungszeichen),
  * und alles hiernach ist ein Kommentar, und zwar
    * der eindeutige Unicode-Codepointder Ausgabe: ` U02102`,
    * und die offizielle Unicode-Beschreibung dieses Zeichens: `# DOUBLE-STRUCK CAPITAL C`.

Die offiziellen Beschreibungen und Codepoints können in der [Unicode-Referenz](https://unicode.org/Public/14.0.0/ucd/UnicodeData-14.0.0d7.txt) nachgeschlagen werden. Bei umfangreichen systematischen Ergänzen ist es sinnvoll, die Cokos zur Arbeitsersparung mit einer Tabellenverarbeitung zu erstellen, oder ein entsprechendes Skript zu erstellen.

### Überschreiben vorhandener Cokos
Falls einmal bereits vorhandene Kombinationen bewusst umdefiniert werden sollten, ist es wichtig, dass die Compose.neo am Ende der Compose eingefügt  wird, da bei mehrfach vorhandenen Kombinationen stets die letzte gültig ist.

### Sonstige Hinweise

  * Bei Kombinationen mit Zahlen die KP_-Zahlen nicht vergessen!
  * Wieso setzt man sowohl <underbar\> als auch <underscore\>? 
    * Einige Programme (z.B. gucharmap) reagieren auf beide unterschiedlich, bei Neo wird aber nur underscore benutzt. Da es in der Standard-Compose stets beide Definitionen gibt, wurde das bislang so beibehalten, auch wenn die underbar-Definitionen höchstwahrscheinlich nie gebraucht werden werden.
  * Funktionieren auch Angaben der Form <Multi_key\> <U1234\> <∀>?
    * Unter Linux definitiv nicht. Darum sollten wir bei der bisherigen Lösung bleiben, die vielleicht für Entwickler umständlicher ist, aber dafür problemlos funktioniert.
