From b64b9bed235d2d7367fb4ebbaa958cd285f4d31c Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 24 Jul 2016 22:45:28 -0400 Subject: [PATCH] begin restructuring keyboard event handling more permanently --- src/gui/Window.cc | 68 ++++++++++++++++++++++++++--------------------- src/gui/Window.h | 1 + 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/gui/Window.cc b/src/gui/Window.cc index a24da92..b1bc0c4 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -6,7 +6,12 @@ #define INITIAL_HEIGHT 500 #define FONT_SIZE 16 -bool Key_Statuses[SDL_NUM_SCANCODES]; +struct +{ + SDL_TimerID timer_id; + Uint16 mod; + bool pressed; +} Key_Statuses[SDL_NUM_SCANCODES]; /** * Initialize SDL. @@ -137,12 +142,13 @@ void Window::run_event_loop() Uint32 Key_Repeat(Uint32 interval, void * param) { - if (Key_Statuses[(uintptr_t)param]) + if (Key_Statuses[(uintptr_t)param].pressed) { SDL_Event event; event.user.code = 0; event.user.data1 = param; + event.user.data2 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].mod; event.type = SDL_USEREVENT; SDL_PushEvent(&event); @@ -167,31 +173,22 @@ void Window::handle_event(SDL_Event & event) break; case SDL_KEYDOWN: - Key_Statuses[event.key.keysym.scancode] = true; - switch (event.key.keysym.scancode) + if (event.key.repeat == 0) { - case SDL_SCANCODE_ESCAPE: - m_exit_requested = true; - break; - case SDL_SCANCODE_J: - if (event.key.repeat == 0u) - { - SDL_AddTimer(200, Key_Repeat, (void *)event.key.keysym.scancode); - scroll_down(); - } - break; - case SDL_SCANCODE_K: - if (event.key.repeat == 0u) - { - SDL_AddTimer(200, Key_Repeat, (void *)event.key.keysym.scancode); - scroll_up(); - } - break; + Key_Statuses[event.key.keysym.scancode].pressed = true; + Key_Statuses[event.key.keysym.scancode].timer_id = SDL_AddTimer(200, Key_Repeat, (void *)event.key.keysym.scancode); + Key_Statuses[event.key.keysym.scancode].mod = event.key.keysym.mod; + handle_key(event.key.keysym.scancode, event.key.keysym.mod); } break; case SDL_KEYUP: - Key_Statuses[event.key.keysym.scancode] = false; + Key_Statuses[event.key.keysym.scancode].pressed = false; + if (Key_Statuses[event.key.keysym.scancode].timer_id != 0) + { + SDL_RemoveTimer(Key_Statuses[event.key.keysym.scancode].timer_id); + Key_Statuses[event.key.keysym.scancode].timer_id = 0; + } break; case SDL_WINDOWEVENT: @@ -208,15 +205,24 @@ void Window::handle_event(SDL_Event & event) break; case SDL_USEREVENT: - switch ((uintptr_t)event.user.data1) - { - case SDL_SCANCODE_J: - scroll_down(); - break; - case SDL_SCANCODE_K: - scroll_up(); - break; - } + handle_key((uint32_t)(uintptr_t)event.user.data1, + (uint32_t)(uintptr_t)event.user.data2); + break; + } +} + +void Window::handle_key(uint32_t scancode, uint32_t mod) +{ + switch (scancode) + { + case SDL_SCANCODE_ESCAPE: + m_exit_requested = true; + break; + case SDL_SCANCODE_J: + scroll_down(); + break; + case SDL_SCANCODE_K: + scroll_up(); break; } } diff --git a/src/gui/Window.h b/src/gui/Window.h index e2eedd8..6f2f8d4 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -16,6 +16,7 @@ protected: void resize(); void redraw(); void handle_event(SDL_Event & event); + void handle_key(uint32_t scancode, uint32_t mod); void scroll_down(); void scroll_up();