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
{
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;
}

View File

@ -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<int, PieceTable::Cursor> calculate_start_position();
void draw_buffer();