From b5cb6933177c0202e52f273cb03aec9f4bea1b1c Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 19 Jan 2017 21:15:06 -0500 Subject: [PATCH] Only allow one pending keyboard event for any given key --- src/gui/Window.cc | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/gui/Window.cc b/src/gui/Window.cc index b4f010d..52235bd 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -14,6 +14,7 @@ struct SDL_TimerID timer_id; SDL_Keycode keysym; bool pressed; + bool event_pending; } Key_Statuses[SDL_NUM_SCANCODES]; /** @@ -175,14 +176,18 @@ Uint32 Key_Repeat(Uint32 interval, void * param) { if (Key_Statuses[(uintptr_t)param].pressed) { - SDL_Event event; + if (!Key_Statuses[(uintptr_t)param].event_pending) + { + SDL_Event event; - event.user.code = 0; - event.user.data1 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].keysym; - event.user.data2 = nullptr; - event.type = SDL_USEREVENT; + event.user.code = 0; + event.user.data1 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].keysym; + event.user.data2 = param; + event.type = SDL_USEREVENT; - SDL_PushEvent(&event); + SDL_PushEvent(&event); + Key_Statuses[(uintptr_t)param].event_pending = true; + } return 25u; } @@ -238,6 +243,7 @@ void Window::handle_event(SDL_Event & event) break; case SDL_USEREVENT: + Key_Statuses[(uintptr_t)event.user.data2].event_pending = false; handle_keysym((uint32_t)(uintptr_t)event.user.data1); break;