begin reworking keyboard handling

This commit is contained in:
Josh Holtrop 2016-10-29 01:40:27 -04:00
parent 7ba7abc029
commit fa752fefde
2 changed files with 81 additions and 0 deletions

View File

@ -205,6 +205,9 @@ void Window::handle_event(SDL_Event & event)
case SDL_KEYDOWN:
m_keymod = event.key.keysym.mod;
{
uint32_t keyval = get_keyval(event.key.keysym.sym);
}
if (event.key.repeat == 0)
{
Key_Statuses[event.key.keysym.scancode].pressed = true;
@ -216,6 +219,9 @@ void Window::handle_event(SDL_Event & event)
case SDL_KEYUP:
m_keymod = event.key.keysym.mod;
{
uint32_t keyval = get_keyval(event.key.keysym.sym);
}
Key_Statuses[event.key.keysym.scancode].pressed = false;
if (Key_Statuses[event.key.keysym.scancode].timer_id != 0)
{
@ -546,3 +552,68 @@ void Window::insertion_test()
m_buffer->piece_table->insertion_test(*m_cursor);
redraw();
}
uint32_t Window::get_keyval(SDL_Keycode keysym)
{
uint32_t keyval = keysym;
if ((m_keymod & (KMOD_SHIFT | KMOD_CAPS)) != 0u)
{
uint32_t shifted = get_shifted(keyval);
if (shifted != keyval)
{
keyval = shifted;
}
else
{
keyval |= KEYMOD_SHIFT;
}
}
if ((m_keymod & KMOD_CTRL) != 0u)
{
keyval |= KEYMOD_CTRL;
}
if ((m_keymod & KMOD_ALT) != 0u)
{
keyval |= KEYMOD_ALT;
}
if ((m_keymod & KMOD_GUI) != 0u)
{
keyval |= KEYMOD_GUI;
}
return keyval;
}
uint32_t Window::get_shifted(uint32_t keysym)
{
if ((keysym >= 'a') && (keysym <= 'z'))
{
return keysym - ('a' - 'A');
}
switch (keysym)
{
case SDLK_QUOTE: return '"';
case SDLK_COMMA: return '<';
case SDLK_MINUS: return '_';
case SDLK_PERIOD: return '>';
case SDLK_SLASH: return '?';
case SDLK_0: return ')';
case SDLK_1: return '!';
case SDLK_2: return '@';
case SDLK_3: return '#';
case SDLK_4: return '$';
case SDLK_5: return '%';
case SDLK_6: return '^';
case SDLK_7: return '&';
case SDLK_8: return '*';
case SDLK_9: return '(';
case SDLK_SEMICOLON: return ':';
case SDLK_EQUALS: return '+';
case SDLK_LEFTBRACKET: return '{';
case SDLK_BACKSLASH: return '|';
case SDLK_RIGHTBRACKET: return '}';
case SDLK_BACKQUOTE: return '~';
}
return keysym;
}

View File

@ -27,6 +27,14 @@ protected:
CURSOR_EOL,
};
enum
{
KEYMOD_CTRL = 0x10000,
KEYMOD_ALT = 0x20000,
KEYMOD_SHIFT = 0x40000,
KEYMOD_GUI = 0x80000,
};
void resize();
void redraw();
void draw_cursor(int screen_column, int screen_row);
@ -43,6 +51,8 @@ protected:
void draw_rect(int x, int y, int width, int height, float r, float g, float b, float a);
void draw_status_bar();
void insertion_test();
uint32_t get_keyval(SDL_Keycode keysym);
uint32_t get_shifted(uint32_t keysym);
SDL_Window * m_window;
bool m_exit_requested;