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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
#pragma once
#include <al/types.h>
#include <al/lib.h>
// Expected behavior of modifiers:
// - Window keeps an internal state of currently held modifiers.
// - On window focus enter, if a modifier is held, send BUTTON_PRESSED event.
// - If a modifier was held on enter, it must still receive a BUTTON_RELEASED
// event when the key is released.
// - On window focus exit, send BUTTON_RELEASED for every held modifier.
enum {
STELA_MOD_NONE = 0,
STELA_MOD_LCONTROL = 1,
STELA_MOD_RCONTROL = 1 << 1,
STELA_MOD_LSHIFT = 1 << 2,
STELA_MOD_RSHIFT = 1 << 3,
STELA_MOD_LALT = 1 << 4,
STELA_MOD_RALT = 1 << 5
};
AL_IGNORE_WARNING("-Wunused-variable")
static u32 stl_all_modifiers[] = {
STELA_MOD_LCONTROL, STELA_MOD_RCONTROL,
STELA_MOD_LSHIFT, STELA_MOD_RSHIFT,
STELA_MOD_LALT, STELA_MOD_RALT,
STELA_MOD_NONE
};
AL_IGNORE_WARNING_END
// https://github.com/glfw/glfw/blob/e7ea71be039836da3a98cea55ae5569cb5eb885c/include/GLFW/glfw3.h#L395C1-L519C50
// See window_glfw.c:key_callback() for omitted keys.
#define STELA_KEY_NONE 0
/* Printable keys */
#define STELA_KEY_0 48
#define STELA_KEY_1 49
#define STELA_KEY_2 50
#define STELA_KEY_3 51
#define STELA_KEY_4 52
#define STELA_KEY_5 53
#define STELA_KEY_6 54
#define STELA_KEY_7 55
#define STELA_KEY_8 56
#define STELA_KEY_9 57
#define STELA_KEY_A 65
#define STELA_KEY_B 66
#define STELA_KEY_C 67
#define STELA_KEY_D 68
#define STELA_KEY_E 69
#define STELA_KEY_F 70
#define STELA_KEY_G 71
#define STELA_KEY_H 72
#define STELA_KEY_I 73
#define STELA_KEY_J 74
#define STELA_KEY_K 75
#define STELA_KEY_L 76
#define STELA_KEY_M 77
#define STELA_KEY_N 78
#define STELA_KEY_O 79
#define STELA_KEY_P 80
#define STELA_KEY_Q 81
#define STELA_KEY_R 82
#define STELA_KEY_S 83
#define STELA_KEY_T 84
#define STELA_KEY_U 85
#define STELA_KEY_V 86
#define STELA_KEY_W 87
#define STELA_KEY_X 88
#define STELA_KEY_Y 89
#define STELA_KEY_Z 90
#define STELA_KEY_SPACE 32
#define STELA_KEY_APOSTROPHE 39 /* ' */
#define STELA_KEY_COMMA 44 /* , */
#define STELA_KEY_PERIOD 46 /* . */
#define STELA_KEY_SLASH 47 /* / */
#define STELA_KEY_BACKSLASH 92 /* \ */
#define STELA_KEY_GRAVE_ACCENT 96 /* ` */
#define STELA_KEY_MINUS 45 /* - */
#define STELA_KEY_LEFT_BRACKET 91 /* [ */
#define STELA_KEY_RIGHT_BRACKET 93 /* ] */
#define STELA_KEY_SEMICOLON 59 /* ; */
#define STELA_KEY_EQUAL 61 /* = */
/* Function keys */
#define STELA_KEY_RETURN 257
#define STELA_KEY_BACKSPACE 259
#define STELA_KEY_TAB 258
#define STELA_KEY_ESCAPE 256
#define STELA_KEY_INSERT 260
#define STELA_KEY_DELETE 261
#define STELA_KEY_HOME 268
#define STELA_KEY_END 269
#define STELA_KEY_PAGE_UP 266
#define STELA_KEY_PAGE_DOWN 267
#define STELA_KEY_PRINT_SCREEN 283
#define STELA_KEY_PAUSE 284
#define STELA_KEY_CAPS_LOCK 280
#define STELA_KEY_SCROLL_LOCK 281
#define STELA_KEY_NUM_LOCK 282
#define STELA_KEY_LEFT 263
#define STELA_KEY_RIGHT 262
#define STELA_KEY_UP 265
#define STELA_KEY_DOWN 264
#define STELA_KEY_F1 290
#define STELA_KEY_F2 291
#define STELA_KEY_F3 292
#define STELA_KEY_F4 293
#define STELA_KEY_F5 294
#define STELA_KEY_F6 295
#define STELA_KEY_F7 296
#define STELA_KEY_F8 297
#define STELA_KEY_F9 298
#define STELA_KEY_F10 299
#define STELA_KEY_F11 300
#define STELA_KEY_F12 301
#define STELA_KEY_F13 302
#define STELA_KEY_F14 303
#define STELA_KEY_F15 304
#define STELA_KEY_F16 305
#define STELA_KEY_F17 306
#define STELA_KEY_F18 307
#define STELA_KEY_F19 308
#define STELA_KEY_F20 309
#define STELA_KEY_F21 310
#define STELA_KEY_F22 311
#define STELA_KEY_F23 312
#define STELA_KEY_F24 313
#define STELA_KEY_KP_0 320
#define STELA_KEY_KP_1 321
#define STELA_KEY_KP_2 322
#define STELA_KEY_KP_3 323
#define STELA_KEY_KP_4 324
#define STELA_KEY_KP_5 325
#define STELA_KEY_KP_6 326
#define STELA_KEY_KP_7 327
#define STELA_KEY_KP_8 328
#define STELA_KEY_KP_9 329
#define STELA_KEY_KP_ADD 334
#define STELA_KEY_KP_SUBTRACT 333
#define STELA_KEY_KP_MULTIPLY 332
#define STELA_KEY_KP_DIVIDE 331
#define STELA_KEY_KP_DECIMAL 330
#define STELA_KEY_KP_EQUAL 336
#define STELA_KEY_KP_RETURN 335
#define STELA_KEY_LEFT_CONTROL 341
#define STELA_KEY_LEFT_ALT 342
#define STELA_KEY_LEFT_SHIFT 340
#define STELA_KEY_RIGHT_CONTROL 345
#define STELA_KEY_RIGHT_ALT 346
#define STELA_KEY_RIGHT_SHIFT 344
#define STELA_KEY_LEFT_SUPER 343
#define STELA_KEY_RIGHT_SUPER 347
#define STELA_KEY_MENU 348
#define STELA_KEY_LAST STELA_KEY_MENU
static inline u16 stl_mod_to_key(u32 mod)
{
switch (mod) {
case STELA_MOD_LCONTROL: return STELA_KEY_LEFT_CONTROL;
case STELA_MOD_RCONTROL: return STELA_KEY_RIGHT_CONTROL;
case STELA_MOD_LSHIFT: return STELA_KEY_LEFT_SHIFT;
case STELA_MOD_RSHIFT: return STELA_KEY_RIGHT_SHIFT;
case STELA_MOD_LALT: return STELA_KEY_LEFT_ALT;
case STELA_MOD_RALT: return STELA_KEY_RIGHT_ALT;
}
al_assert_and_return(STELA_KEY_NONE);
}
static inline u32 stl_key_to_mod(u16 key)
{
switch (key) {
case STELA_KEY_LEFT_CONTROL: return STELA_MOD_LCONTROL;
case STELA_KEY_RIGHT_CONTROL: return STELA_MOD_RCONTROL;
case STELA_KEY_LEFT_SHIFT: return STELA_MOD_LSHIFT;
case STELA_KEY_RIGHT_SHIFT: return STELA_MOD_RSHIFT;
case STELA_KEY_LEFT_ALT: return STELA_MOD_LALT;
case STELA_KEY_RIGHT_ALT: return STELA_MOD_RALT;
}
return STELA_MOD_NONE;
}
|