handle keys based on code point with modifier flags

This commit is contained in:
Josh Holtrop 2016-10-29 01:51:16 -04:00
parent fa752fefde
commit 827f4efdd9
2 changed files with 27 additions and 28 deletions

View File

@ -9,7 +9,7 @@
struct struct
{ {
SDL_TimerID timer_id; SDL_TimerID timer_id;
Uint16 mod; SDL_Keycode keysym;
bool pressed; bool pressed;
} Key_Statuses[SDL_NUM_SCANCODES]; } Key_Statuses[SDL_NUM_SCANCODES];
@ -178,8 +178,8 @@ Uint32 Key_Repeat(Uint32 interval, void * param)
SDL_Event event; SDL_Event event;
event.user.code = 0; event.user.code = 0;
event.user.data1 = param; event.user.data1 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].keysym;
event.user.data2 = (void *)(uintptr_t)Key_Statuses[(uintptr_t)param].mod; event.user.data2 = nullptr;
event.type = SDL_USEREVENT; event.type = SDL_USEREVENT;
SDL_PushEvent(&event); SDL_PushEvent(&event);
@ -205,23 +205,17 @@ void Window::handle_event(SDL_Event & event)
case SDL_KEYDOWN: case SDL_KEYDOWN:
m_keymod = event.key.keysym.mod; m_keymod = event.key.keysym.mod;
{
uint32_t keyval = get_keyval(event.key.keysym.sym);
}
if (event.key.repeat == 0) if (event.key.repeat == 0)
{ {
Key_Statuses[event.key.keysym.scancode].pressed = true; 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].timer_id = SDL_AddTimer(200, Key_Repeat, (void *)event.key.keysym.scancode);
Key_Statuses[event.key.keysym.scancode].mod = event.key.keysym.mod; handle_keysym(event.key.keysym.sym);
handle_key(event.key.keysym.scancode, event.key.keysym.mod);
} }
break; break;
case SDL_KEYUP: case SDL_KEYUP:
m_keymod = event.key.keysym.mod; m_keymod = event.key.keysym.mod;
{
uint32_t keyval = get_keyval(event.key.keysym.sym);
}
Key_Statuses[event.key.keysym.scancode].pressed = false; Key_Statuses[event.key.keysym.scancode].pressed = false;
if (Key_Statuses[event.key.keysym.scancode].timer_id != 0) if (Key_Statuses[event.key.keysym.scancode].timer_id != 0)
{ {
@ -244,52 +238,56 @@ void Window::handle_event(SDL_Event & event)
break; break;
case SDL_USEREVENT: case SDL_USEREVENT:
handle_key((uint32_t)(uintptr_t)event.user.data1, handle_keysym((uint32_t)(uintptr_t)event.user.data1);
(uint32_t)(uintptr_t)event.user.data2);
break; 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)
{ {
case SDL_SCANCODE_ESCAPE: switch (keyval)
{
case SDLK_ESCAPE:
m_exit_requested = true; m_exit_requested = true;
break; break;
case SDL_SCANCODE_0: case '0':
cursor_move(CURSOR_SOL); cursor_move(CURSOR_SOL);
break; break;
case SDL_SCANCODE_9: case '$':
cursor_move(CURSOR_EOL); cursor_move(CURSOR_EOL);
break; break;
case SDL_SCANCODE_H: case 'h':
cursor_move(CURSOR_LEFT); cursor_move(CURSOR_LEFT);
break; break;
case SDL_SCANCODE_J: case 'j':
cursor_move(CURSOR_DOWN); cursor_move(CURSOR_DOWN);
break; break;
case SDL_SCANCODE_K: case 'k':
cursor_move(CURSOR_UP); cursor_move(CURSOR_UP);
break; break;
case SDL_SCANCODE_L: case 'l':
cursor_move(CURSOR_RIGHT); cursor_move(CURSOR_RIGHT);
break; break;
case SDL_SCANCODE_P: case 'p':
insertion_test(); insertion_test();
break; break;
case SDL_SCANCODE_U: case 'u':
m_buffer->piece_table->undo(); m_buffer->piece_table->undo();
redraw(); redraw();
break; break;
case SDL_SCANCODE_I: case 'i':
m_buffer->piece_table->begin_insert(*m_cursor, true); m_buffer->piece_table->begin_insert(*m_cursor, true);
break; break;
case SDL_SCANCODE_O: case 'o':
m_buffer->piece_table->insert_code_point('*'); m_buffer->piece_table->insert_code_point('*');
redraw(); redraw();
break; break;
case SDL_SCANCODE_A: case 'a':
m_buffer->piece_table->begin_insert(*m_cursor, false); m_buffer->piece_table->begin_insert(*m_cursor, false);
break; break;
} }

View File

@ -41,7 +41,8 @@ protected:
void draw_crosshair(int screen_column, int screen_row); void draw_crosshair(int screen_column, int screen_row);
void colrow_to_xy(int col, int row, int * x, int * y); void colrow_to_xy(int col, int row, int * x, int * y);
void handle_event(SDL_Event & event); 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); void cursor_move(int which);
std::pair<int, PieceTable::Cursor> calculate_start_position(); std::pair<int, PieceTable::Cursor> calculate_start_position();
void draw_buffer(); void draw_buffer();