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 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user