From 7aa3c3b17f2a01c949cecf75c74adda346b55608 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 4 Jan 2018 15:33:58 -0500 Subject: [PATCH] Add an insert-mode default command map --- src/core/DefaultCommandMap.cc | 27 +++++++++++++++++++- src/core/DefaultCommandMap.h | 6 +++++ src/gui/Window.cc | 48 +++++++++++++---------------------- src/gui/Window.h | 1 + 4 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/core/DefaultCommandMap.cc b/src/core/DefaultCommandMap.cc index bbd7759..a64e53d 100644 --- a/src/core/DefaultCommandMap.cc +++ b/src/core/DefaultCommandMap.cc @@ -2,8 +2,9 @@ #include "keys.h" std::shared_ptr g_DefaultCommandMap; +std::shared_ptr g_DefaultInsertModeCommandMap; -void DefaultCommandMap::build() +static void build_command_mode() { g_DefaultCommandMap = std::make_shared(); CommandMap * dcm = &*g_DefaultCommandMap; @@ -71,3 +72,27 @@ void DefaultCommandMap::build() dcm->add({JES_KEY_DOWN}, Command::GO_DOWN, nullptr, false); dcm->add({JES_KEY_RIGHT}, Command::GO_RIGHT, nullptr, false); } + +static void build_insert_mode() +{ + g_DefaultInsertModeCommandMap = std::make_shared(); + CommandMap * dcm = &*g_DefaultInsertModeCommandMap; + + dcm->add({JES_KEY_HOME}, Command::GO_START_OF_LINE, nullptr, false); + dcm->add({JES_KEY_MODS_CTRL + JES_KEY_HOME}, Command::GO_START_OF_FILE, nullptr, false); + dcm->add({JES_KEY_END}, Command::GO_END_OF_LINE, nullptr, false); + dcm->add({JES_KEY_MODS_CTRL + JES_KEY_END}, Command::GO_END_OF_FILE, nullptr, false); + dcm->add({JES_KEY_PAGE_UP}, Command::SCROLL_WINDOW_UP_WHOLE_SCREEN, nullptr, false); + dcm->add({JES_KEY_PAGE_DOWN}, Command::SCROLL_WINDOW_DOWN_WHOLE_SCREEN, nullptr, false); + + dcm->add({JES_KEY_UP}, Command::GO_UP, nullptr, false); + dcm->add({JES_KEY_LEFT}, Command::GO_LEFT, nullptr, false); + dcm->add({JES_KEY_DOWN}, Command::GO_DOWN, nullptr, false); + dcm->add({JES_KEY_RIGHT}, Command::GO_RIGHT, nullptr, false); +} + +void DefaultCommandMap::build() +{ + build_command_mode(); + build_insert_mode(); +} diff --git a/src/core/DefaultCommandMap.h b/src/core/DefaultCommandMap.h index ea0547e..2819650 100644 --- a/src/core/DefaultCommandMap.h +++ b/src/core/DefaultCommandMap.h @@ -4,6 +4,7 @@ #include "CommandMap.h" extern std::shared_ptr g_DefaultCommandMap; +extern std::shared_ptr g_DefaultInsertModeCommandMap; class DefaultCommandMap { @@ -14,6 +15,11 @@ public: { return g_DefaultCommandMap; } + + static std::shared_ptr get_insert_mode() + { + return g_DefaultInsertModeCommandMap; + } }; #endif diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 2cfca3e..1366e71 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -246,40 +246,14 @@ void Window::handle_keypress(uint32_t keyval) change_focus(m_buffer_pane); handle_command(command); } - else if (ctrl_keyval <= 0xFFu) + else if (check_insert_mode_command(ctrl_keyval)) + { + /* Command was handled, don't do anything else. */ + } + else if ((ctrl_keyval & JES_KEY_MODS_CTRL) == 0u) { m_focused_buffer_pane->insert_code_point(ctrl_keyval); } - else - { - switch (ctrl_keyval) - { - case JES_KEY_HOME: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL, 0u); - break; - case JES_KEY_END: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::EOL, 0u); - break; - case JES_KEY_RIGHT: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::RIGHT, 0u); - break; - case JES_KEY_LEFT: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::LEFT, 0u); - break; - case JES_KEY_DOWN: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::DOWN, 0u); - break; - case JES_KEY_UP: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::UP, 0u); - break; - case JES_KEY_PAGE_UP: - m_focused_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); - break; - case JES_KEY_PAGE_DOWN: - m_focused_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); - break; - } - } } else { @@ -314,6 +288,18 @@ void Window::evaluate_command_input() } } +bool Window::check_insert_mode_command(uint32_t insert_mode_command) +{ + auto cm = DefaultCommandMap::get_insert_mode(); + Command command; + if (cm->lookup_command(&insert_mode_command, 1u, command) == CommandMap::COMMAND_COMPLETE) + { + execute_command(command); + return true; + } + return false; +} + void Window::execute_command(const Command & command) { switch (command.main.id) diff --git a/src/gui/Window.h b/src/gui/Window.h index f29d0b5..d91a457 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -50,6 +50,7 @@ protected: void set_window_icon(); void handle_command(const EncodedString & command); void evaluate_command_input(); + bool check_insert_mode_command(uint32_t insert_mode_command); void execute_command(const Command & command); void draw_command_input();