aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/darwin/areaevents.m
blob: d7ceaaadc5033658a69a79489eecbf553d7af4c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// 30 march 2014
#import "uipriv_darwin.h"

/*
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_t to be safe
static const struct {
	uintptr_t keycode;
	char equiv;
} keycodeKeys[] = {
	{ 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' },
	{ 0xFFFF, 0 },
};

static const struct {
	uintptr_t keycode;
	uiExtKey equiv;
} keycodeExtKeys[] = {
	{ 0x41, uiExtKeyNDot },
	{ 0x43, uiExtKeyNMultiply },
	{ 0x45, uiExtKeyNAdd },
	{ 0x4B, uiExtKeyNDivide },
	{ 0x4C, uiExtKeyNEnter },
	{ 0x4E, uiExtKeyNSubtract },
	{ 0x52, uiExtKeyN0 },
	{ 0x53, uiExtKeyN1 },
	{ 0x54, uiExtKeyN2 },
	{ 0x55, uiExtKeyN3 },
	{ 0x56, uiExtKeyN4 },
	{ 0x57, uiExtKeyN5 },
	{ 0x58, uiExtKeyN6 },
	{ 0x59, uiExtKeyN7 },
	{ 0x5B, uiExtKeyN8 },
	{ 0x5C, uiExtKeyN9 },
	{ 0x35, uiExtKeyEscape },
	{ 0x60, uiExtKeyF5 },
	{ 0x61, uiExtKeyF6 },
	{ 0x62, uiExtKeyF7 },
	{ 0x63, uiExtKeyF3 },
	{ 0x64, uiExtKeyF8 },
	{ 0x65, uiExtKeyF9 },
	{ 0x67, uiExtKeyF11 },
	{ 0x6D, uiExtKeyF10 },
	{ 0x6F, uiExtKeyF12 },
	{ 0x72, uiExtKeyInsert },		// listed as the Help key but it's in the same position on an Apple keyboard as the Insert key on a Windows keyboard; thanks to SeanieB from irc.badnik.net and Psy in irc.freenode.net/#macdev for confirming they have the same code
	{ 0x73, uiExtKeyHome },
	{ 0x74, uiExtKeyPageUp },
	{ 0x75, uiExtKeyDelete },
	{ 0x76, uiExtKeyF4 },
	{ 0x77, uiExtKeyEnd },
	{ 0x78, uiExtKeyF2 },
	{ 0x79, uiExtKeyPageDown },
	{ 0x7A, uiExtKeyF1 },
	{ 0x7B, uiExtKeyLeft },
	{ 0x7C, uiExtKeyRight },
	{ 0x7D, uiExtKeyDown },
	{ 0x7E, uiExtKeyUp },
	{ 0xFFFF, 0 },
};

static const struct {
	uintptr_t keycode;
	uiModifiers equiv;
} keycodeModifiers[] = {
	{ 0x37, uiModifierSuper },		// left command
	{ 0x38, uiModifierShift },		// left shift
	{ 0x3A, uiModifierAlt },		// left option
	{ 0x3B, uiModifierCtrl },		// left control
	{ 0x3C, uiModifierShift },		// right shift
	{ 0x3D, uiModifierAlt },		// right alt
	{ 0x3E, uiModifierCtrl },		// right control
	// the following is not in Events.h for some reason
	// thanks to Nicole and jedivulcan from irc.badnik.net
	{ 0x36, uiModifierSuper },		// right command
	{ 0xFFFF, 0 },
};

BOOL fromKeycode(unsigned short keycode, uiAreaKeyEvent *ke)
{
	int i;

	for (i = 0; keycodeKeys[i].keycode != 0xFFFF; i++)
		if (keycodeKeys[i].keycode == keycode) {
			ke->Key = keycodeKeys[i].equiv;
			return YES;
		}
	for (i = 0; keycodeExtKeys[i].keycode != 0xFFFF; i++)
		if (keycodeExtKeys[i].keycode == keycode) {
			ke->ExtKey = keycodeExtKeys[i].equiv;
			return YES;
		}
	return NO;
}

BOOL keycodeModifier(unsigned short keycode, uiModifiers *mod)
{
	int i;

	for (i = 0; keycodeModifiers[i].keycode != 0xFFFF; i++)
		if (keycodeModifiers[i].keycode == keycode) {
			*mod = keycodeModifiers[i].equiv;
			return YES;
		}
	return NO;
}