begin restructuring keyboard event handling more permanently
This commit is contained in:
parent
31422709e8
commit
b64b9bed23
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user