summaryrefslogtreecommitdiff
path: root/src/keys.h
blob: 7e5dfcf15fab4265116b2a5fc80db06d87690210 (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
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;
}