w32_map_wparam_to_app_key, todo, api

This commit is contained in:
krzosa
2024-12-29 10:54:28 +01:00
parent fddbbb9654
commit d7c5b72bb9
8 changed files with 121 additions and 119 deletions

View File

@@ -18,7 +18,7 @@ int main(int argc, char **argv) {
bool run_server = false; bool run_server = false;
bool core_test_target = false; bool core_test_target = false;
bool wasm_target = true; bool wasm_target = true;
bool win32_target = false; bool win32_target = true;
if (run_server) { if (run_server) {
os_systemf("start /D ..\\package ..\\package\\run_server.bat"); os_systemf("start /D ..\\package ..\\package\\run_server.bat");

View File

@@ -1,7 +1,7 @@
type_t type__app_key_t = { type_kind_enum, s8_const_lit("app_key_t"), sizeof(app_key_t), type_t type__app_key_t = { type_kind_enum, s8_const_lit("app_key_t"), sizeof(app_key_t),
.members = (type_member_t[]){ .members = (type_member_t[]){
{.name = s8_const_lit("app_key_invalid"), .value = app_key_invalid}, {.name = s8_const_lit("app_key_null"), .value = app_key_null},
{.name = s8_const_lit("app_key_1"), .value = app_key_1}, {.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_2"), .value = app_key_2},
{.name = s8_const_lit("app_key_3"), .value = app_key_3}, {.name = s8_const_lit("app_key_3"), .value = app_key_3},
@@ -152,79 +152,79 @@ wasm_key_map_t wasm_map_key_string_to_app_key(s8_t key) {
#endif #endif
#if PLATFORM_WINDOWS #if PLATFORM_WINDOWS
void w32_key_dispatch(WPARAM wparam, void (*handle_key)(app_key_t)) { app_key_t w32_map_wparam_to_app_key(WPARAM wparam) {
switch(wparam) { switch(wparam) {
case '1': handle_key(app_key_1); break; case '1': return app_key_1; break;
case '2': handle_key(app_key_2); break; case '2': return app_key_2; break;
case '3': handle_key(app_key_3); break; case '3': return app_key_3; break;
case '4': handle_key(app_key_4); break; case '4': return app_key_4; break;
case '5': handle_key(app_key_5); break; case '5': return app_key_5; break;
case '6': handle_key(app_key_6); break; case '6': return app_key_6; break;
case '7': handle_key(app_key_7); break; case '7': return app_key_7; break;
case '8': handle_key(app_key_8); break; case '8': return app_key_8; break;
case '9': handle_key(app_key_9); break; case '9': return app_key_9; break;
case '0': handle_key(app_key_0); break; case '0': return app_key_0; break;
case VK_F1: handle_key(app_key_f1); break; case VK_F1: return app_key_f1; break;
case VK_F2: handle_key(app_key_f2); break; case VK_F2: return app_key_f2; break;
case VK_F3: handle_key(app_key_f3); break; case VK_F3: return app_key_f3; break;
case VK_F4: handle_key(app_key_f4); break; case VK_F4: return app_key_f4; break;
case VK_F5: handle_key(app_key_f5); break; case VK_F5: return app_key_f5; break;
case VK_F6: handle_key(app_key_f6); break; case VK_F6: return app_key_f6; break;
case VK_F7: handle_key(app_key_f7); break; case VK_F7: return app_key_f7; break;
case VK_F8: handle_key(app_key_f8); break; case VK_F8: return app_key_f8; break;
case VK_F9: handle_key(app_key_f9); break; case VK_F9: return app_key_f9; break;
case VK_F10: handle_key(app_key_f10); break; case VK_F10: return app_key_f10; break;
case VK_F11: handle_key(app_key_f11); break; case VK_F11: return app_key_f11; break;
case VK_F12: handle_key(app_key_f12); break; case VK_F12: return app_key_f12; break;
case 'A': handle_key(app_key_a); break; case 'A': return app_key_a; break;
case 'B': handle_key(app_key_b); break; case 'B': return app_key_b; break;
case 'C': handle_key(app_key_c); break; case 'C': return app_key_c; break;
case 'D': handle_key(app_key_d); break; case 'D': return app_key_d; break;
case 'E': handle_key(app_key_e); break; case 'E': return app_key_e; break;
case 'F': handle_key(app_key_f); break; case 'F': return app_key_f; break;
case 'G': handle_key(app_key_g); break; case 'G': return app_key_g; break;
case 'H': handle_key(app_key_h); break; case 'H': return app_key_h; break;
case 'I': handle_key(app_key_i); break; case 'I': return app_key_i; break;
case 'J': handle_key(app_key_j); break; case 'J': return app_key_j; break;
case 'K': handle_key(app_key_k); break; case 'K': return app_key_k; break;
case 'L': handle_key(app_key_l); break; case 'L': return app_key_l; break;
case 'M': handle_key(app_key_m); break; case 'M': return app_key_m; break;
case 'N': handle_key(app_key_n); break; case 'N': return app_key_n; break;
case 'O': handle_key(app_key_o); break; case 'O': return app_key_o; break;
case 'P': handle_key(app_key_p); break; case 'P': return app_key_p; break;
case 'Q': handle_key(app_key_q); break; case 'Q': return app_key_q; break;
case 'R': handle_key(app_key_r); break; case 'R': return app_key_r; break;
case 'S': handle_key(app_key_s); break; case 'S': return app_key_s; break;
case 'T': handle_key(app_key__t); break; case 'T': return app_key__t; break;
case 'U': handle_key(app_key_u); break; case 'U': return app_key_u; break;
case 'V': handle_key(app_key_v); break; case 'V': return app_key_v; break;
case 'W': handle_key(app_key_w); break; case 'W': return app_key_w; break;
case 'X': handle_key(app_key_x); break; case 'X': return app_key_x; break;
case 'Y': handle_key(app_key_y); break; case 'Y': return app_key_y; break;
case 'Z': handle_key(app_key_z); break; case 'Z': return app_key_z; break;
case VK_SPACE: handle_key(app_key_space); break; case VK_SPACE: return app_key_space; break;
case VK_RETURN: handle_key(app_key_enter); break; case VK_RETURN: return app_key_enter; break;
case VK_ESCAPE: handle_key(app_key_escape); break; case VK_ESCAPE: return app_key_escape; break;
case VK_LEFT: handle_key(app_key_left); break; case VK_LEFT: return app_key_left; break;
case VK_UP: handle_key(app_key_up); break; case VK_UP: return app_key_up; break;
case VK_RIGHT: handle_key(app_key_right); break; case VK_RIGHT: return app_key_right; break;
case VK_DOWN: handle_key(app_key_down); break; case VK_DOWN: return app_key_down; break;
case VK_TAB: handle_key(app_key_tab); break; case VK_TAB: return app_key_tab; break;
case VK_BACK: handle_key(app_key_backspace); break; case VK_BACK: return app_key_backspace; break;
case VK_CONTROL: handle_key(app_key_control); break; case VK_CONTROL: return app_key_control; break;
case VK_SHIFT: handle_key(app_key_shift); break; case VK_SHIFT: return app_key_shift; break;
case VK_LMENU: handle_key(app_key_alt); break; case VK_LMENU: return app_key_alt; break;
case VK_RMENU: handle_key(app_key_alt); break; case VK_RMENU: return app_key_alt; break;
case VK_LWIN: handle_key(app_key_meta); break; case VK_LWIN: return app_key_meta; break;
case VK_RWIN: handle_key(app_key_meta); break; case VK_RWIN: return app_key_meta; break;
case VK_CAPITAL: handle_key(app_key_caps_lock); break; case VK_CAPITAL: return app_key_caps_lock; break;
case VK_DELETE: handle_key(app_key_delete); break; case VK_DELETE: return app_key_delete; break;
case VK_HOME: handle_key(app_key_home); break; case VK_HOME: return app_key_home; break;
case VK_END: handle_key(app_key_end); break; case VK_END: return app_key_end; break;
case VK_NEXT: handle_key(app_key_insert); break; case VK_NEXT: return app_key_insert; break;
case VK_INSERT: handle_key(app_key_page_up); break; case VK_INSERT: return app_key_page_up; break;
case VK_PRIOR: handle_key(app_key_page_down); break; case VK_PRIOR: return app_key_page_down; break;
default: {} break; default: {return app_key_null;} break;
} }
} }
#endif/*D:\dev\wasm\src/app/app.meta.c*/ #endif/*D:\dev\wasm\src/app/app.meta.c*/
@@ -240,7 +240,7 @@ type_t type__app_mouse_button_t = { type_kind_enum, s8_const_lit("app_mouse_butt
}; };
type_t type__app_event_kind_t = { type_kind_enum, s8_const_lit("app_event_kind_t"), sizeof(app_event_kind_t), 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[]){ .members = (type_member_t[]){
{.name = s8_const_lit("app_event_kind_invalid"), .value = app_event_kind_invalid}, {.name = s8_const_lit("app_event_kind_null"), .value = app_event_kind_null},
{.name = s8_const_lit("app_event_kind_update"), .value = app_event_kind_update}, {.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_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_down"), .value = app_event_kind_key_down},

View File

@@ -1,5 +1,5 @@
typedef enum { typedef enum {
app_key_invalid, app_key_null,
app_key_1, app_key_1,
app_key_2, app_key_2,
app_key_3, app_key_3,
@@ -79,7 +79,7 @@ typedef enum {
app_mouse_button_count, app_mouse_button_count,
} app_mouse_button_t; } app_mouse_button_t;
typedef enum { typedef enum {
app_event_kind_invalid, app_event_kind_null,
app_event_kind_update, app_event_kind_update,
app_event_kind_text, app_event_kind_text,
app_event_kind_key_down, app_event_kind_key_down,

View File

@@ -5,8 +5,8 @@ void meta_app(ma_arena_t *arena) {
ast_t *keys = parse_table(arena, __FILE__, CODE( ast_t *keys = parse_table(arena, __FILE__, CODE(
// javascript filter out // javascript filter out
| name | js1 | js2 | jf | windows1 | windows2 | | name | js1 | js2 | jf | windows1 | windows2 |
| invalid | XXX | XXX | 1 | XXX | XXX | | null | XXX | XXX | 1 | XXX | XXX |
| 1 | 1 | XXX | 0 | `'1'` | XXX | | 1 | 1 | XXX | 0 | `'1'` | XXX |
| 2 | 2 | XXX | 0 | `'2'` | XXX | | 2 | 2 | XXX | 0 | `'2'` | XXX |
| 3 | 3 | XXX | 0 | `'3'` | XXX | | 3 | 3 | XXX | 0 | `'3'` | XXX |
@@ -115,7 +115,7 @@ void meta_app(ma_arena_t *arena) {
i32 w2i = row_findi(keys->first, "windows2"); i32 w2i = row_findi(keys->first, "windows2");
sb8_stmtf(c, "\n#if PLATFORM_WINDOWS"); sb8_stmtf(c, "\n#if PLATFORM_WINDOWS");
sb8_stmtf(c, "void w32_key_dispatch(WPARAM wparam, void (*handle_key)(app_key_t)) {"); sb8_stmtf(c, "app_key_t w32_map_wparam_to_app_key(WPARAM wparam) {");
c->indent += 1; c->indent += 1;
sb8_stmtf(c, "switch(wparam) {"); sb8_stmtf(c, "switch(wparam) {");
c->indent += 1; c->indent += 1;
@@ -124,11 +124,10 @@ void meta_app(ma_arena_t *arena) {
s8_t w[] = {row_geti(row, w1i)->string, row_geti(row, w2i)->string}; s8_t w[] = {row_geti(row, w1i)->string, row_geti(row, w2i)->string};
for (i32 i = 0; i < lengthof(w); i += 1) { for (i32 i = 0; i < lengthof(w); i += 1) {
if (s8_equal(w[i], s8_lit("XXX"))) continue; 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, "case %.*s: handle_key(app_key_%.*s); break;", s8_fmtspec(w[i]), s8_fmtspec(name));
} }
} }
sb8_stmtf(c, "default: {} break;"); sb8_stmtf(c, "default: {return app_key_null;} break;");
c->indent -= 1; c->indent -= 1;
sb8_stmtf(c, "}"); sb8_stmtf(c, "}");
c->indent -= 1; c->indent -= 1;
@@ -147,7 +146,7 @@ void meta_app(ma_arena_t *arena) {
} app_mouse_button_t; } app_mouse_button_t;
typedef enum { typedef enum {
app_event_kind_invalid, app_event_kind_null,
app_event_kind_update, app_event_kind_update,
app_event_kind_text, app_event_kind_text,
app_event_kind_key_down, app_event_kind_key_down,

View File

@@ -136,7 +136,7 @@ WASM_EXPORT void wasm_key_down(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta
s8_t key8 = s8_from_char(key); s8_t key8 = s8_from_char(key);
wasm_key_map_t map = wasm_map_key_string_to_app_key(key8); wasm_key_map_t map = wasm_map_key_string_to_app_key(key8);
if (map.key != app_key_invalid) { if (map.key != app_key_null) {
wasm_add_event((app_event_t){ wasm_add_event((app_event_t){
.kind = app_event_kind_key_down, .kind = app_event_kind_key_down,
.key = map.key, .key = map.key,
@@ -169,7 +169,7 @@ WASM_EXPORT void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta)
s8_t key8 = s8_from_char(key); s8_t key8 = s8_from_char(key);
wasm_key_map_t map = wasm_map_key_string_to_app_key(key8); wasm_key_map_t map = wasm_map_key_string_to_app_key(key8);
if (map.key != app_key_invalid) { if (map.key != app_key_null) {
wasm_add_event((app_event_t){ wasm_add_event((app_event_t){
.kind = app_event_kind_key_up, .kind = app_event_kind_key_up,
.key = map.key, .key = map.key,
@@ -206,5 +206,5 @@ WASM_EXPORT void wasm_init(void) {
wasm_perm_arena.data = memory; wasm_perm_arena.data = memory;
wasm_perm_arena.commit = wasm_perm_arena.reserve = memory_size; wasm_perm_arena.commit = wasm_perm_arena.reserve = memory_size;
wasm_input_text_arena = ma_push_arena(&wasm_perm_arena, kib(1)); 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); debugexf("on_init, __builtin_wasm_memory_size(0) = %d(%d)", page_count, memory_size);
} }

View File

@@ -15,17 +15,15 @@ WNDCLASSW w32_wc;
HWND w32_window_handle; HWND w32_window_handle;
HDC w32_dc; 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) { LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam) {
switch (msg) { switch (msg) {
case WM_CLOSE: PostQuitMessage(0); break; case WM_CLOSE: PostQuitMessage(0); break;
case WM_KEYUP: w32_key_dispatch(wparam, w32_on_key_up); break; case WM_KEYUP: {
case WM_KEYDOWN: w32_key_dispatch(wparam, w32_on_key_down); break; app_key_t key = w32_map_wparam_to_app_key(wparam);
} break;
case WM_KEYDOWN: {
app_key_t key = w32_map_wparam_to_app_key(wparam);
} break;
default: return DefWindowProcW(wnd, msg, wparam, lparam); default: return DefWindowProcW(wnd, msg, wparam, lparam);
} }
return 0; return 0;

View File

@@ -1,3 +0,0 @@
void dr2f64(r2f64_t r) {
debugf("[%f %f %f %f]", r.x0, r.y0, r.x1, r.y1);
}

View File

@@ -1,23 +1,31 @@
platform [ ] platform
more then 2 platform abstraction [ ] app
app platform game [ ] wasm
in the future event based? [ ] win32
or maybe hybrid? [ ] hot reload / plugins
os functionality [ ] linux
gfx [ ] os
w32 [?] wasm (explore)
canvas [ ] win32
dll hot reload [ ] linux
wasm: [ ] gfx
input and key down (use KeyA KeyB etc.) [ ] simple 2d
[ ] revisit api
type_info: [ ] core
serialize [ ] revisit api
deserialize [ ] s8_bin
[ ] bin_write_begin - serialize binary data (sb8_bin_write?)
bin_write_end
app bin_write_u64
loop styles: bin_write_u32
infinite loop update -> gather all events -> loop event and update -> render (vsync wait) + block when no events bin_write_u16
update (render) + other events (don't render) + block when no events bin_write_u8
bin_write_data
bin_write_size
bin_write_s8
bin_write_cs
[ ] bin_read_begin
bin_read_end
bin_read_...