reinit repo after broken git
This commit is contained in:
2
src/app/app.c
Normal file
2
src/app/app.c
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "app.gen.c"
|
||||
#include "app_wasm.c"
|
||||
274
src/app/app.gen.c
Normal file
274
src/app/app.gen.c
Normal file
@@ -0,0 +1,274 @@
|
||||
|
||||
type_t type__app_key_t = { type_kind_enum, s8_const_lit("app_key_t"), sizeof(app_key_t),
|
||||
.members = (type_member_t[]){
|
||||
{.name = s8_const_lit("app_key_invalid"), .value = app_key_invalid},
|
||||
{.name = s8_const_lit("app_key_1"), .value = app_key_1},
|
||||
{.name = s8_const_lit("app_key_2"), .value = app_key_2},
|
||||
{.name = s8_const_lit("app_key_3"), .value = app_key_3},
|
||||
{.name = s8_const_lit("app_key_4"), .value = app_key_4},
|
||||
{.name = s8_const_lit("app_key_5"), .value = app_key_5},
|
||||
{.name = s8_const_lit("app_key_6"), .value = app_key_6},
|
||||
{.name = s8_const_lit("app_key_7"), .value = app_key_7},
|
||||
{.name = s8_const_lit("app_key_8"), .value = app_key_8},
|
||||
{.name = s8_const_lit("app_key_9"), .value = app_key_9},
|
||||
{.name = s8_const_lit("app_key_0"), .value = app_key_0},
|
||||
{.name = s8_const_lit("app_key_f1"), .value = app_key_f1},
|
||||
{.name = s8_const_lit("app_key_f2"), .value = app_key_f2},
|
||||
{.name = s8_const_lit("app_key_f3"), .value = app_key_f3},
|
||||
{.name = s8_const_lit("app_key_f4"), .value = app_key_f4},
|
||||
{.name = s8_const_lit("app_key_f5"), .value = app_key_f5},
|
||||
{.name = s8_const_lit("app_key_f6"), .value = app_key_f6},
|
||||
{.name = s8_const_lit("app_key_f7"), .value = app_key_f7},
|
||||
{.name = s8_const_lit("app_key_f8"), .value = app_key_f8},
|
||||
{.name = s8_const_lit("app_key_f9"), .value = app_key_f9},
|
||||
{.name = s8_const_lit("app_key_f10"), .value = app_key_f10},
|
||||
{.name = s8_const_lit("app_key_f11"), .value = app_key_f11},
|
||||
{.name = s8_const_lit("app_key_f12"), .value = app_key_f12},
|
||||
{.name = s8_const_lit("app_key_a"), .value = app_key_a},
|
||||
{.name = s8_const_lit("app_key_b"), .value = app_key_b},
|
||||
{.name = s8_const_lit("app_key_c"), .value = app_key_c},
|
||||
{.name = s8_const_lit("app_key_d"), .value = app_key_d},
|
||||
{.name = s8_const_lit("app_key_e"), .value = app_key_e},
|
||||
{.name = s8_const_lit("app_key_f"), .value = app_key_f},
|
||||
{.name = s8_const_lit("app_key_g"), .value = app_key_g},
|
||||
{.name = s8_const_lit("app_key_h"), .value = app_key_h},
|
||||
{.name = s8_const_lit("app_key_i"), .value = app_key_i},
|
||||
{.name = s8_const_lit("app_key_j"), .value = app_key_j},
|
||||
{.name = s8_const_lit("app_key_k"), .value = app_key_k},
|
||||
{.name = s8_const_lit("app_key_l"), .value = app_key_l},
|
||||
{.name = s8_const_lit("app_key_m"), .value = app_key_m},
|
||||
{.name = s8_const_lit("app_key_n"), .value = app_key_n},
|
||||
{.name = s8_const_lit("app_key_o"), .value = app_key_o},
|
||||
{.name = s8_const_lit("app_key_p"), .value = app_key_p},
|
||||
{.name = s8_const_lit("app_key_q"), .value = app_key_q},
|
||||
{.name = s8_const_lit("app_key_r"), .value = app_key_r},
|
||||
{.name = s8_const_lit("app_key_s"), .value = app_key_s},
|
||||
{.name = s8_const_lit("app_key__t"), .value = app_key__t},
|
||||
{.name = s8_const_lit("app_key_u"), .value = app_key_u},
|
||||
{.name = s8_const_lit("app_key_v"), .value = app_key_v},
|
||||
{.name = s8_const_lit("app_key_w"), .value = app_key_w},
|
||||
{.name = s8_const_lit("app_key_x"), .value = app_key_x},
|
||||
{.name = s8_const_lit("app_key_y"), .value = app_key_y},
|
||||
{.name = s8_const_lit("app_key_z"), .value = app_key_z},
|
||||
{.name = s8_const_lit("app_key_space"), .value = app_key_space},
|
||||
{.name = s8_const_lit("app_key_enter"), .value = app_key_enter},
|
||||
{.name = s8_const_lit("app_key_escape"), .value = app_key_escape},
|
||||
{.name = s8_const_lit("app_key_left"), .value = app_key_left},
|
||||
{.name = s8_const_lit("app_key_up"), .value = app_key_up},
|
||||
{.name = s8_const_lit("app_key_right"), .value = app_key_right},
|
||||
{.name = s8_const_lit("app_key_down"), .value = app_key_down},
|
||||
{.name = s8_const_lit("app_key_tab"), .value = app_key_tab},
|
||||
{.name = s8_const_lit("app_key_backspace"), .value = app_key_backspace},
|
||||
{.name = s8_const_lit("app_key_control"), .value = app_key_control},
|
||||
{.name = s8_const_lit("app_key_shift"), .value = app_key_shift},
|
||||
{.name = s8_const_lit("app_key_alt"), .value = app_key_alt},
|
||||
{.name = s8_const_lit("app_key_meta"), .value = app_key_meta},
|
||||
{.name = s8_const_lit("app_key_caps_lock"), .value = app_key_caps_lock},
|
||||
{.name = s8_const_lit("app_key_delete"), .value = app_key_delete},
|
||||
{.name = s8_const_lit("app_key_home"), .value = app_key_home},
|
||||
{.name = s8_const_lit("app_key_end"), .value = app_key_end},
|
||||
{.name = s8_const_lit("app_key_insert"), .value = app_key_insert},
|
||||
{.name = s8_const_lit("app_key_page_up"), .value = app_key_page_up},
|
||||
{.name = s8_const_lit("app_key_page_down"), .value = app_key_page_down},
|
||||
},
|
||||
.count = 69,
|
||||
};
|
||||
|
||||
#if PLATFORM_WASM
|
||||
typedef struct { app_key_t key; b32 filter_out; } wasm_key_map_t;
|
||||
wasm_key_map_t wasm_map_key_string_to_app_key(s8_t key) {
|
||||
if (0) {}
|
||||
else if (s8_equal_ex(key, s8_lit("1"), s8_ignore_case)) return (wasm_key_map_t){app_key_1, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("2"), s8_ignore_case)) return (wasm_key_map_t){app_key_2, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("3"), s8_ignore_case)) return (wasm_key_map_t){app_key_3, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("4"), s8_ignore_case)) return (wasm_key_map_t){app_key_4, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("5"), s8_ignore_case)) return (wasm_key_map_t){app_key_5, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("6"), s8_ignore_case)) return (wasm_key_map_t){app_key_6, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("7"), s8_ignore_case)) return (wasm_key_map_t){app_key_7, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("8"), s8_ignore_case)) return (wasm_key_map_t){app_key_8, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("9"), s8_ignore_case)) return (wasm_key_map_t){app_key_9, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("0"), s8_ignore_case)) return (wasm_key_map_t){app_key_0, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("F1"), s8_ignore_case)) return (wasm_key_map_t){app_key_f1, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F2"), s8_ignore_case)) return (wasm_key_map_t){app_key_f2, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F3"), s8_ignore_case)) return (wasm_key_map_t){app_key_f3, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F4"), s8_ignore_case)) return (wasm_key_map_t){app_key_f4, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F5"), s8_ignore_case)) return (wasm_key_map_t){app_key_f5, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F6"), s8_ignore_case)) return (wasm_key_map_t){app_key_f6, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F7"), s8_ignore_case)) return (wasm_key_map_t){app_key_f7, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F8"), s8_ignore_case)) return (wasm_key_map_t){app_key_f8, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F9"), s8_ignore_case)) return (wasm_key_map_t){app_key_f9, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F10"), s8_ignore_case)) return (wasm_key_map_t){app_key_f10, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F11"), s8_ignore_case)) return (wasm_key_map_t){app_key_f11, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("F12"), s8_ignore_case)) return (wasm_key_map_t){app_key_f12, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("a"), s8_ignore_case)) return (wasm_key_map_t){app_key_a, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("b"), s8_ignore_case)) return (wasm_key_map_t){app_key_b, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("c"), s8_ignore_case)) return (wasm_key_map_t){app_key_c, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("d"), s8_ignore_case)) return (wasm_key_map_t){app_key_d, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("e"), s8_ignore_case)) return (wasm_key_map_t){app_key_e, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("f"), s8_ignore_case)) return (wasm_key_map_t){app_key_f, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("g"), s8_ignore_case)) return (wasm_key_map_t){app_key_g, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("h"), s8_ignore_case)) return (wasm_key_map_t){app_key_h, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("i"), s8_ignore_case)) return (wasm_key_map_t){app_key_i, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("j"), s8_ignore_case)) return (wasm_key_map_t){app_key_j, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("k"), s8_ignore_case)) return (wasm_key_map_t){app_key_k, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("l"), s8_ignore_case)) return (wasm_key_map_t){app_key_l, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("m"), s8_ignore_case)) return (wasm_key_map_t){app_key_m, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("n"), s8_ignore_case)) return (wasm_key_map_t){app_key_n, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("o"), s8_ignore_case)) return (wasm_key_map_t){app_key_o, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("p"), s8_ignore_case)) return (wasm_key_map_t){app_key_p, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("q"), s8_ignore_case)) return (wasm_key_map_t){app_key_q, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("r"), s8_ignore_case)) return (wasm_key_map_t){app_key_r, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("s"), s8_ignore_case)) return (wasm_key_map_t){app_key_s, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("t"), s8_ignore_case)) return (wasm_key_map_t){app_key__t, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("u"), s8_ignore_case)) return (wasm_key_map_t){app_key_u, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("v"), s8_ignore_case)) return (wasm_key_map_t){app_key_v, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("w"), s8_ignore_case)) return (wasm_key_map_t){app_key_w, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("x"), s8_ignore_case)) return (wasm_key_map_t){app_key_x, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("y"), s8_ignore_case)) return (wasm_key_map_t){app_key_y, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("z"), s8_ignore_case)) return (wasm_key_map_t){app_key_z, 0};
|
||||
else if (s8_equal_ex(key, s8_lit(" "), s8_ignore_case)) return (wasm_key_map_t){app_key_space, 0};
|
||||
else if (s8_equal_ex(key, s8_lit("Enter"), s8_ignore_case)) return (wasm_key_map_t){app_key_enter, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Escape"), s8_ignore_case)) return (wasm_key_map_t){app_key_escape, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("ArrowLeft"), s8_ignore_case)) return (wasm_key_map_t){app_key_left, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("ArrowUp"), s8_ignore_case)) return (wasm_key_map_t){app_key_up, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("ArrowRight"), s8_ignore_case)) return (wasm_key_map_t){app_key_right, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("ArrowDown"), s8_ignore_case)) return (wasm_key_map_t){app_key_down, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Tab"), s8_ignore_case)) return (wasm_key_map_t){app_key_tab, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Backspace"), s8_ignore_case)) return (wasm_key_map_t){app_key_backspace, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Control"), s8_ignore_case)) return (wasm_key_map_t){app_key_control, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Shift"), s8_ignore_case)) return (wasm_key_map_t){app_key_shift, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Alt"), s8_ignore_case)) return (wasm_key_map_t){app_key_alt, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("AltGraph"), s8_ignore_case)) return (wasm_key_map_t){app_key_alt, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Meta"), s8_ignore_case)) return (wasm_key_map_t){app_key_meta, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("CapsLock"), s8_ignore_case)) return (wasm_key_map_t){app_key_caps_lock, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Delete"), s8_ignore_case)) return (wasm_key_map_t){app_key_delete, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Home"), s8_ignore_case)) return (wasm_key_map_t){app_key_home, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("End"), s8_ignore_case)) return (wasm_key_map_t){app_key_end, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("Insert"), s8_ignore_case)) return (wasm_key_map_t){app_key_insert, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("PageUp"), s8_ignore_case)) return (wasm_key_map_t){app_key_page_up, 1};
|
||||
else if (s8_equal_ex(key, s8_lit("PageDown"), s8_ignore_case)) return (wasm_key_map_t){app_key_page_down, 1};
|
||||
return (wasm_key_map_t){0};
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PLATFORM_WINDOWS
|
||||
void w32_key_dispatch(WPARAM wparam, void (*handle_key)(app_key_t)) {
|
||||
switch(wparam) {
|
||||
case '1': handle_key(app_key_1); break;
|
||||
case '2': handle_key(app_key_2); break;
|
||||
case '3': handle_key(app_key_3); break;
|
||||
case '4': handle_key(app_key_4); break;
|
||||
case '5': handle_key(app_key_5); break;
|
||||
case '6': handle_key(app_key_6); break;
|
||||
case '7': handle_key(app_key_7); break;
|
||||
case '8': handle_key(app_key_8); break;
|
||||
case '9': handle_key(app_key_9); break;
|
||||
case '0': handle_key(app_key_0); break;
|
||||
case VK_F1: handle_key(app_key_f1); break;
|
||||
case VK_F2: handle_key(app_key_f2); break;
|
||||
case VK_F3: handle_key(app_key_f3); break;
|
||||
case VK_F4: handle_key(app_key_f4); break;
|
||||
case VK_F5: handle_key(app_key_f5); break;
|
||||
case VK_F6: handle_key(app_key_f6); break;
|
||||
case VK_F7: handle_key(app_key_f7); break;
|
||||
case VK_F8: handle_key(app_key_f8); break;
|
||||
case VK_F9: handle_key(app_key_f9); break;
|
||||
case VK_F10: handle_key(app_key_f10); break;
|
||||
case VK_F11: handle_key(app_key_f11); break;
|
||||
case VK_F12: handle_key(app_key_f12); break;
|
||||
case 'A': handle_key(app_key_a); break;
|
||||
case 'B': handle_key(app_key_b); break;
|
||||
case 'C': handle_key(app_key_c); break;
|
||||
case 'D': handle_key(app_key_d); break;
|
||||
case 'E': handle_key(app_key_e); break;
|
||||
case 'F': handle_key(app_key_f); break;
|
||||
case 'G': handle_key(app_key_g); break;
|
||||
case 'H': handle_key(app_key_h); break;
|
||||
case 'I': handle_key(app_key_i); break;
|
||||
case 'J': handle_key(app_key_j); break;
|
||||
case 'K': handle_key(app_key_k); break;
|
||||
case 'L': handle_key(app_key_l); break;
|
||||
case 'M': handle_key(app_key_m); break;
|
||||
case 'N': handle_key(app_key_n); break;
|
||||
case 'O': handle_key(app_key_o); break;
|
||||
case 'P': handle_key(app_key_p); break;
|
||||
case 'Q': handle_key(app_key_q); break;
|
||||
case 'R': handle_key(app_key_r); break;
|
||||
case 'S': handle_key(app_key_s); break;
|
||||
case 'T': handle_key(app_key__t); break;
|
||||
case 'U': handle_key(app_key_u); break;
|
||||
case 'V': handle_key(app_key_v); break;
|
||||
case 'W': handle_key(app_key_w); break;
|
||||
case 'X': handle_key(app_key_x); break;
|
||||
case 'Y': handle_key(app_key_y); break;
|
||||
case 'Z': handle_key(app_key_z); break;
|
||||
case VK_SPACE: handle_key(app_key_space); break;
|
||||
case VK_RETURN: handle_key(app_key_enter); break;
|
||||
case VK_ESCAPE: handle_key(app_key_escape); break;
|
||||
case VK_LEFT: handle_key(app_key_left); break;
|
||||
case VK_UP: handle_key(app_key_up); break;
|
||||
case VK_RIGHT: handle_key(app_key_right); break;
|
||||
case VK_DOWN: handle_key(app_key_down); break;
|
||||
case VK_TAB: handle_key(app_key_tab); break;
|
||||
case VK_BACK: handle_key(app_key_backspace); break;
|
||||
case VK_CONTROL: handle_key(app_key_control); break;
|
||||
case VK_SHIFT: handle_key(app_key_shift); break;
|
||||
case VK_LMENU: handle_key(app_key_alt); break;
|
||||
case VK_RMENU: handle_key(app_key_alt); break;
|
||||
case VK_LWIN: handle_key(app_key_meta); break;
|
||||
case VK_RWIN: handle_key(app_key_meta); break;
|
||||
case VK_CAPITAL: handle_key(app_key_caps_lock); break;
|
||||
case VK_DELETE: handle_key(app_key_delete); break;
|
||||
case VK_HOME: handle_key(app_key_home); break;
|
||||
case VK_END: handle_key(app_key_end); break;
|
||||
case VK_NEXT: handle_key(app_key_insert); break;
|
||||
case VK_INSERT: handle_key(app_key_page_up); break;
|
||||
case VK_PRIOR: handle_key(app_key_page_down); break;
|
||||
default: {} break;
|
||||
}
|
||||
}
|
||||
#endif/*D:\dev\wasm\src/app/app.meta.c*/
|
||||
type_t type__app_mouse_button_t = { type_kind_enum, s8_const_lit("app_mouse_button_t"), sizeof(app_mouse_button_t),
|
||||
.members = (type_member_t[]){
|
||||
{.name = s8_const_lit("app_mouse_button_null"), .value = app_mouse_button_null},
|
||||
{.name = s8_const_lit("app_mouse_button_left"), .value = app_mouse_button_left},
|
||||
{.name = s8_const_lit("app_mouse_button_middle"), .value = app_mouse_button_middle},
|
||||
{.name = s8_const_lit("app_mouse_button_right"), .value = app_mouse_button_right},
|
||||
{.name = s8_const_lit("app_mouse_button_count"), .value = app_mouse_button_count},
|
||||
},
|
||||
.count = 5,
|
||||
};
|
||||
type_t type__app_event_kind_t = { type_kind_enum, s8_const_lit("app_event_kind_t"), sizeof(app_event_kind_t),
|
||||
.members = (type_member_t[]){
|
||||
{.name = s8_const_lit("app_event_kind_invalid"), .value = app_event_kind_invalid},
|
||||
{.name = s8_const_lit("app_event_kind_update"), .value = app_event_kind_update},
|
||||
{.name = s8_const_lit("app_event_kind_text"), .value = app_event_kind_text},
|
||||
{.name = s8_const_lit("app_event_kind_key_down"), .value = app_event_kind_key_down},
|
||||
{.name = s8_const_lit("app_event_kind_key_up"), .value = app_event_kind_key_up},
|
||||
{.name = s8_const_lit("app_event_kind_mouse_down"), .value = app_event_kind_mouse_down},
|
||||
{.name = s8_const_lit("app_event_kind_mouse_up"), .value = app_event_kind_mouse_up},
|
||||
{.name = s8_const_lit("app_event_kind_mouse_wheel"), .value = app_event_kind_mouse_wheel},
|
||||
{.name = s8_const_lit("app_event_kind_mouse_move"), .value = app_event_kind_mouse_move},
|
||||
{.name = s8_const_lit("app_event_kind_count"), .value = app_event_kind_count},
|
||||
},
|
||||
.count = 10,
|
||||
};
|
||||
type_t type__app_event_t = { type_kind_struct, s8_const_lit("app_event_t"), sizeof(app_event_t),
|
||||
.members = (type_member_t[]){
|
||||
{.name = s8_const_lit("kind"), .type = &type__app_event_kind_t, .offset = offsetof(app_event_t, kind)},
|
||||
{.name = s8_const_lit("mouse_button"), .type = &type__app_mouse_button_t, .offset = offsetof(app_event_t, mouse_button)},
|
||||
{.name = s8_const_lit("key"), .type = &type__app_key_t, .offset = offsetof(app_event_t, key)},
|
||||
{.name = s8_const_lit("text"), .type = &type__s8_t, .offset = offsetof(app_event_t, text)},
|
||||
{.name = s8_const_lit("ctrl"), .type = &type__b8, .offset = offsetof(app_event_t, ctrl)},
|
||||
{.name = s8_const_lit("shift"), .type = &type__b8, .offset = offsetof(app_event_t, shift)},
|
||||
{.name = s8_const_lit("alt"), .type = &type__b8, .offset = offsetof(app_event_t, alt)},
|
||||
{.name = s8_const_lit("meta"), .type = &type__b8, .offset = offsetof(app_event_t, meta)},
|
||||
{.name = s8_const_lit("time"), .type = &type__f64, .offset = offsetof(app_event_t, time)},
|
||||
{.name = s8_const_lit("delta_time"), .type = &type__f64, .offset = offsetof(app_event_t, delta_time)},
|
||||
{.name = s8_const_lit("dpr"), .type = &type__f64, .offset = offsetof(app_event_t, dpr)},
|
||||
{.name = s8_const_lit("window_size"), .type = &type__v2f32_t, .offset = offsetof(app_event_t, window_size)},
|
||||
{.name = s8_const_lit("mouse_pos"), .type = &type__v2f32_t, .offset = offsetof(app_event_t, mouse_pos)},
|
||||
{.name = s8_const_lit("mouse_wheel_delta"), .type = &type__v3f32_t, .offset = offsetof(app_event_t, mouse_wheel_delta)},
|
||||
},
|
||||
.count = 14,
|
||||
};
|
||||
110
src/app/app.gen.h
Normal file
110
src/app/app.gen.h
Normal file
@@ -0,0 +1,110 @@
|
||||
typedef enum {
|
||||
app_key_invalid,
|
||||
app_key_1,
|
||||
app_key_2,
|
||||
app_key_3,
|
||||
app_key_4,
|
||||
app_key_5,
|
||||
app_key_6,
|
||||
app_key_7,
|
||||
app_key_8,
|
||||
app_key_9,
|
||||
app_key_0,
|
||||
app_key_f1,
|
||||
app_key_f2,
|
||||
app_key_f3,
|
||||
app_key_f4,
|
||||
app_key_f5,
|
||||
app_key_f6,
|
||||
app_key_f7,
|
||||
app_key_f8,
|
||||
app_key_f9,
|
||||
app_key_f10,
|
||||
app_key_f11,
|
||||
app_key_f12,
|
||||
app_key_a,
|
||||
app_key_b,
|
||||
app_key_c,
|
||||
app_key_d,
|
||||
app_key_e,
|
||||
app_key_f,
|
||||
app_key_g,
|
||||
app_key_h,
|
||||
app_key_i,
|
||||
app_key_j,
|
||||
app_key_k,
|
||||
app_key_l,
|
||||
app_key_m,
|
||||
app_key_n,
|
||||
app_key_o,
|
||||
app_key_p,
|
||||
app_key_q,
|
||||
app_key_r,
|
||||
app_key_s,
|
||||
app_key__t,
|
||||
app_key_u,
|
||||
app_key_v,
|
||||
app_key_w,
|
||||
app_key_x,
|
||||
app_key_y,
|
||||
app_key_z,
|
||||
app_key_space,
|
||||
app_key_enter,
|
||||
app_key_escape,
|
||||
app_key_left,
|
||||
app_key_up,
|
||||
app_key_right,
|
||||
app_key_down,
|
||||
app_key_tab,
|
||||
app_key_backspace,
|
||||
app_key_control,
|
||||
app_key_shift,
|
||||
app_key_alt,
|
||||
app_key_meta,
|
||||
app_key_caps_lock,
|
||||
app_key_delete,
|
||||
app_key_home,
|
||||
app_key_end,
|
||||
app_key_insert,
|
||||
app_key_page_up,
|
||||
app_key_page_down,
|
||||
app_key_count,
|
||||
} app_key_t;
|
||||
/*D:\dev\wasm\src/app/app.meta.c*/
|
||||
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_invalid,
|
||||
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;
|
||||
|
||||
typedef struct app_event_t app_event_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;
|
||||
};
|
||||
3
src/app/app.h
Normal file
3
src/app/app.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#include "app.gen.h"
|
||||
|
||||
|
||||
189
src/app/app.meta.c
Normal file
189
src/app/app.meta.c
Normal file
@@ -0,0 +1,189 @@
|
||||
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 |
|
||||
| invalid | 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
|
||||
{
|
||||
int name_idx = row_findi(keys->first, "name");
|
||||
int js1_idx = row_findi(keys->first, "js1");
|
||||
int js2_idx = row_findi(keys->first, "js2");
|
||||
int 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, (int)filter_out);
|
||||
}
|
||||
}
|
||||
sb8_stmtf(c, "return (wasm_key_map_t){0};");
|
||||
c->indent -= 1;
|
||||
sb8_stmtf(c, "}");
|
||||
sb8_stmtf(c, "#endif");
|
||||
}
|
||||
|
||||
// Windows
|
||||
{
|
||||
int name_idx = row_findi(keys->first, "name");
|
||||
int w1i = row_findi(keys->first, "windows1");
|
||||
int w2i = row_findi(keys->first, "windows2");
|
||||
|
||||
sb8_stmtf(c, "\n#if PLATFORM_WINDOWS");
|
||||
sb8_stmtf(c, "void w32_key_dispatch(WPARAM wparam, void (*handle_key)(app_key_t)) {");
|
||||
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: handle_key(app_key_%.*s); break;", s8_fmtspec(w[i]), s8_fmtspec(name));
|
||||
}
|
||||
}
|
||||
sb8_stmtf(c, "default: {} 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_invalid,
|
||||
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));
|
||||
}
|
||||
212
src/app/app_wasm.c
Normal file
212
src/app/app_wasm.c
Normal file
@@ -0,0 +1,212 @@
|
||||
#define WASM_EXPORT __attribute__((visibility("default")))
|
||||
|
||||
f64 wasm_parse_float(isize str, i32 len);
|
||||
void wasm_write_to_console(isize str, i32 len);
|
||||
void wasm_draw_text(isize str, i32 len, f64 x, f64 y, isize font_str, i32 font_len, i32 font_size, f32 r, f32 g, f32 b, f32 a);
|
||||
void wasm_draw_rect(f64 x, f64 y, f64 w, f64 h, f32 r, f32 g, f32 b, f32 a);
|
||||
f64 wasm_measure_text(isize str, i32 len, isize font_str, i32 font_len, i32 font_size);
|
||||
f64 wasm_get_font_height(isize font_str, i32 font_len, i32 font_size);
|
||||
void wasm_set_clip(f64 x, f64 y, f64 w, f64 h);
|
||||
|
||||
void on_update();
|
||||
void app_update(app_event_t *events);
|
||||
|
||||
extern char __heap_base;
|
||||
ma_arena_t wasm_perm_arena;
|
||||
|
||||
WASM_EXPORT char wasm_temp_buff1[128] = {[127] = 0x13};
|
||||
WASM_EXPORT i32 wasm_temp_buff1_len = 127;
|
||||
WASM_EXPORT char wasm_temp_buff2[128] = {[127] = 0x13};
|
||||
WASM_EXPORT i32 wasm_temp_buff2_len = 127;
|
||||
|
||||
|
||||
char *font_face = "fira";
|
||||
i32 font_face_len = 4;
|
||||
|
||||
f64 wasm_dpr;
|
||||
ma_arena_t *wasm_input_text_arena;
|
||||
STACK(app_event_t, 64) wasm_events;
|
||||
b32 wasm_event_failed_to_queue;
|
||||
f64 wasm_last_time = 0;
|
||||
|
||||
void write_to_console(char *string) {
|
||||
int len = str_len(string);
|
||||
wasm_write_to_console((isize)string, len);
|
||||
}
|
||||
|
||||
f64 s8_deserial_f64(s8_t string) {
|
||||
return wasm_parse_float((isize)string.str, (i32)string.len);
|
||||
}
|
||||
|
||||
void clip(r2f64_t rect) {
|
||||
wasm_set_clip(wasm_dpr * rect.min.x, wasm_dpr * rect.min.y, wasm_dpr * (rect.max.x - rect.min.x), wasm_dpr * (rect.max.y - rect.min.y));
|
||||
}
|
||||
|
||||
|
||||
f64 get_font_height(void) {
|
||||
return wasm_get_font_height((isize) font_face, font_face_len, 20*wasm_dpr) / wasm_dpr;
|
||||
}
|
||||
|
||||
f64 measure_text_ex(char *str, int len) {
|
||||
return wasm_measure_text((isize)str, len, (isize) font_face, font_face_len, 20*wasm_dpr) / wasm_dpr;
|
||||
}
|
||||
|
||||
f64 measure_text(char *str) {
|
||||
return measure_text_ex(str, str_len(str));
|
||||
}
|
||||
|
||||
void draw_text(v2f64_t pos, v4f32_t color, char *str, int len) {
|
||||
wasm_draw_text((isize)str, len, wasm_dpr * pos.x, wasm_dpr * pos.y, (isize) font_face, font_face_len, 20*wasm_dpr, color.r * 255.f, color.g * 255.f, color.b * 255.f, color.a);
|
||||
}
|
||||
|
||||
void draw_textf(v2f64_t pos, char *str, ...) {
|
||||
char buff[1024];
|
||||
va_list args;
|
||||
va_start(args, str);
|
||||
int len = stbsp_vsnprintf(buff, sizeof(buff), str, args);
|
||||
va_end(args);
|
||||
|
||||
wasm_draw_text((isize)buff, len, wasm_dpr * pos.x, wasm_dpr * pos.y, (isize) font_face, font_face_len, 20*wasm_dpr, 0, 0, 0, 1);
|
||||
}
|
||||
|
||||
void draw_rect(r2f64_t rect, v4f32_t color) {
|
||||
wasm_draw_rect(wasm_dpr * rect.min.x, wasm_dpr * rect.min.y, wasm_dpr * (rect.max.x - rect.min.x), wasm_dpr * (rect.max.y - rect.min.y), color.r * 255.f, color.g * 255.f, color.b * 255.f, color.a);
|
||||
}
|
||||
|
||||
void wasm_add_event(app_event_t event) {
|
||||
if (wasm_events.len < lengthof(wasm_events.data)) {
|
||||
STACK_PUSH(wasm_events, event);
|
||||
} else if (wasm_event_failed_to_queue == false) {
|
||||
wasm_event_failed_to_queue = true;
|
||||
debugf("failed to queue event");
|
||||
}
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_mouse_move(f64 x, f64 y, b32 ctrl, b32 shift, b32 alt, b32 meta) {
|
||||
wasm_add_event((app_event_t){
|
||||
.kind = app_event_kind_mouse_move,
|
||||
.mouse_pos = {x, y},
|
||||
.ctrl = ctrl,
|
||||
.shift = shift,
|
||||
.alt = alt,
|
||||
.meta = meta,
|
||||
});
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_mouse_down(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b32 alt, b32 meta) {
|
||||
button += 1;
|
||||
assert(button >= app_mouse_button_left && button <= app_mouse_button_right);
|
||||
wasm_add_event((app_event_t){
|
||||
.kind = app_event_kind_mouse_down,
|
||||
.mouse_pos = {x, y},
|
||||
.mouse_button = button,
|
||||
.ctrl = ctrl,
|
||||
.shift = shift,
|
||||
.alt = alt,
|
||||
.meta = meta,
|
||||
});
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_mouse_up(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b32 alt, b32 meta) {
|
||||
button += 1;
|
||||
assert(button >= app_mouse_button_left && button <= app_mouse_button_right);
|
||||
wasm_add_event((app_event_t){
|
||||
.kind = app_event_kind_mouse_up,
|
||||
.mouse_pos = {x, y},
|
||||
.mouse_button = button,
|
||||
.ctrl = ctrl,
|
||||
.shift = shift,
|
||||
.alt = alt,
|
||||
.meta = meta,
|
||||
});
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_mouse_wheel(f64 delta_x, f64 delta_y, f64 delta_z, b32 ctrl, b32 shift, b32 alt, b32 meta) {
|
||||
wasm_add_event((app_event_t){
|
||||
.kind = app_event_kind_mouse_wheel,
|
||||
.mouse_wheel_delta = {delta_x, delta_y, delta_z},
|
||||
.ctrl = ctrl,
|
||||
.shift = shift,
|
||||
.alt = alt,
|
||||
.meta = meta,
|
||||
});
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_key_down(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
|
||||
assert(wasm_temp_buff1[127] == 0x13); // make sure we didn't overwrite memory in JS
|
||||
assert(wasm_temp_buff2[127] == 0x13);
|
||||
s8_t key8 = s8_from_char(key);
|
||||
|
||||
wasm_key_map_t map = wasm_map_key_string_to_app_key(key8);
|
||||
if (map.key != app_key_invalid) {
|
||||
wasm_add_event((app_event_t){
|
||||
.kind = app_event_kind_key_down,
|
||||
.key = map.key,
|
||||
.ctrl = ctrl,
|
||||
.shift = shift,
|
||||
.alt = alt,
|
||||
.meta = meta,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if (map.filter_out) {
|
||||
return;
|
||||
}
|
||||
|
||||
s8_t text = s8_copy(wasm_input_text_arena, key8);
|
||||
wasm_add_event((app_event_t){
|
||||
.kind = app_event_kind_text,
|
||||
.text = text,
|
||||
.ctrl = ctrl,
|
||||
.shift = shift,
|
||||
.alt = alt,
|
||||
.meta = meta,
|
||||
});
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
|
||||
assert(wasm_temp_buff1[127] == 0x13); // make sure we didn't overwrite memory in JS
|
||||
assert(wasm_temp_buff2[127] == 0x13);
|
||||
s8_t key8 = s8_from_char(key);
|
||||
|
||||
wasm_key_map_t map = wasm_map_key_string_to_app_key(key8);
|
||||
if (map.key != app_key_invalid) {
|
||||
wasm_add_event((app_event_t){
|
||||
.kind = app_event_kind_key_down,
|
||||
.key = map.key,
|
||||
.ctrl = ctrl,
|
||||
.shift = shift,
|
||||
.alt = alt,
|
||||
.meta = meta,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_update(f64 time, f64 width, f64 height, f64 dpr) {
|
||||
f64 delta_time = (time - wasm_last_time);
|
||||
for (i32 i = 0; i < wasm_events.len; i += 1) {
|
||||
wasm_events.data[i].dpr = dpr;
|
||||
wasm_events.data[i].window_size = (v2f32_t){width / dpr, height / dpr};
|
||||
wasm_events.data[i].time = time;
|
||||
wasm_events.data[i].delta_time = delta_time;
|
||||
}
|
||||
wasm_dpr = dpr;
|
||||
|
||||
on_update();
|
||||
|
||||
wasm_events.len = 0;
|
||||
wasm_last_time = time;
|
||||
ma_set0(wasm_input_text_arena);
|
||||
}
|
||||
|
||||
WASM_EXPORT void wasm_init(void) {
|
||||
isize page_size = kib(64);
|
||||
isize page_count = __builtin_wasm_memory_size(0);
|
||||
u8 *memory = (u8 *)&__heap_base;
|
||||
usize memory_size = page_count * (page_size) - (isize)memory;
|
||||
wasm_perm_arena.data = memory;
|
||||
wasm_perm_arena.commit = wasm_perm_arena.reserve = memory_size;
|
||||
wasm_input_text_arena = ma_push_arena(&wasm_perm_arena, kib(1));
|
||||
debugf("on_init, __builtin_wasm_memory_size(0) = %d(%d)", page_count, memory_size);
|
||||
}
|
||||
132
src/app/app_win32.c
Normal file
132
src/app/app_win32.c
Normal file
@@ -0,0 +1,132 @@
|
||||
#include "core/core.h"
|
||||
#include "app.gen.h"
|
||||
|
||||
#include "core/core.c"
|
||||
#include "app.gen.c"
|
||||
|
||||
#pragma comment(linker, "/subsystem:windows")
|
||||
#pragma comment(lib, "gdi32.lib")
|
||||
#pragma comment(lib, "user32.lib")
|
||||
#pragma comment(lib, "winmm.lib")
|
||||
|
||||
|
||||
b32 w32_good_scheduling = false;
|
||||
WNDCLASSW w32_wc;
|
||||
HWND w32_window_handle;
|
||||
HDC w32_dc;
|
||||
|
||||
void w32_on_key_down(app_key_t key) {
|
||||
}
|
||||
|
||||
void w32_on_key_up(app_key_t key) {
|
||||
}
|
||||
|
||||
LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
||||
switch (msg) {
|
||||
case WM_CLOSE: PostQuitMessage(0); break;
|
||||
case WM_KEYUP: w32_key_dispatch(wparam, w32_on_key_up); break;
|
||||
case WM_KEYDOWN: w32_key_dispatch(wparam, w32_on_key_down); break;
|
||||
default: return DefWindowProcW(wnd, msg, wparam, lparam);
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
|
||||
typedef enum W32_PROCESS_DPI_AWARENESS {
|
||||
W32_PROCESS_DPI_UNAWARE = 0,
|
||||
W32_PROCESS_SYSTEM_DPI_AWARE = 1,
|
||||
W32_PROCESS_PER_MONITOR_DPI_AWARE = 2
|
||||
} W32_PROCESS_DPI_AWARENESS;
|
||||
|
||||
typedef unsigned MU_TimeBeginPeriod(unsigned);
|
||||
typedef HRESULT MU_SetProcessDpiAwareness(W32_PROCESS_DPI_AWARENESS);
|
||||
|
||||
HMODULE shcore = LoadLibraryA("Shcore.dll");
|
||||
if (shcore) {
|
||||
MU_SetProcessDpiAwareness *set_dpi_awr = (MU_SetProcessDpiAwareness *)GetProcAddress(shcore, "SetProcessDpiAwareness");
|
||||
if (set_dpi_awr) {
|
||||
HRESULT hr = set_dpi_awr(W32_PROCESS_PER_MONITOR_DPI_AWARE);
|
||||
assert(SUCCEEDED(hr) && "Failed to set dpi awareness");
|
||||
}
|
||||
}
|
||||
|
||||
HMODULE winmm = LoadLibraryA("winmm.dll");
|
||||
if (winmm) {
|
||||
MU_TimeBeginPeriod *timeBeginPeriod = (MU_TimeBeginPeriod *)GetProcAddress(winmm, "timeBeginPeriod");
|
||||
if (timeBeginPeriod) {
|
||||
if (timeBeginPeriod(1) == 0) {
|
||||
w32_good_scheduling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WNDCLASSW wc = {0};
|
||||
{
|
||||
wc.lpfnWndProc = w32_window_proc;
|
||||
wc.hInstance = GetModuleHandleW(NULL);
|
||||
wc.lpszClassName = L"HelloClassName";
|
||||
wc.hCursor = LoadCursor(0, IDC_ARROW);
|
||||
wc.hIcon = NULL; // LoadIcon(wc.hInstance, IDI_APPLICATION);
|
||||
wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
|
||||
ATOM result = RegisterClassW(&wc);
|
||||
assert(result != 0);
|
||||
w32_wc = wc;
|
||||
}
|
||||
|
||||
RECT window_rect = {0};
|
||||
{
|
||||
window_rect.left = 0;
|
||||
window_rect.right = 1280;
|
||||
window_rect.bottom = 732;
|
||||
window_rect.top = 12;
|
||||
AdjustWindowRectEx(&window_rect, WS_OVERLAPPEDWINDOW, false, 0);
|
||||
}
|
||||
w32_window_handle = CreateWindowW(w32_wc.lpszClassName, L"Zzz... Window, hello!", WS_OVERLAPPEDWINDOW, window_rect.left, window_rect.top, window_rect.right - window_rect.left, window_rect.bottom - window_rect.top, NULL, NULL, hInstance, NULL);
|
||||
assert(w32_window_handle);
|
||||
|
||||
w32_dc = GetDC(w32_window_handle);
|
||||
assert(w32_dc);
|
||||
ShowWindow(w32_window_handle, SW_SHOW);
|
||||
|
||||
// @todo: rebuild on resize
|
||||
// Create a writable backbuffer bitmap
|
||||
uint32_t *mem = 0;
|
||||
BITMAPINFO bminfo = {0};
|
||||
{
|
||||
bminfo.bmiHeader.biSize = sizeof(bminfo.bmiHeader);
|
||||
bminfo.bmiHeader.biWidth = (LONG)1280;
|
||||
bminfo.bmiHeader.biHeight = (LONG)720;
|
||||
bminfo.bmiHeader.biPlanes = 1;
|
||||
bminfo.bmiHeader.biBitCount = 32;
|
||||
bminfo.bmiHeader.biCompression = BI_RGB; // AA RR GG BB
|
||||
bminfo.bmiHeader.biXPelsPerMeter = 1;
|
||||
bminfo.bmiHeader.biYPelsPerMeter = 1;
|
||||
}
|
||||
HBITMAP dib = CreateDIBSection(w32_dc, &bminfo, DIB_RGB_COLORS, (void **)&mem, 0, 0);
|
||||
HDC dib_dc = CreateCompatibleDC(w32_dc);
|
||||
|
||||
for (;;) {
|
||||
MSG msg;
|
||||
if (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
if (msg.message == WM_QUIT) {
|
||||
break;
|
||||
}
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessageW(&msg);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int y = 0; y < 720; y++) {
|
||||
for (int x = 0; x < 1280; x++) {
|
||||
mem[x + y * 1280] = 0xFFFF0000;
|
||||
}
|
||||
}
|
||||
|
||||
SelectObject(dib_dc, dib);
|
||||
BitBlt(w32_dc, 0, 0, 1280, 720, dib_dc, 0, 0, SRCCOPY);
|
||||
Sleep(10);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user