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