begin restructuring keyboard event handling more permanently

This commit is contained in:
Josh Holtrop 2016-07-24 22:45:28 -04:00
parent 31422709e8
commit b64b9bed23
2 changed files with 38 additions and 31 deletions

View File

@ -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;
}
}

View File

@ -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();