From 314b39b81a2ca94298b1f78e3866f75f9db90d07 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 5 Jan 2017 21:05:46 -0500 Subject: [PATCH] allow home/end/arrow keys to move cursor in command or insert mode --- src/gui/Window.cc | 183 ++++++++++++++++++++++++++-------------------- 1 file changed, 103 insertions(+), 80 deletions(-) diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 2afd635..9070d89 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -237,91 +237,114 @@ void Window::handle_keysym(uint32_t keysym) void Window::handle_keyval(uint32_t keyval) { - if (m_buffer_pane->insert_mode()) + switch (keyval) { - if (keyval == '\033') + case SDLK_HOME: + m_buffer_pane->cursor_move(CursorMovement::SOL); + break; + case SDLK_END: + m_buffer_pane->cursor_move(CursorMovement::EOL); + break; + case SDLK_RIGHT: + m_buffer_pane->cursor_move(CursorMovement::RIGHT); + break; + case SDLK_LEFT: + m_buffer_pane->cursor_move(CursorMovement::LEFT); + break; + case SDLK_DOWN: + m_buffer_pane->cursor_move(CursorMovement::DOWN); + break; + case SDLK_UP: + m_buffer_pane->cursor_move(CursorMovement::UP); + break; + default: + if (m_buffer_pane->insert_mode()) { - m_buffer_pane->exit_insert_mode(); + if (keyval == '\033') + { + m_buffer_pane->exit_insert_mode(); + } + else if (keyval < 0xFFu) + { + m_buffer_pane->insert_code_point(keyval); + } } - else if (keyval < 0xFFu) + else { - m_buffer_pane->insert_code_point(keyval); - } - } - else - { - switch (keyval) - { - case '0': - m_buffer_pane->cursor_move(CursorMovement::SOL); - break; - case '$': - m_buffer_pane->cursor_move(CursorMovement::EOL); - break; - case 'A': - m_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_LINE); - break; - case 'G': - m_buffer_pane->cursor_move(CursorMovement::LAST_LINE); - break; - case 'I': - m_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_LINE); - break; - case 'O': - m_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_BEFORE); - break; - case 'a': - m_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_CHAR); - break; - case 'g': - m_buffer_pane->cursor_move(CursorMovement::FIRST_LINE); - break; - case 'h': - m_buffer_pane->cursor_move(CursorMovement::LEFT); - break; - case 'i': - m_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_CHAR); - break; - case 'j': - m_buffer_pane->cursor_move(CursorMovement::DOWN); - break; - case 'k': - m_buffer_pane->cursor_move(CursorMovement::UP); - break; - case 'l': - m_buffer_pane->cursor_move(CursorMovement::RIGHT); - break; - case 'o': - m_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_AFTER); - break; - case 'x': - m_buffer_pane->kill_character_at_cursor(); - break; - case Keymod::CTRL + 'b': - m_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); - break; - case Keymod::CTRL + 'd': - m_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN); - break; - case Keymod::CTRL + 'e': - m_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE); - break; - case Keymod::CTRL + 'f': - m_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); - break; - case Keymod::CTRL + 'u': - m_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN); - break; - case Keymod::CTRL + 'w': - m_buffer_pane->write_file(); - break; - case Keymod::CTRL + 'y': - m_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE); - break; - case Keymod::CTRL + 'q': - m_exit_requested = true; - break; + switch (keyval) + { + case '0': + m_buffer_pane->cursor_move(CursorMovement::SOL); + break; + case '$': + m_buffer_pane->cursor_move(CursorMovement::EOL); + break; + case 'A': + m_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_LINE); + break; + case 'G': + m_buffer_pane->cursor_move(CursorMovement::LAST_LINE); + break; + case 'I': + m_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_LINE); + break; + case 'O': + m_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_BEFORE); + break; + case 'a': + m_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_CHAR); + break; + case 'g': + m_buffer_pane->cursor_move(CursorMovement::FIRST_LINE); + break; + case 'h': + m_buffer_pane->cursor_move(CursorMovement::LEFT); + break; + case 'i': + m_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_CHAR); + break; + case 'j': + m_buffer_pane->cursor_move(CursorMovement::DOWN); + break; + case 'k': + m_buffer_pane->cursor_move(CursorMovement::UP); + break; + case 'l': + m_buffer_pane->cursor_move(CursorMovement::RIGHT); + break; + case 'o': + m_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_AFTER); + break; + case 'x': + m_buffer_pane->kill_character_at_cursor(); + break; + case Keymod::CTRL + 'b': + m_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); + break; + case Keymod::CTRL + 'd': + m_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN); + break; + case Keymod::CTRL + 'e': + m_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE); + break; + case Keymod::CTRL + 'f': + m_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); + break; + case Keymod::CTRL + 'u': + m_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN); + break; + case Keymod::CTRL + 'w': + m_buffer_pane->write_file(); + break; + case Keymod::CTRL + 'y': + m_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE); + break; + case Keymod::CTRL + 'q': + m_exit_requested = true; + break; + } } + break; } }