Hacking the bloody keyboard . . .
So . . . I spilled a little tea on my keyboard the other day. My initial reactions were good: I tipped it upside down, pulled the power and the battery. The next morning I thought I'd given it plenty of time to dry off (my biggest mistake). It worked fine for about 20 minutes, then I got some strange 'stickiness' behavior - I think something shorted.
To make a long story short, four keys on the keyboard are now nonfunctional: '-', backslash, return and 'f11.' Now, the '-' and return keys are necessities, I can live without 'f11' and I only really use the backslash when I'm doing something on a windoze box. Though I might miss the bar when I'm piping commands on the unix command line, I don't do too much command-line work these days. So, what to do!? Well, I found a nice little hack for remapping keys on the powerbook. Here's what I did.
There's a kernel extension XML file on the power book that maps the physical keys to their (unicode?) functions. The file is:
/System/Library/Extensions/AppleADBKeyboard.kext/Contents/Info.plist
In the XML there are these lines:
<key>ADBVirtualKeys</key>
<string>0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x1B,0x33,0x24,0x35,0x3B,0x37,0x38,0x39,0x3A,0x7B,0x7C,0x7D,0x7E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x3C,0x3D,0x3E,0x36,0x7F</string>
(This is my modified version and I've added breaks for presentation BUT DON'T ADD WHITESPACE TO THE STRING IN ANY EDITS YOU DO) The string entry associates keys with their function; the values are the functions, the positions are the keys. I changed 'enter' to work like 'return' and the 'tilde' to work like '-' (I never use the bloody tilde). Here's an incomplete table of the values and their corresponding functions (some of these are best guesses):
| 0x00 | a | 0x10 | y | 0x20 | u | 0x30 | tab | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x01 | s | 0x11 | t | 0x21 | [ | 0x31 | spacebar | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x02 | d | 0x12 | 1 | 0x22 | i | 0x32 | ` | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x03 | f | 0x13 | 2 | 0x23 | p | 0x33 | delete | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x04 | h | 0x14 | 3 | 0x24 | return | 0x34 | enter | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x05 | g | 0x15 | 4 | 0x25 | l | 0x35 | esc | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x06 | z | 0x16 | 6 | 0x26 | j | 0x36 | 0x40 | 0x50 | 0x60 | 0x70 | |||||
| 0x07 | x | 0x17 | 5 | 0x27 | ' | 0x37 | command | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x08 | c | 0x18 | = | 0x28 | k | 0x38 | shift | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x09 | v | 0x19 | 9 | 0x29 | ; | 0x39 | shift | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x0A | 0x1A | 7 | 0x2A | \ | 0x3A | option/alt | 0x40 | 0x50 | 0x60 | 0x70 | |||||
| 0x0B | b | 0x1B | - | 0x2B | , | 0x3B | control | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x0C | q | 0x1C | 8 | 0x2C | / | 0x3C | command | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x0D | w | 0x1D | 0 | 0x2D | n | 0x3D | 0x40 | 0x50 | 0x60 | 0x70 | |||||
| 0x0E | e | 0x1E | ] | 0x2E | m | 0x3E | control | 0x40 | 0x50 | 0x60 | 0x70 | ||||
| 0x0F | r | 0x1F | o | 0x2F | . | 0x3F | 0x40 | 0x50 | 0x60 | 0x70 |
Finally, there are a few cached versions of the mapping that need to be flushed and the new kernel extension can then be loaded. I wrote a little shell script to do this (must be run as root):
#!/bin/sh
# Flush existing caches
rm /System/Library/Extensions.mkext
rm /System/Library/Extensions.kextcache# Touch the relevent dirs etc.
touch /System/Library/Extensions
touch /System/Library/Extensions/AppleADBKeyboard.kext# reload the keyboard kernel extension
/sbin/kextunload /System/Library/Extensions/AppleADBKeyboard.kext && /sbin/kextload /System/Library/Extensions/AppleADBKeyboard.kext
Most of this was already documented at http://www.snark.de/index.cgi/0007


Comments
Post new comment