Only allow one pending keyboard event for any given key

This commit is contained in:
Josh Holtrop 2017-01-19 21:15:06 -05:00
parent 3cd988bc3a
commit b5cb693317

View File

@ -14,6 +14,7 @@ struct
SDL_TimerID timer_id; SDL_TimerID timer_id;
SDL_Keycode keysym; SDL_Keycode keysym;
bool pressed; bool pressed;
bool event_pending;
} Key_Statuses[SDL_NUM_SCANCODES]; } Key_Statuses[SDL_NUM_SCANCODES];
/** /**
@ -174,15 +175,19 @@ void Window::run_event_loop()
Uint32 Key_Repeat(Uint32 interval, void * param) Uint32 Key_Repeat(Uint32 interval, void * param)
{ {
if (Key_Statuses[(uintptr_t)param].pressed) if (Key_Statuses[(uintptr_t)param].pressed)
{
if (!Key_Statuses[(uintptr_t)param].event_pending)
{ {
SDL_Event event; SDL_Event event;
event.user.code = 0; event.user.code = 0;
event.user.data1 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].keysym; event.user.data1 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].keysym;
event.user.data2 = nullptr; event.user.data2 = param;
event.type = SDL_USEREVENT; event.type = SDL_USEREVENT;
SDL_PushEvent(&event); SDL_PushEvent(&event);
Key_Statuses[(uintptr_t)param].event_pending = true;
}
return 25u; return 25u;
} }
@ -238,6 +243,7 @@ void Window::handle_event(SDL_Event & event)
break; break;
case SDL_USEREVENT: case SDL_USEREVENT:
Key_Statuses[(uintptr_t)event.user.data2].event_pending = false;
handle_keysym((uint32_t)(uintptr_t)event.user.data1); handle_keysym((uint32_t)(uintptr_t)event.user.data1);
break; break;