Skip to content

Instantly share code, notes, and snippets.

@lozturner
Created May 31, 2017 20:05
Show Gist options
  • Save lozturner/222a1d03b747d9dc90a18275cd397fc9 to your computer and use it in GitHub Desktop.
Save lozturner/222a1d03b747d9dc90a18275cd397fc9 to your computer and use it in GitHub Desktop.
Scripting Key Remapping
Keys can be remapped via the command-line tool hidutil. For example, use the hidutil command-line tool to remap the 'A' key to the 'B' key as shown in Listing 1. The map array consists of two key/value pairs that contain the source (HIDKeyboardModifierMappingSrc) and destination (HIDKeyboardModifierMappingDstKey) of the key remapping. The keys take a hexadecimal value that consists of 0x700000000 or’d with the desired keyboard usage value (see Table 1 for usage values).
Listing 1 Remapping keys in a script
$ hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000004,"HIDKeyboardModifierMappingDst":0x700000005},{"HIDKeyboardModifierMappingSrc":0x700000005,"HIDKeyboardModifierMappingDst":0x700000004}]}'
)
A script can check the key remapping state by using the hidutil command-line tool as shown in Listing 2. A null result indicates that there are no key remappings active.
Listing 2 Checking Key Remapping state
$ hidutil property --get "UserKeyMapping"
(null)
Back to Top
Programmatic Key Remapping
The IOKit HID APIs can be used for key remapping. The user will provide a dictionary of key remapping that the HID event system will apply to the keyboard.
Listing 3 : Key Remapping using IOKit HID APIs.
// compiled with Xcode 8.2.1
#import <Foundation/Foundation.h>
#import <IOKit/hidsystem/IOHIDEventSystemClient.h>
#import <IOKit/hidsystem/IOHIDServiceClient.h>
#import <IOKit/hid/IOHIDUsageTables.h>
int main(int argc, char *argv[])
{
IOHIDEventSystemClientRef system;
CFArrayRef services;
uint64_t aKey = 0x700000004;
uint64_t bKey = 0x700000005;
NSArray *map = @[
@{@kIOHIDKeyboardModifierMappingSrcKey:@(aKey),
@kIOHIDKeyboardModifierMappingDstKey:@(bKey)},
@{@kIOHIDKeyboardModifierMappingSrcKey:@(bKey),
@kIOHIDKeyboardModifierMappingDstKey:@(aKey)},
];
system = IOHIDEventSystemClientCreateSimpleClient(kCFAllocatorDefault);
services = IOHIDEventSystemClientCopyServices(system);
for(CFIndex i = 0; i < CFArrayGetCount(services); i++) {
IOHIDServiceClientRef service = (IOHIDServiceClientRef)CFArrayGetValueAtIndex(services, i);
if(IOHIDServiceClientConformsTo(service, kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard)) {
IOHIDServiceClientSetProperty(service, CFSTR(kIOHIDUserKeyUsageMapKey), (CFArrayRef)map);
}
}
CFRelease(services);
CFRelease(system);
return 0;
}
Back to Top
Key Table Usages
Table 1 presents a list of keyboard usages and their usage IDs for use in key remapping. This list is from the USB HID Usage Tables Specification, Section 10 Keyboard /Keypad Page.
Table 1 List of keyboard usages and their usage IDs.
Usage
Usage ID (hex)
Usage
Usage ID (hex)
Usage
Usage ID (hex)
Usage
Usage ID (hex)
Keyboard a and A
0x04
Keyboard 5 and %
0x22
Keyboard F7
0x40
Keypad 6 and Right Arrow
0x5E
Keyboard b and B
0x05
Keyboard 6 and ^
0x23
Keyboard F8
0x41
Keypad 7 and Home
0x5F
Keyboard c and C
0x06
Keyboard 7 and &
0x24
Keyboard F9
0x42
Keypad 8 and Up Arrow
0x60
Keyboard d and D
0x07
Keyboard 8 and *
0x25
Keyboard F10
0x43
Keypad 9 and Page Up
0x61
Keyboard e and E
0x08
Keyboard 9 and (
0x26
Keyboard F11
0x44
Keypad 0 and Insert
0x62
Keyboard f and F
0x09
Keyboard 0 and )
0x27
Keyboard F12
0x45
Keypad . and Delete
0x63
Keyboard g and G
0x0A
Keyboard Return (Enter)
0x28
Keyboard Print Screen
0x46
Keyboard Non-US \ and |
0x64
Keyboard h and H
0x0B
Keyboard Escape
0x29
Keyboard Scroll Lock
0x47
Keyboard Application
0x65
Keyboard i and I
0x0C
Keyboard Delete (Backspace)
0x2A
Keyboard Pause
0x48
Keyboard Power
0x66
Keyboard j and J
0x0D
Keyboard Tab
0x2B
Keyboard Insert
0x49
Keypad =
0x67
Keyboard k and K
0x0E
Keyboard Spacebar
0x2C
Keyboard Home
0x4A
Keyboard F13
0x68
Keyboard l and L
0x0F
Keyboard - and _
0x2D
Keyboard Page Up
0x4B
Keyboard F14
0x69
Keyboard m and M
0x10
Keyboard = and +
0x2E
Keyboard Delete Forward
0x4C
Keyboard F15
0x6A
Keyboard n and N
0x11
Keyboard [ and {
0x2F
Keyboard End
0x4D
Keyboard F16
0x6B
Keyboard o and O
0x12
Keyboard ] and }
0x30
Keyboard Page Down
0x4E
Keyboard F17
0x6C
Keyboard p and P
0x13
Keyboard \ and |
0x31
Keyboard Right Arrow
0x4F
Keyboard F18
0x6D
Keyboard q and Q
0x14
Keyboard Non-US # and ~
0x32
Keyboard Left Arrow
0x50
Keyboard F19
0x6E
Keyboard r and R
0x15
Keyboard ; and :
0x33
Keyboard Down Arrow
0x51
Keyboard F20
0x6F
Keyboard s and S
0x16
Keyboard ' and "
0x34
Keyboard Up Arrow
0x52
Keyboard F21
0x70
Keyboard t and T
0x17
Keyboard Grave Accent and Tilde
0x35
Keypad Num Lock and Clear
0x53
Keyboard F22
0x71
Keyboard u and U
0x18
Keyboard , and "<"
0x36
Keypad /
0x54
Keyboard F23
0x72
Keyboard v and V
0x19
Keyboard . and ">"
0x37
Keypad *
0x55
Keyboard F24
0x73
Keyboard w and W
0x1A
Keyboard / and ?
0x38
Keypad -
0x56
Keyboard Left Control
0xE0
Keyboard x and X
0x1B
Keyboard Caps Lock
0x39
Keypad +
0x57
Keyboard Left Shift
0xE1
Keyboard y and Y
0x1C
Keyboard F1
0x3A
Keypad Enter
0x58
Keyboard Left Alt
0xE2
Keyboard and Z
0x1D
Keyboard F2
0x3B
Keypad 1 and End
0x59
Keyboard Left GUI
0xE3
Keyboard 1 and !
0x1E
Keyboard F3
0x3C
Keypad 2 and Down Arrow
0x5A
Keyboard Right Control
0xE4
Keyboard 2 and @
0x1F
Keyboard F4
0x3D
Keypad 3 and Page Down
0x5B
Keyboard Right Shift
0xE5
Keyboard 3 and #
0x20
Keyboard F5
0x3E
Keypad 4 and Left Arrow
0x5C
Keyboard Right Alt
0xE6
Keyboard 4 and $
0x21
Keyboard F6
0x3F
Keypad 5
0x5D
Keyboard Right GUI
0xE7
Back to Top
Document Revision History
Date Notes
2017-03-21
New document that new document which describes how to remap keys in macOS 10.12 Sierra.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment