2014-03-30 18:53:44 -05:00
|
|
|
// 30 march 2014
|
|
|
|
|
|
|
|
package ui
|
|
|
|
|
|
|
|
/*
|
|
|
|
Mac OS X uses its own set of hardware key codes that are different from PC keyboard scancodes, but are positional (like PC keyboard scancodes). These are defined in <HIToolbox/Events.h>, a Carbon header. As far as I can tell, there's no way to include this header without either using an absolute path or linking Carbon into the program, so the constant values are used here instead.
|
|
|
|
|
|
|
|
The Cocoa docs do guarantee that -[NSEvent keyCode] results in key codes that are the same as those returned by Carbon; that is, these codes.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// use uintptr to be safe
|
|
|
|
var keycodeKeys = map[uintptr]byte{
|
|
|
|
0x00: 'a',
|
|
|
|
0x01: 's',
|
|
|
|
0x02: 'd',
|
|
|
|
0x03: 'f',
|
|
|
|
0x04: 'h',
|
|
|
|
0x05: 'g',
|
|
|
|
0x06: 'z',
|
|
|
|
0x07: 'x',
|
|
|
|
0x08: 'c',
|
|
|
|
0x09: 'v',
|
|
|
|
0x0B: 'b',
|
|
|
|
0x0C: 'q',
|
|
|
|
0x0D: 'w',
|
|
|
|
0x0E: 'e',
|
|
|
|
0x0F: 'r',
|
|
|
|
0x10: 'y',
|
|
|
|
0x11: 't',
|
|
|
|
0x12: '1',
|
|
|
|
0x13: '2',
|
|
|
|
0x14: '3',
|
|
|
|
0x15: '4',
|
|
|
|
0x16: '6',
|
|
|
|
0x17: '5',
|
|
|
|
0x18: '=',
|
|
|
|
0x19: '9',
|
|
|
|
0x1A: '7',
|
|
|
|
0x1B: '-',
|
|
|
|
0x1C: '8',
|
|
|
|
0x1D: '0',
|
|
|
|
0x1E: ']',
|
|
|
|
0x1F: 'o',
|
|
|
|
0x20: 'u',
|
|
|
|
0x21: '[',
|
|
|
|
0x22: 'i',
|
|
|
|
0x23: 'p',
|
|
|
|
0x25: 'l',
|
|
|
|
0x26: 'j',
|
|
|
|
0x27: '\'',
|
|
|
|
0x28: 'k',
|
|
|
|
0x29: ';',
|
|
|
|
0x2A: '\\',
|
|
|
|
0x2B: ',',
|
|
|
|
0x2C: '/',
|
|
|
|
0x2D: 'n',
|
|
|
|
0x2E: 'm',
|
|
|
|
0x2F: '.',
|
|
|
|
0x32: '`',
|
|
|
|
0x24: '\n',
|
|
|
|
0x30: '\t',
|
|
|
|
0x31: ' ',
|
|
|
|
0x33: '\b',
|
|
|
|
}
|
|
|
|
|
|
|
|
var keycodeExtKeys = map[uintptr]ExtKey{
|
|
|
|
0x41: NDot,
|
|
|
|
0x43: NMultiply,
|
|
|
|
0x45: NAdd,
|
|
|
|
0x4B: NDivide,
|
|
|
|
0x4C: NEnter,
|
|
|
|
0x4E: NSubtract,
|
|
|
|
0x52: N0,
|
|
|
|
0x53: N1,
|
|
|
|
0x54: N2,
|
|
|
|
0x55: N3,
|
|
|
|
0x56: N4,
|
|
|
|
0x57: N5,
|
|
|
|
0x58: N6,
|
|
|
|
0x59: N7,
|
|
|
|
0x5B: N8,
|
|
|
|
0x5C: N9,
|
|
|
|
0x35: Escape,
|
|
|
|
0x60: F5,
|
|
|
|
0x61: F6,
|
|
|
|
0x62: F7,
|
|
|
|
0x63: F3,
|
|
|
|
0x64: F8,
|
|
|
|
0x65: F9,
|
|
|
|
0x67: F11,
|
|
|
|
0x6D: F10,
|
|
|
|
0x6F: F12,
|
|
|
|
// 0x72: kVK_Help,
|
|
|
|
0x73: Home,
|
|
|
|
0x74: PageUp,
|
|
|
|
0x75: Delete,
|
|
|
|
0x76: F4,
|
|
|
|
0x77: End,
|
|
|
|
0x78: F2,
|
|
|
|
0x79: PageDown,
|
|
|
|
0x7A: F1,
|
|
|
|
0x7B: Left,
|
|
|
|
0x7C: Right,
|
|
|
|
0x7D: Down,
|
|
|
|
0x7E: Up,
|
|
|
|
}
|
|
|
|
|
|
|
|
var keycodeModifiers = map[uintptr]Modifiers{
|
2014-05-16 18:52:28 -05:00
|
|
|
0x37: Super, // left command
|
2014-03-30 18:53:44 -05:00
|
|
|
0x38: Shift, // left shift
|
|
|
|
0x3A: Alt, // left option
|
2014-05-16 18:52:28 -05:00
|
|
|
0x3B: Ctrl, // left control
|
2014-03-30 18:53:44 -05:00
|
|
|
0x3C: Shift, // right shift
|
|
|
|
0x3D: Alt, // right alt
|
2014-05-16 18:52:28 -05:00
|
|
|
0x3E: Ctrl, // right control
|
2014-03-30 19:39:57 -05:00
|
|
|
|
|
|
|
// the following is not in Events.h for some reason
|
2014-03-30 21:20:23 -05:00
|
|
|
// thanks to Nicole and jedivulcan from irc.badnik.net
|
2014-05-16 18:52:28 -05:00
|
|
|
0x36: Super, // right command
|
2014-03-30 18:53:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func fromKeycode(keycode uintptr) (ke KeyEvent, ok bool) {
|
|
|
|
if key, ok := keycodeKeys[keycode]; ok {
|
|
|
|
ke.Key = key
|
|
|
|
return ke, true
|
|
|
|
}
|
|
|
|
if extkey, ok := keycodeExtKeys[keycode]; ok {
|
|
|
|
ke.ExtKey = extkey
|
|
|
|
return ke, true
|
|
|
|
}
|
|
|
|
return ke, false
|
|
|
|
}
|