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;