#pragma once #include #include // 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; }