From 2bdea40c02e69f4b5f3a0e68413ed1ac06600616 Mon Sep 17 00:00:00 2001 From: quou Date: Sat, 20 Jul 2024 09:55:14 +1000 Subject: keyboard input --- plat.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plat.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) diff --git a/plat.c b/plat.c index da32e29..5f77e8a 100644 --- a/plat.c +++ b/plat.c @@ -274,6 +274,85 @@ typedef struct { Atom wm_delete; } App_Internal; +Key key_from_xkey(unsigned key) { + switch (key) { + case 0x61: return key_A; + case 0x62: return key_B; + case 0x63: return key_C; + case 0x64: return key_D; + case 0x65: return key_E; + case 0x66: return key_F; + case 0x67: return key_G; + case 0x68: return key_H; + case 0x69: return key_I; + case 0x6A: return key_J; + case 0x6B: return key_K; + case 0x6C: return key_L; + case 0x6D: return key_M; + case 0x6E: return key_N; + case 0x6F: return key_O; + case 0x70: return key_P; + case 0x71: return key_Q; + case 0x72: return key_R; + case 0x73: return key_S; + case 0x74: return key_T; + case 0x75: return key_U; + case 0x76: return key_V; + case 0x77: return key_W; + case 0x78: return key_X; + case 0x79: return key_Y; + case 0x7A: return key_Z; + case XK_F1: return key_f1; + case XK_F2: return key_f2; + case XK_F3: return key_f3; + case XK_F4: return key_f4; + case XK_F5: return key_f5; + case XK_F6: return key_f6; + case XK_F7: return key_f7; + case XK_F8: return key_f8; + case XK_F9: return key_f9; + case XK_F10: return key_f10; + case XK_F11: return key_f11; + case XK_F12: return key_f12; + case XK_Down: return key_down; + case XK_Left: return key_left; + case XK_Right: return key_right; + case XK_Up: return key_up; + case XK_Escape: return key_escape; + case XK_Return: return key_return; + case XK_BackSpace: return key_backspace; + case XK_Linefeed: return key_return; + case XK_Tab: return key_tab; + case XK_Delete: return key_delete; + case XK_Home: return key_home; + case XK_End: return key_end; + case XK_Page_Up: return key_page_up; + case XK_Page_Down: return key_page_down; + case XK_Insert: return key_insert; + case XK_Shift_L: return key_shift; + case XK_Shift_R: return key_shift; + case XK_Control_L: return key_control; + case XK_Control_R: return key_control; + case XK_Super_L: return key_super; + case XK_Super_R: return key_super; + case XK_Alt_L: return key_alt; + case XK_Alt_R: return key_alt; + case XK_space: return key_space; + case XK_period: return key_period; + case XK_0: return key_0; + case XK_1: return key_1; + case XK_2: return key_2; + case XK_3: return key_3; + case XK_4: return key_4; + case XK_5: return key_5; + case XK_6: return key_6; + case XK_7: return key_7; + case XK_8: return key_8; + case XK_9: return key_9; + default: return key_unknown; + } +} + void init_rendering( App* a, App_Internal* i, @@ -406,10 +485,18 @@ void app_begin(App* a) { App_Internal* i = (App_Internal*)(&a[1]); Display* d = i->d; Window w = i->wi; + int j; i->begin = get_timer(); + for (j = 0; j < key_count; j++) { + a->key_states[j] &= ~( + key_state_just_pressed | key_state_just_released + ); + } while (XPending(d)) { XEvent e; XWindowAttributes wa; + KeySym sym; + Key key; XNextEvent(d, &e); switch (e.type) { case ClientMessage: @@ -435,6 +522,19 @@ void app_begin(App* a) { a->my = e.xmotion.y / a->s; } break; + case KeyPress: + sym = XLookupKeysym(&e.xkey, 0); + key = key_from_xkey(sym); + a->key_states[key] |= + key_state_pressed | + key_state_just_pressed; + break; + case KeyRelease: + sym = XLookupKeysym(&e.xkey, 0); + key = key_from_xkey(sym); + a->key_states[key] &= ~key_state_pressed; + a->key_states[key] |= key_state_just_released; + break; case GenericEvent: if (!i->ms) { if ( diff --git a/plat.h b/plat.h index 1d79465..70fdf36 100644 --- a/plat.h +++ b/plat.h @@ -64,6 +64,90 @@ void fps_begin(FPS* f); void fps_end(FPS* f); void fps_update(FPS* f); +#define key_xmacro() \ + x(key_unknown) \ + x(key_A) \ + x(key_B) \ + x(key_C) \ + x(key_D) \ + x(key_E) \ + x(key_F) \ + x(key_G) \ + x(key_H) \ + x(key_I) \ + x(key_J) \ + x(key_K) \ + x(key_L) \ + x(key_M) \ + x(key_N) \ + x(key_O) \ + x(key_P) \ + x(key_Q) \ + x(key_R) \ + x(key_S) \ + x(key_T) \ + x(key_U) \ + x(key_V) \ + x(key_W) \ + x(key_X) \ + x(key_Y) \ + x(key_Z) \ + x(key_f1) \ + x(key_f2) \ + x(key_f3) \ + x(key_f4) \ + x(key_f5) \ + x(key_f6) \ + x(key_f7) \ + x(key_f8) \ + x(key_f9) \ + x(key_f10) \ + x(key_f11) \ + x(key_f12) \ + x(key_down) \ + x(key_left) \ + x(key_right) \ + x(key_up) \ + x(key_escape) \ + x(key_return) \ + x(key_backspace) \ + x(key_tab) \ + x(key_delete) \ + x(key_home) \ + x(key_end) \ + x(key_page_up) \ + x(key_page_down) \ + x(key_insert) \ + x(key_shift) \ + x(key_control) \ + x(key_super) \ + x(key_alt) \ + x(key_space) \ + x(key_period) \ + x(key_0) \ + x(key_1) \ + x(key_2) \ + x(key_3) \ + x(key_4) \ + x(key_5) \ + x(key_6) \ + x(key_7) \ + x(key_8) \ + x(key_9) \ + +typedef enum { +#define x(name) name, + key_xmacro() +#undef x + key_count +} Key; + +typedef enum { + key_state_pressed = 1 << 0, + key_state_just_pressed = 1 << 1, + key_state_just_released = 1 << 2 +} Key_State; + typedef struct { int w, h, s, o, mpf; int fps; @@ -72,6 +156,7 @@ typedef struct { Error err; Colour* fb; Heap* heap; + unsigned char key_states[key_count]; } App; App* new_app(Heap* mem, int w, int h, const char* n); -- cgit v1.2.3-54-g00ecf