diff --git a/src/core/Command.h b/src/core/Command.h index 251e649..31a2010 100644 --- a/src/core/Command.h +++ b/src/core/Command.h @@ -22,21 +22,33 @@ public: YANK_MOTION, YANK_LINE, UNDO, + REDO, ENTER_INSERT_MODE, ENTER_INSERT_MODE_NEXT_LINE, ENTER_INSERT_MODE_AFTER_CHAR, + ENTER_INSERT_MODE_AFTER_LINE, + ENTER_INSERT_MODE_START_OF_LINE, + ENTER_INSERT_MODE_NEW_LINE_BEFORE, + ENTER_INSERT_MODE_NEW_LINE_AFTER, PUT, PUT_BEFORE, CHANGE_CHAR, GO_TO_LINE, + GO_TO_LAST_LINE, GO_LEFT, GO_DOWN, GO_UP, GO_RIGHT, - NEXT, - PREV, GO_START_OF_LINE, GO_END_OF_LINE, + NEXT, + PREV, + SCROLL_WINDOW_UP_ONE_LINE, + SCROLL_WINDOW_DOWN_ONE_LINE, + SCROLL_WINDOW_UP_HALF_SCREEN, + SCROLL_WINDOW_DOWN_HALF_SCREEN, + SCROLL_WINDOW_UP_WHOLE_SCREEN, + SCROLL_WINDOW_DOWN_WHOLE_SCREN, COMMAND_COUNT, }; diff --git a/src/gui/Window.cc b/src/gui/Window.cc index ced9dc1..d3aaf44 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -6,6 +6,7 @@ #include "jes_icon-32x32.h" #include #include +#include "DefaultCommandMap.h" #define INITIAL_WIDTH 800 #define INITIAL_HEIGHT 800 @@ -215,150 +216,210 @@ void Window::handle_event(Jtk_Event & event) void Window::handle_keypress(uint32_t keyval) { + uint32_t ctrl_keyval = keyval & (JTK_KEY_KEYCODE_MASK | JTK_KEY_MODS_CTRL); uint32_t keycode = keyval & JTK_KEY_KEYCODE_MASK; - switch (keyval & (JTK_KEY_KEYCODE_MASK | JTK_KEY_MODS_CTRL)) + if (m_focused_buffer_pane->insert_mode()) { - case JTK_KEY_HOME: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL); - break; - case JTK_KEY_END: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::EOL); - break; - case JTK_KEY_RIGHT: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::RIGHT); - break; - case JTK_KEY_LEFT: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::LEFT); - break; - case JTK_KEY_DOWN: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::DOWN); - break; - case JTK_KEY_UP: - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::UP); - break; - case JTK_KEY_PAGE_UP: - m_focused_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); - break; - case JTK_KEY_PAGE_DOWN: - m_focused_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); - break; - default: - if (m_focused_buffer_pane->insert_mode()) + if (keycode == '\033') { - if (keycode == '\033') + if (m_focused_buffer_pane == m_command_buffer_pane) { - if (m_focused_buffer_pane == m_command_buffer_pane) - { - m_command_buffer_pane->clear(); - m_command_buffer_screen_rows = 1; - change_focus(m_buffer_pane); - } - else - { - m_focused_buffer_pane->exit_insert_mode(); - } + m_command_buffer_pane->clear(); + m_command_buffer_screen_rows = 1; + change_focus(m_buffer_pane); } - else if (keycode < 0xFFu) + else { - if ((keycode == '\n') && (m_focused_buffer_pane == m_command_buffer_pane)) - { - EncodedString command = m_command_buffer->get_string(); - m_command_buffer_pane->clear(); - m_command_buffer_screen_rows = 1; - change_focus(m_buffer_pane); - handle_command(command); - } - else - { - m_focused_buffer_pane->insert_code_point(keycode); - } + m_focused_buffer_pane->exit_insert_mode(); } } + else if ((keycode == '\n') && (m_focused_buffer_pane == m_command_buffer_pane)) + { + EncodedString command = m_command_buffer->get_string(); + m_command_buffer_pane->clear(); + m_command_buffer_screen_rows = 1; + change_focus(m_buffer_pane); + handle_command(command); + } + else if (ctrl_keyval <= 0xFFu) + { + m_focused_buffer_pane->insert_code_point(ctrl_keyval); + } else { - switch (keyval & (JTK_KEY_KEYCODE_MASK | JTK_KEY_MODS_CTRL)) + switch (ctrl_keyval) { - case '0': + case JTK_KEY_HOME: m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL); break; - case '$': + case JTK_KEY_END: m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::EOL); break; - case ':': - m_command_buffer_pane->clear(); - change_focus(m_command_buffer_pane); - break; - case 'A': - m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_LINE); - break; - case 'G': - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::LAST_LINE); - break; - case 'I': - m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_LINE); - break; - case 'J': - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SCREEN_ROW_DOWN); - break; - case 'K': - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SCREEN_ROW_UP); - break; - case 'O': - m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_BEFORE); - break; - case 'a': - m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_CHAR); - break; - case 'g': - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::FIRST_LINE); - break; - case 'h': - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::LEFT); - break; - case 'i': - m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_CHAR); - break; - case 'j': - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::DOWN); - break; - case 'k': - m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::UP); - break; - case 'l': + case JTK_KEY_RIGHT: m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::RIGHT); break; - case 'o': - m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_AFTER); + case JTK_KEY_LEFT: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::LEFT); break; - case 'r': - m_focused_buffer_pane->redo(); + case JTK_KEY_DOWN: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::DOWN); break; - case 'u': - m_focused_buffer_pane->undo(); + case JTK_KEY_UP: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::UP); break; - case 'x': - m_focused_buffer_pane->kill_character_at_cursor(); - break; - case JTK_KEY_MODS_CTRL + 'b': + case JTK_KEY_PAGE_UP: m_focused_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); break; - case JTK_KEY_MODS_CTRL + 'd': - m_focused_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN); - break; - case JTK_KEY_MODS_CTRL + 'e': - m_focused_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE); - break; - case JTK_KEY_MODS_CTRL + 'f': + case JTK_KEY_PAGE_DOWN: m_focused_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); break; - case JTK_KEY_MODS_CTRL + 'u': - m_focused_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN); - break; - case JTK_KEY_MODS_CTRL + 'y': - m_focused_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE); - break; } } + } + else + { + if ((keycode == '\033') || (keycode == '\b')) + { + m_command_input.clear(); + m_command_invalid = false; + } + else if (keycode == ':') + { + m_command_buffer_pane->clear(); + change_focus(m_command_buffer_pane); + } + else + { + m_command_input.push_back(ctrl_keyval); + evaluate_command_input(); + } + } +} + +void Window::evaluate_command_input() +{ + auto cm = DefaultCommandMap::get(); + Command command; + switch (cm->lookup_command(&m_command_input[0], m_command_input.size(), command)) + { + case CommandMap::COMMAND_INVALID: + m_command_invalid = true; + break; + case CommandMap::COMMAND_INCOMPLETE: + break; + case CommandMap::COMMAND_COMPLETE: + execute_command(command); + m_command_input.clear(); + break; + } +} + +void Window::execute_command(const Command & command) +{ + switch (command.main.id) + { + case Command::GO_FORWARD_UP_TO_CHAR: + break; + case Command::GO_FORWARD_ON_TO_CHAR: + break; + case Command::GO_BACK_UP_TO_CHAR: + break; + case Command::GO_BACK_ON_TO_CHAR: + break; + case Command::DELETE_MOTION: + break; + case Command::DELETE_LINE: + break; + case Command::DELETE_CHAR: + m_focused_buffer_pane->kill_character_at_cursor(); + break; + case Command::DELETE_CHAR_BACK: + break; + case Command::CHANGE_MOTION: + break; + case Command::CHANGE_LINE: + break; + case Command::YANK_MOTION: + break; + case Command::YANK_LINE: + break; + case Command::UNDO: + m_focused_buffer_pane->undo(); + break; + case Command::REDO: + m_focused_buffer_pane->redo(); + break; + case Command::ENTER_INSERT_MODE: + m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_CHAR); + break; + case Command::ENTER_INSERT_MODE_NEXT_LINE: + break; + case Command::ENTER_INSERT_MODE_AFTER_CHAR: + m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_CHAR); + break; + case Command::ENTER_INSERT_MODE_AFTER_LINE: + m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::END_OF_LINE); + break; + case Command::ENTER_INSERT_MODE_START_OF_LINE: + m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::START_OF_LINE); + break; + case Command::ENTER_INSERT_MODE_NEW_LINE_BEFORE: + m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_BEFORE); + break; + case Command::ENTER_INSERT_MODE_NEW_LINE_AFTER: + m_focused_buffer_pane->enter_insert_mode(EnterInsertModeMode::NEW_LINE_AFTER); + break; + case Command::PUT: + break; + case Command::PUT_BEFORE: + break; + case Command::CHANGE_CHAR: + break; + case Command::GO_TO_LINE: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::FIRST_LINE); + break; + case Command::GO_TO_LAST_LINE: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::LAST_LINE); + break; + case Command::GO_LEFT: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::LEFT); + break; + case Command::GO_DOWN: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::DOWN); + break; + case Command::GO_UP: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::UP); + break; + case Command::GO_RIGHT: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::RIGHT); + break; + case Command::GO_START_OF_LINE: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL); + break; + case Command::GO_END_OF_LINE: + m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::EOL); + break; + case Command::NEXT: + break; + case Command::PREV: + break; + case Command::SCROLL_WINDOW_UP_ONE_LINE: + m_focused_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE); + break; + case Command::SCROLL_WINDOW_DOWN_ONE_LINE: + m_focused_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE); + break; + case Command::SCROLL_WINDOW_UP_HALF_SCREEN: + m_focused_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN); + break; + case Command::SCROLL_WINDOW_DOWN_HALF_SCREEN: + m_focused_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN); + break; + case Command::SCROLL_WINDOW_UP_WHOLE_SCREEN: + m_focused_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); + break; + case Command::SCROLL_WINDOW_DOWN_WHOLE_SCREN: + m_focused_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); break; } } diff --git a/src/gui/Window.h b/src/gui/Window.h index cbfb660..8af83b6 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -3,12 +3,14 @@ #include #include +#include #include "Font.h" #include "Buffer.h" #include "GL.h" #include "EncodedString.h" #include "CommandParser.h" #include "Jtk.h" +#include "Command.h" class BufferPane; @@ -40,7 +42,6 @@ public: std::shared_ptr gl() const { return m_gl; } protected: - void resize(size_t width, size_t height); void redraw(); void handle_event(Jtk_Event & event); @@ -48,6 +49,8 @@ protected: void change_focus(std::shared_ptr buffer_pane); void set_window_icon(); void handle_command(const EncodedString & command); + void evaluate_command_input(); + void execute_command(const Command & command); void command_write_file(const CommandParser & cp); void command_quit(const CommandParser & cp); @@ -68,6 +71,8 @@ protected: std::shared_ptr m_focused_buffer_pane; std::shared_ptr m_command_buffer; std::shared_ptr m_command_buffer_pane; + std::vector m_command_input; + bool m_command_invalid; }; #endif