From 827f4efdd91644854586deffb24fde3a36252cee Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 29 Oct 2016 01:51:16 -0400 Subject: [PATCH] handle keys based on code point with modifier flags --- src/gui/Window.cc | 52 +++++++++++++++++++++++------------------------ src/gui/Window.h | 3 ++- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 7d4b638..e7379d0 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -9,7 +9,7 @@ struct { SDL_TimerID timer_id; - Uint16 mod; + SDL_Keycode keysym; bool pressed; } Key_Statuses[SDL_NUM_SCANCODES]; @@ -178,8 +178,8 @@ Uint32 Key_Repeat(Uint32 interval, void * param) SDL_Event event; event.user.code = 0; - event.user.data1 = param; - event.user.data2 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].mod; + event.user.data1 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].keysym; + event.user.data2 = nullptr; event.type = SDL_USEREVENT; SDL_PushEvent(&event); @@ -205,23 +205,17 @@ 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; + Key_Statuses[event.key.keysym.scancode].keysym = event.key.keysym.sym; 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); + handle_keysym(event.key.keysym.sym); } break; 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) { @@ -244,52 +238,56 @@ void Window::handle_event(SDL_Event & event) break; case SDL_USEREVENT: - handle_key((uint32_t)(uintptr_t)event.user.data1, - (uint32_t)(uintptr_t)event.user.data2); + handle_keysym((uint32_t)(uintptr_t)event.user.data1); break; } } -void Window::handle_key(uint32_t scancode, uint32_t mod) +void Window::handle_keysym(uint32_t keysym) { - switch (scancode) + handle_keyval(get_keyval(keysym)); +} + +void Window::handle_keyval(uint32_t keyval) +{ + switch (keyval) { - case SDL_SCANCODE_ESCAPE: + case SDLK_ESCAPE: m_exit_requested = true; break; - case SDL_SCANCODE_0: + case '0': cursor_move(CURSOR_SOL); break; - case SDL_SCANCODE_9: + case '$': cursor_move(CURSOR_EOL); break; - case SDL_SCANCODE_H: + case 'h': cursor_move(CURSOR_LEFT); break; - case SDL_SCANCODE_J: + case 'j': cursor_move(CURSOR_DOWN); break; - case SDL_SCANCODE_K: + case 'k': cursor_move(CURSOR_UP); break; - case SDL_SCANCODE_L: + case 'l': cursor_move(CURSOR_RIGHT); break; - case SDL_SCANCODE_P: + case 'p': insertion_test(); break; - case SDL_SCANCODE_U: + case 'u': m_buffer->piece_table->undo(); redraw(); break; - case SDL_SCANCODE_I: + case 'i': m_buffer->piece_table->begin_insert(*m_cursor, true); break; - case SDL_SCANCODE_O: + case 'o': m_buffer->piece_table->insert_code_point('*'); redraw(); break; - case SDL_SCANCODE_A: + case 'a': m_buffer->piece_table->begin_insert(*m_cursor, false); break; } diff --git a/src/gui/Window.h b/src/gui/Window.h index 62f09dc..764465f 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -41,7 +41,8 @@ protected: void draw_crosshair(int screen_column, int screen_row); void colrow_to_xy(int col, int row, int * x, int * y); void handle_event(SDL_Event & event); - void handle_key(uint32_t scancode, uint32_t mod); + void handle_keysym(uint32_t keysym); + void handle_keyval(uint32_t keyval); void cursor_move(int which); std::pair calculate_start_position(); void draw_buffer();