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 INITIAL_HEIGHT 500
#define FONT_SIZE 16 #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. * Initialize SDL.
@ -137,12 +142,13 @@ 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]) if (Key_Statuses[(uintptr_t)param].pressed)
{ {
SDL_Event event; SDL_Event event;
event.user.code = 0; event.user.code = 0;
event.user.data1 = param; event.user.data1 = param;
event.user.data2 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].mod;
event.type = SDL_USEREVENT; event.type = SDL_USEREVENT;
SDL_PushEvent(&event); SDL_PushEvent(&event);
@ -167,31 +173,22 @@ void Window::handle_event(SDL_Event & event)
break; break;
case SDL_KEYDOWN: case SDL_KEYDOWN:
Key_Statuses[event.key.keysym.scancode] = true; if (event.key.repeat == 0)
switch (event.key.keysym.scancode)
{ {
case SDL_SCANCODE_ESCAPE: Key_Statuses[event.key.keysym.scancode].pressed = true;
m_exit_requested = true; Key_Statuses[event.key.keysym.scancode].timer_id = SDL_AddTimer(200, Key_Repeat, (void *)event.key.keysym.scancode);
break; Key_Statuses[event.key.keysym.scancode].mod = event.key.keysym.mod;
case SDL_SCANCODE_J: handle_key(event.key.keysym.scancode, event.key.keysym.mod);
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;
} }
break; break;
case SDL_KEYUP: 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; break;
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
@ -208,15 +205,24 @@ void Window::handle_event(SDL_Event & event)
break; break;
case SDL_USEREVENT: case SDL_USEREVENT:
switch ((uintptr_t)event.user.data1) handle_key((uint32_t)(uintptr_t)event.user.data1,
{ (uint32_t)(uintptr_t)event.user.data2);
case SDL_SCANCODE_J: break;
scroll_down(); }
break; }
case SDL_SCANCODE_K:
scroll_up(); void Window::handle_key(uint32_t scancode, uint32_t mod)
break; {
} 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; break;
} }
} }

View File

@ -16,6 +16,7 @@ protected:
void resize(); void resize();
void redraw(); void redraw();
void handle_event(SDL_Event & event); void handle_event(SDL_Event & event);
void handle_key(uint32_t scancode, uint32_t mod);
void scroll_down(); void scroll_down();
void scroll_up(); void scroll_up();