void meta_app(ma_arena_t *arena) { sb8_t *h = sb8_serial_begin(arena); sb8_t *c = sb8_serial_begin(arena); ast_t *keys = parse_table(arena, __FILE__, CODE( // javascript filter out | name | js1 | js2 | jf | windows1 | windows2 | | null | XXX | XXX | 1 | XXX | XXX | | 1 | 1 | XXX | 0 | `'1'` | XXX | | 2 | 2 | XXX | 0 | `'2'` | XXX | | 3 | 3 | XXX | 0 | `'3'` | XXX | | 4 | 4 | XXX | 0 | `'4'` | XXX | | 5 | 5 | XXX | 0 | `'5'` | XXX | | 6 | 6 | XXX | 0 | `'6'` | XXX | | 7 | 7 | XXX | 0 | `'7'` | XXX | | 8 | 8 | XXX | 0 | `'8'` | XXX | | 9 | 9 | XXX | 0 | `'9'` | XXX | | 0 | 0 | XXX | 0 | `'0'` | XXX | | f1 | F1 | XXX | 1 | VK_F1 | XXX | | f2 | F2 | XXX | 1 | VK_F2 | XXX | | f3 | F3 | XXX | 1 | VK_F3 | XXX | | f4 | F4 | XXX | 1 | VK_F4 | XXX | | f5 | F5 | XXX | 1 | VK_F5 | XXX | | f6 | F6 | XXX | 1 | VK_F6 | XXX | | f7 | F7 | XXX | 1 | VK_F7 | XXX | | f8 | F8 | XXX | 1 | VK_F8 | XXX | | f9 | F9 | XXX | 1 | VK_F9 | XXX | | f10 | F10 | XXX | 1 | VK_F10 | XXX | | f11 | F11 | XXX | 1 | VK_F11 | XXX | | f12 | F12 | XXX | 1 | VK_F12 | XXX | | a | a | XXX | 0 | `'A'` | XXX | | b | b | XXX | 0 | `'B'` | XXX | | c | c | XXX | 0 | `'C'` | XXX | | d | d | XXX | 0 | `'D'` | XXX | | e | e | XXX | 0 | `'E'` | XXX | | f | f | XXX | 0 | `'F'` | XXX | | g | g | XXX | 0 | `'G'` | XXX | | h | h | XXX | 0 | `'H'` | XXX | | i | i | XXX | 0 | `'I'` | XXX | | j | j | XXX | 0 | `'J'` | XXX | | k | k | XXX | 0 | `'K'` | XXX | | l | l | XXX | 0 | `'L'` | XXX | | m | m | XXX | 0 | `'M'` | XXX | | n | n | XXX | 0 | `'N'` | XXX | | o | o | XXX | 0 | `'O'` | XXX | | p | p | XXX | 0 | `'P'` | XXX | | q | q | XXX | 0 | `'Q'` | XXX | | r | r | XXX | 0 | `'R'` | XXX | | s | s | XXX | 0 | `'S'` | XXX | | _t | t | XXX | 0 | `'T'` | XXX | | u | u | XXX | 0 | `'U'` | XXX | | v | v | XXX | 0 | `'V'` | XXX | | w | w | XXX | 0 | `'W'` | XXX | | x | x | XXX | 0 | `'X'` | XXX | | y | y | XXX | 0 | `'Y'` | XXX | | z | z | XXX | 0 | `'Z'` | XXX | | space | ` ` | XXX | 0 | VK_SPACE | XXX | | enter | Enter | XXX | 1 | VK_RETURN | XXX | | escape | Escape | XXX | 1 | VK_ESCAPE | XXX | | left | ArrowLeft | XXX | 1 | VK_LEFT | XXX | | up | ArrowUp | XXX | 1 | VK_UP | XXX | | right | ArrowRight | XXX | 1 | VK_RIGHT | XXX | | down | ArrowDown | XXX | 1 | VK_DOWN | XXX | | tab | Tab | XXX | 1 | VK_TAB | XXX | | backspace | Backspace | XXX | 1 | VK_BACK | XXX | | control | Control | XXX | 1 | VK_CONTROL | XXX | | shift | Shift | XXX | 1 | VK_SHIFT | XXX | | alt | Alt | AltGraph | 1 | VK_LMENU | VK_RMENU | | meta | Meta | XXX | 1 | VK_LWIN | VK_RWIN | | caps_lock | CapsLock | XXX | 1 | VK_CAPITAL | XXX | | delete | Delete | XXX | 1 | VK_DELETE | XXX | | home | Home | XXX | 1 | VK_HOME | XXX | | end | End | XXX | 1 | VK_END | XXX | | insert | Insert | XXX | 1 | VK_NEXT | XXX | | page_up | PageUp | XXX | 1 | VK_INSERT | XXX | | page_down | PageDown | XXX | 1 | VK_PRIOR | XXX | )); sb8_serial_table_enum(c, h, keys, s8_lit("app_key")); // Javascript { i32 name_idx = row_findi(keys->first, "name"); i32 js1_idx = row_findi(keys->first, "js1"); i32 js2_idx = row_findi(keys->first, "js2"); i32 filter_out_idx = row_findi(keys->first, "jf"); sb8_stmtf(c, "\n#if PLATFORM_WASM"); sb8_stmtf(c, "typedef struct { app_key_t key; b32 filter_out; } wasm_key_map_t;"); sb8_stmtf(c, "wasm_key_map_t wasm_map_key_string_to_app_key(s8_t key) {"); c->indent += 1; sb8_stmtf(c, "if (0) {}"); for (ast_t *row = keys->first->next; row; row = row->next) { s8_t name = row_geti(row, name_idx)->string; i64 filter_out = row_geti(row, filter_out_idx)->integer; assert(filter_out == 0 || filter_out == 1); s8_t js[] = {row_geti(row, js1_idx)->string, row_geti(row, js2_idx)->string}; for (i32 i = 0; i < lengthof(js); i += 1) { if (s8_equal(js[i], s8_lit("XXX"))) continue; sb8_stmtf(c, "else if (s8_equal_ex(key, s8_lit(\"%S\"), s8_ignore_case)) return (wasm_key_map_t){app_key_%S, %d};", js[i], name, (i32)filter_out); } } sb8_stmtf(c, "return (wasm_key_map_t){0};"); c->indent -= 1; sb8_stmtf(c, "}"); sb8_stmtf(c, "#endif"); } // Windows { i32 name_idx = row_findi(keys->first, "name"); i32 w1i = row_findi(keys->first, "windows1"); i32 w2i = row_findi(keys->first, "windows2"); sb8_stmtf(c, "\n#if PLATFORM_WINDOWS"); sb8_stmtf(c, "app_key_t w32_map_wparam_to_app_key(WPARAM wparam) {"); c->indent += 1; sb8_stmtf(c, "switch(wparam) {"); c->indent += 1; for (ast_t *row = keys->first->next; row; row = row->next) { s8_t name = row_geti(row, name_idx)->string; s8_t w[] = {row_geti(row, w1i)->string, row_geti(row, w2i)->string}; for (i32 i = 0; i < lengthof(w); i += 1) { if (s8_equal(w[i], s8_lit("XXX"))) continue; sb8_stmtf(c, "case %S: return app_key_%S; break;", w[i], name); } } sb8_stmtf(c, "default: {return app_key_null;} break;"); c->indent -= 1; sb8_stmtf(c, "}"); c->indent -= 1; sb8_stmtf(c, "}"); sb8_stmtf(c, "#endif"); } { ast_t *decls = parse_decls(arena, __FILE__, CODE( typedef enum { app_mouse_button_null, app_mouse_button_left, app_mouse_button_middle, app_mouse_button_right, app_mouse_button_count, } app_mouse_button_t; typedef enum { app_event_kind_null, app_event_kind_update, app_event_kind_text, app_event_kind_key_down, app_event_kind_key_up, app_event_kind_mouse_down, app_event_kind_mouse_up, app_event_kind_mouse_wheel, app_event_kind_mouse_move, app_event_kind_count, } app_event_kind_t; struct app_event_t { app_event_kind_t kind; app_mouse_button_t mouse_button; app_key_t key; s8_t text; b8 ctrl; b8 shift; b8 alt; b8 meta; f64 time; f64 delta_time; f64 dpr; v2f32_t window_size; v2f32_t mouse_pos; v3f32_t mouse_wheel_delta; }; )); sb8_serial_ast_to_code(h, decls); sb8_serial_ast_to_type_info(c, decls); } os_write_file(gen_c(arena), sb8_merge(c)); os_write_file(gen_h(arena), sb8_merge(h)); }