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

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options