10.4: Change keymapping only on external keyboards

Mar 24, '06 05:36:00AM

Contributed by: lucas_

Tiger only hintThis tip covers how to get Command and Option in the right place on an external PC keyboard, without stuffing them up on the built-in keyboard of a PowerBook. This is of great use to people who dock their laptop with a Windows keyboard, but don't like the "wrong" keyboard layout it produces and tire of constantly changing it back and forth in the system prefs. It would work with iBooks too.

Part A: Getting the external keyboard right

  1. Click the Apple logo and open the System Preferences.
  2. Click the Keyboard & Mouse section, then select Modifier Keys on the Keyboard tab.
  3. Swap the functions for the Option and Command keys.
Now check that the external keyboard works as you would expect. ie. Windows key is now Option, and Windows Alt is now Command. You'll notice that the internal keyboard is now swapped, too, but we'll fix that in a moment.

Part B: Fixing the internal keyboard

Using the instructions from snark.de (no affiliation), we are going to swap the Option and Command keys (again), but this time only on the internal keyboard. Note that it is a very good idea to first back up the file we are going to modify:

cp /System/Library/Extensions/AppleADBKeyboard.kext/Contents/Info.plist \
~/AppleADBKeyboard.backup.plist
  1. Open a Terminal window and run this command:
    sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit \
    /System/Library/Extensions/AppleADBKeyboard.kext/Contents/Info.plist
  2. Find the section ADBVirtualKeys that looks like this:

    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,0x32,0x33,0x34,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

  3. From the guide, we can see that we want to swap 0x37 (Command) and 0x3A (Option), so it looks like this when done:

    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,0x32,0x33,0x34,0x35,0x3B,0x3A,0x38,0x39,0x37,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

  4. Now you can reboot to apply the changes, or reload the kernel extension. The command to reload the extension is:
    sudo kextunload /System/Library/Extensions/AppleADBKeyboard.kext && \
    sudo kextload /System/Library/Extensions/AppleADBKeyboard.kext
    Note that this must be run as a single command, otherwise you won't be able to type the second part of the command.
Now both the Windows keyboard and the internal keyboard should have the correct key mappings.

Note: There is a comment in the snark.de guide about clearing a bunch of caches so the changes don't revert. I did this, and the changes haven't reverted yet. I wont repeat that info, it's all in the snark.de guide. The changes made may be reset during a system update. Presumably they can just be reapplied after the update. This was tested on a 12" 1.5Ghz Powerbook G4, running OS X 10.4.5.

Comments (25)


Mac OS X Hints
http://hints.macworld.com/article.php?story=20060321013645653