Files
wasm_transcript_browser/src/app/app.meta.c
Krzosa Karol 1710bc232d core changes
2025-01-06 21:33:00 +01:00

197 lines
9.5 KiB
C

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__, S8_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__, S8_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_t *next;
app_event_kind_t kind;
// data present only during events
app_mouse_button_t mouse_button; // @mouse_down @mouse_up
app_key_t key; // @key_down @key_up
s8_t text; // @text
// @todo: test why xyz in js????????????
v3f64_t mouse_wheel_delta; // @mouse_wheel
// always present data
b8 ctrl;
b8 shift;
b8 alt;
b8 meta;
f64 dpr;
v2f64_t window_size;
v2f64_t mouse_pos;
};
struct app_event_list_t {
app_event_t *first; @dont_serialize
app_event_t *last;
i32 len;
};
));
sb8_serial_ast_to_code(h, decls);
sb8_serial_ast_to_type_info(c, decls);
}
os_write_file(gen_c(arena), sb8_merge(arena, c));
os_write_file(gen_h(arena), sb8_merge(arena, h));
}