Die Spielereien mit den Tastaturlayouts und auch die Hacks mit uControl haben mich noch immer nicht ganz glücklich gemacht.
Mac OS X arbeitet auf diesen Ebenen intern mit den ADB Tastaturcodes und die erlauben z.B. schon keine Unterscheidung zwischen linkern und rechten shift, command bzw. alt Tasten mehr. Und das, obwohl die meisten Tastaturen sehr wohl unterschiedliche Codes für diese Tasten aussenden.
Also begab ich mich weiter auf die Suche. Und siehe da: ich wurde auf den OpenDarwin Seiten fündig. Dort stellt Apple grosse Teile des Quelltextes zu Mac OS X zur Verfügung. Insbesondere auch den AppleUSBKeyboard Treiber. Und hier hab' ich dann tatsächlich eine hart codierte Tabelle gefunden, in der für jeden USB Tastencode ein Feld ist, das den zu verwendenden ADB Tastencode enthält.
Der fertige Treiber wird von Apple unter
/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext/Contents/MacOS/AppleUSBKeyboardinstalliert und siehe da: die Umsetzungstabelle findet sich (fast) 1:1 im binären Treiber wieder (fast heisst: Apple hat anscheinend nicht alles an opendarwin weitergegeben. Oberhalb des Codes 107 hat der OS X Treiber noch ein paar Einträge, die die opendarwin Version nicht hat - vermutlich für asiatische Tastaturen).
Und noch besser: wenn man in dieser Tabelle im System Treiber hart neue Werte einpatcht, kriegt man - nicht etwa eine Kernel Panic (wenn man's richtig macht zumindest) - sondern das System arbeitet so, als hätte man tatsächlich die Tastatur neu verdrahtet!
Also hab' ich mich noch 'nen Tag hingesetzt und ein kleines perl script gebastelt, dass diese Patcherei (etwas) komfortabler gestaltet: usbkbpatch.pl wird mit root rechten aus dem Terminal aufgerufen. Beim ersten Aufruf (oder nach einem System-Update) legt es eine Kopie des original Treibers an. Dann trägt es die Patch Werte von der Kommandozeile in den USB Treiber ein und lädt ihn anschliessend neu. Als Patch Werte werden jeweils Zahlen Paare angegeben (wahlweise dezimal oder in hex mit dem präfix 0x), von denen die erste den USB Tastaturcode definiert, der verändert werden soll, und die zweite den neuen ADB Tastatur Code..
Hier sind ein paar interessante USB codes:
0xe0 | control (strg) links |
0xe1 | shift links |
0xe2 | option/alt links |
0xe3 | comand links |
0xe4 | control (strg) rechts |
0xe5 | shift rechts |
0xe6 | option/alt rechts |
0xe7 | comand rechts |
0x65 | Windows Kontext-Menü (auf PC USB Tastaturen) |
0x64 | ^ (das Dach - auf wintel-usb mit < (kleiner) vertauscht) |
0x35 | < (kleiner - auf wintel-usb mit ^ (dach) vertauscht) |
0x53 | die insert-Taste - auf imac Tastaturen sucht meine Hand da immer delete |
Und hier ein paar dazu passende ADB codes:
0x3b | control |
0x38 | shift |
0x3a | option/alt |
0x37 | command |
0x34 | enter (im ggs. zu return...) |
0x32 | < (kleiner) |
0x0a | ^ (Dach) |
0x75 | delete |
Also:
sudo su ./usbkbpatch.pl 0xe2 0x37 0xe6 0x37 0xe3 0x3a 0xe7 0x3a 0x64 0x32 0x35 0x0a |
open /Applications/Utilities/Key\ Caps.app |
(kann eigentlich ja gar nicht sein - oder?)
Der original-Treiber wurde in
System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext/Contents/MacOS/ |
kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext cd /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext/Contents/MacOS/ ls cp AppleUSBKeyboard.Darwin_6.6 AppleUSBKeyboard kextload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext |
Dieser Patch greift recht brutal in das Innere eines Mac OS X Treibers ein und man kann sich auf diese Art natürlich das System ziemlich unbedienbar machen (z.B. indem man die Return- bzw. enter Taste mit irgend einem anderen USB Keycode belegt und dann nicht mehr die nötigen Kommandos zum Wiederherstellen des Ursprungszustandes eingeben kann...)
Falls das Terminal Fenster mit root access noch offen ist, kann man versuchen, das folgende code-schnipsel per copy & paste auszuführen:
kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext cd /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext/Contents/MacOS/ cp AppleUSBKeyboard.Darwin_* AppleUSBKeyboard kextload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBKeyboard.kext |
An meinem iBook war ich natürlich recht sicher vor solchen Problemen: die eingebaute Tastatur arbeitet sowiso mit ADB codes - Ich konnte mir also nur die zusätzliche externe USB Tastatur durcheinander bringen...
Update 19. November 2003:
Anpassung an Panther: das betroffene Kernel Modul ist jetzt IOHIDFamily.kext
und die Tabelle hat sich auch ein wenig geändert.
Leider braucht es jetzt einen neustart um die geänderte Tabelle zu
aktivieren, da IOHIDFamily kein entladbares Modul ist.
Autor:
Heiko Hellweg,
geändert: November 2003