Monthly Archives: May 2018

More (mechanical) keyboards and Mac key remapping

After browsing too much r/MechanicalKeyboards I bought some more keyboards… 😀

One is a white TKL CODE with 65g Zealios switches
White TKL CODE with 65g Zealios switches
(which is essentially the same as my current WASDv2 except for the case color, switches and lighting), which I bought because I was interested in the Zealios switches, and this is one of the few pre-made keyboards that offer them.

The other was a birthday present to myself and is a Leopold FC660C (Topre) in Grey & Blue:Leopold FC660C (Topre) in Grey & BlueThe Leopold does not have a Mac specific mode (although you can use its DIP switches to swap the Windows and Alt key, but that doesn’t get you ⌘ to the right of the space bar).

Therefore I fiddled a bit with remapping some keys for these keyboards for macOS use. One option for the Leopold FC660C is Hasu’s Alt Controller which replaces the controller board itself with a fully programmable one. Another option is to use Karabiner to remap the keys at the software level, but I found the CPU usage of Karabiner’s karabiner_grabber process a bit too high for what it should be doing. Since macOS 10.12 there’s another way to remap keys using hidutil.

My configuration (for both keyboards) looks as follows (stored inside ~/bin/remap.sh which is run on login, based on this script):

#!/usr/bin/env bash
# https://developer.apple.com/library/content/technotes/tn2450/_index.html
# https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-1035.41.2/IOHIDFamily/IOHIDUsageTables.h.auto.html
# https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-1035.41.2/IOHIDFamily/AppleHIDUsageTables.h.auto.html
FROM="\"HIDKeyboardModifierMappingSrc\""
TO="\"HIDKeyboardModifierMappingDst\""

ESCAPE="0x700000029"
CAPS_LOCK="0x700000039"

PRINT_SCREEN="0x700000046"
SCROLL_LOCK="0x700000047"
PAUSE="0x700000048"
INSERT="0x700000049"

F13="0x700000068"
F14="0x700000069"
F15="0x70000006A"

LEFT_ALT="0x7000000E2"
LEFT_GUI="0x7000000E3"
RIGHT_CTRL="0x7000000E4"
RIGHT_ALT="0x7000000E6"
RIGHT_GUI="0x7000000E7"
PC_MENU="0x700000065"

MEDIA_PLAY="0xC000000B0"
MEDIA_NEXT="0xC000000B5"
MEDIA_PREV="0xC000000B6"
MEDIA_EJECT="0xC000000B8"

# WASDv2 / CODE in Mac mode
hidutil property --matching '{"ProductID":0x269, "VendorID":0x4d9}' --set "{\"UserKeyMapping\":[
{$FROM: $CAPS_LOCK,    $TO: $ESCAPE},
{$FROM: $INSERT,       $TO: $MEDIA_PLAY},
{$FROM: $F13,          $TO: $MEDIA_EJECT},
{$FROM: $F14,          $TO: $MEDIA_PREV},
{$FROM: $F15,          $TO: $MEDIA_NEXT},
]}"
# Leopold FC660C
hidutil property --matching '{"ProductID":0x134, "VendorID":0x853}' --set "{\"UserKeyMapping\":[
{$FROM: $CAPS_LOCK,    $TO: $ESCAPE},
{$FROM: $LEFT_GUI,     $TO: $LEFT_ALT},
{$FROM: $LEFT_ALT,     $TO: $LEFT_GUI},
{$FROM: $RIGHT_ALT,    $TO: $RIGHT_GUI},
{$FROM: $RIGHT_CTRL,   $TO: $RIGHT_ALT},
{$FROM: $PC_MENU,      $TO: $RIGHT_CTRL},
{$FROM: $INSERT,       $TO: $MEDIA_PLAY},
{$FROM: $PRINT_SCREEN, $TO: $MEDIA_EJECT},
{$FROM: $SCROLL_LOCK,  $TO: $MEDIA_PREV},
{$FROM: $PAUSE,        $TO: $MEDIA_NEXT},
]}"

Mainly this maps the modifier keys to be more Mac-like, caps lock to escape (which means I can run the Leopold’s escape key permanently in ` / ~ mode (using Fn + Q), as well as some media keys. The links in the header-comment of the script contain lists of supported pages and usages; the page is the upper 32-bit word and the usage the lower 32-bit word.

If you want to run this on login, you can use launchd by storing a plist in ~/Library/LaunchAgents/de.maven.remap_keys.plist for example containing

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>de.maven.remap_keys</string>
    <key>ProgramArguments</key>
    <array><string>/Users/maven/bin/remap.sh</string></array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Happy hacking!