diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 8b5dffb..7d4b638 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -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; +} diff --git a/src/gui/Window.h b/src/gui/Window.h index 427bac6..62f09dc 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -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;