handle keys based on code point with modifier flags
This commit is contained in:
parent
fa752fefde
commit
827f4efdd9
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user