diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 31a89a1..6b0300e 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -206,7 +206,7 @@ void Window::handle_event(Jtk_Event & event) handle_keysym(event.key.keysym.sym); } #endif - handle_keyval(event.key.key); + handle_keypress(event.key.key); break; case JTK_EVENT_KEY_RELEASE: @@ -256,9 +256,10 @@ void Window::handle_event(Jtk_Event & event) } } -void Window::handle_keyval(uint32_t keyval) +void Window::handle_keypress(uint32_t keyval) { - switch (keyval) + uint32_t keycode = keyval & JTK_KEY_KEYCODE_MASK; + switch (keyval & (JTK_KEY_KEYCODE_MASK | JTK_KEY_MODS_CTRL)) { case JTK_KEY_HOME: m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL); @@ -287,7 +288,7 @@ void Window::handle_keyval(uint32_t keyval) default: if (m_focused_buffer_pane->insert_mode()) { - if (keyval == '\033') + if (keycode == '\033') { if (m_focused_buffer_pane == m_command_buffer_pane) { @@ -300,9 +301,9 @@ void Window::handle_keyval(uint32_t keyval) m_focused_buffer_pane->exit_insert_mode(); } } - else if (keyval < 0xFFu) + else if (keycode < 0xFFu) { - if ((keyval == '\n') && (m_focused_buffer_pane == m_command_buffer_pane)) + if ((keycode == '\n') && (m_focused_buffer_pane == m_command_buffer_pane)) { EncodedString command = m_command_buffer->get_string(); m_command_buffer_pane->clear(); @@ -312,13 +313,13 @@ void Window::handle_keyval(uint32_t keyval) } else { - m_focused_buffer_pane->insert_code_point(keyval); + m_focused_buffer_pane->insert_code_point(keycode); } } } else { - switch (keyval) + switch (keyval & (JTK_KEY_KEYCODE_MASK | JTK_KEY_MODS_CTRL)) { case '0': m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL); @@ -381,22 +382,22 @@ void Window::handle_keyval(uint32_t keyval) case 'x': m_focused_buffer_pane->kill_character_at_cursor(); break; - case Keymod::CTRL + 'b': + case JTK_KEY_MODS_CTRL + 'b': m_focused_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); break; - case Keymod::CTRL + 'd': + case JTK_KEY_MODS_CTRL + 'd': m_focused_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN); break; - case Keymod::CTRL + 'e': + case JTK_KEY_MODS_CTRL + 'e': m_focused_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE); break; - case Keymod::CTRL + 'f': + case JTK_KEY_MODS_CTRL + 'f': m_focused_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); break; - case Keymod::CTRL + 'u': + case JTK_KEY_MODS_CTRL + 'u': m_focused_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN); break; - case Keymod::CTRL + 'y': + case JTK_KEY_MODS_CTRL + 'y': m_focused_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE); break; } diff --git a/src/gui/Window.h b/src/gui/Window.h index 2da7bb3..ba7c0f1 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -15,18 +15,6 @@ class BufferPane; class Window { public: - class Keymod - { - public: - enum : uint32_t - { - CTRL = 0x10000, - ALT = 0x20000, - SHIFT = 0x40000, - GUI = 0x80000, - }; - }; - enum class ScrollMode : uint8_t { ONE_LINE, @@ -56,7 +44,7 @@ protected: void resize(); void redraw(); void handle_event(Jtk_Event & event); - void handle_keyval(uint32_t keyval); + void handle_keypress(uint32_t keyval); #if 0 uint32_t get_keyval(SDL_Keycode keysym); uint32_t get_shifted(uint32_t keysym); diff --git a/src/gui/jtk/Jtk_event.cc b/src/gui/jtk/Jtk_event.cc index 131fc3e..8bab1bd 100644 --- a/src/gui/jtk/Jtk_event.cc +++ b/src/gui/jtk/Jtk_event.cc @@ -29,19 +29,6 @@ static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event) x_event_for_key_lookup.xkey.state &= ~ControlMask; if (XLookupString(&x_event_for_key_lookup.xkey, &buffer, 1, &keysym, nullptr) > 0) { - uint8_t mods = 0u; - if (x_event->xkey.state & ShiftMask) - { - mods |= JTK_KEY_MODS_SHIFT; - } - if (x_event->xkey.state & LockMask) - { - mods |= JTK_KEY_MODS_LOCK; - } - if (x_event->xkey.state & ControlMask) - { - mods |= JTK_KEY_MODS_CTRL; - } if (buffer == '\r') { event->key.key = '\n'; @@ -50,7 +37,6 @@ static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event) { event->key.key = buffer; } - event->key.mods = mods; } else { @@ -166,6 +152,21 @@ static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event) return false; } } + + /* OR in the modifier states */ + if (x_event->xkey.state & ShiftMask) + { + event->key.key |= JTK_KEY_MODS_SHIFT; + } + if (x_event->xkey.state & LockMask) + { + event->key.key |= JTK_KEY_MODS_LOCK; + } + if (x_event->xkey.state & ControlMask) + { + event->key.key |= JTK_KEY_MODS_CTRL; + } + return true; } diff --git a/src/gui/jtk/Jtk_event.h b/src/gui/jtk/Jtk_event.h index e889b43..d093226 100644 --- a/src/gui/jtk/Jtk_event.h +++ b/src/gui/jtk/Jtk_event.h @@ -15,7 +15,6 @@ typedef struct { uint32_t key; - uint8_t mods; } Jtk_KeyEvent; typedef struct diff --git a/src/gui/jtk/Jtk_keys.h b/src/gui/jtk/Jtk_keys.h index 3141d18..4902ce0 100644 --- a/src/gui/jtk/Jtk_keys.h +++ b/src/gui/jtk/Jtk_keys.h @@ -1,114 +1,118 @@ #ifndef JTK_KEYS_H #define JTK_KEYS_H -#define JTK_KEY_MODS_SHIFT 0x1u -#define JTK_KEY_MODS_LOCK 0x2u -#define JTK_KEY_MODS_CTRL 0x4u +#define JTK_KEY_MODS_MASK 0xFF000000u -#define JTK_KEY_F1 0xFF000001u -#define JTK_KEY_F2 0xFF000002u -#define JTK_KEY_F3 0xFF000003u -#define JTK_KEY_F4 0xFF000004u -#define JTK_KEY_F5 0xFF000005u -#define JTK_KEY_F6 0xFF000006u -#define JTK_KEY_F7 0xFF000007u -#define JTK_KEY_F8 0xFF000008u -#define JTK_KEY_F9 0xFF000009u -#define JTK_KEY_F10 0xFF00000Au -#define JTK_KEY_F11 0xFF00000Bu -#define JTK_KEY_F12 0xFF00000Cu -#define JTK_KEY_F13 0xFF00000Du -#define JTK_KEY_F14 0xFF00000Eu -#define JTK_KEY_F15 0xFF00000Fu -#define JTK_KEY_F16 0xFF000010u -#define JTK_KEY_F17 0xFF000011u -#define JTK_KEY_F18 0xFF000012u -#define JTK_KEY_F19 0xFF000013u -#define JTK_KEY_F20 0xFF000014u -#define JTK_KEY_F21 0xFF000015u -#define JTK_KEY_F22 0xFF000016u -#define JTK_KEY_F23 0xFF000017u -#define JTK_KEY_F24 0xFF000018u -#define JTK_KEY_F25 0xFF000019u -#define JTK_KEY_F26 0xFF00001Au -#define JTK_KEY_F27 0xFF00001Bu -#define JTK_KEY_F28 0xFF00001Cu -#define JTK_KEY_F29 0xFF00001Du -#define JTK_KEY_F30 0xFF00001Eu -#define JTK_KEY_F31 0xFF00001Fu +#define JTK_KEY_MODS_SHIFT 0x01000000u +#define JTK_KEY_MODS_LOCK 0x02000000u +#define JTK_KEY_MODS_CTRL 0x04000000u -#define JTK_KEY_SHIFT_L 0xFF000030u -#define JTK_KEY_SHIFT_R 0xFF000031u -#define JTK_KEY_CTRL_L 0xFF000032u -#define JTK_KEY_CTRL_R 0xFF000033u -#define JTK_KEY_CAPS_LOCK 0xFF000034u -#define JTK_KEY_SHIFT_LOCK 0xFF000035u +#define JTK_KEY_KEYCODE_MASK 0x00FFFFFFu -#define JTK_KEY_META_L 0xFF000036u -#define JTK_KEY_META_R 0xFF000037u -#define JTK_KEY_ALT_L 0xFF000038u -#define JTK_KEY_ALT_R 0xFF000039u -#define JTK_KEY_SUPER_L 0xFF00003Au -#define JTK_KEY_SUPER_R 0xFF00003Bu +#define JTK_KEY_F1 0x00FF0001u +#define JTK_KEY_F2 0x00FF0002u +#define JTK_KEY_F3 0x00FF0003u +#define JTK_KEY_F4 0x00FF0004u +#define JTK_KEY_F5 0x00FF0005u +#define JTK_KEY_F6 0x00FF0006u +#define JTK_KEY_F7 0x00FF0007u +#define JTK_KEY_F8 0x00FF0008u +#define JTK_KEY_F9 0x00FF0009u +#define JTK_KEY_F10 0x00FF000Au +#define JTK_KEY_F11 0x00FF000Bu +#define JTK_KEY_F12 0x00FF000Cu +#define JTK_KEY_F13 0x00FF000Du +#define JTK_KEY_F14 0x00FF000Eu +#define JTK_KEY_F15 0x00FF000Fu +#define JTK_KEY_F16 0x00FF0010u +#define JTK_KEY_F17 0x00FF0011u +#define JTK_KEY_F18 0x00FF0012u +#define JTK_KEY_F19 0x00FF0013u +#define JTK_KEY_F20 0x00FF0014u +#define JTK_KEY_F21 0x00FF0015u +#define JTK_KEY_F22 0x00FF0016u +#define JTK_KEY_F23 0x00FF0017u +#define JTK_KEY_F24 0x00FF0018u +#define JTK_KEY_F25 0x00FF0019u +#define JTK_KEY_F26 0x00FF001Au +#define JTK_KEY_F27 0x00FF001Bu +#define JTK_KEY_F28 0x00FF001Cu +#define JTK_KEY_F29 0x00FF001Du +#define JTK_KEY_F30 0x00FF001Eu +#define JTK_KEY_F31 0x00FF001Fu -#define JTK_KEY_HOME 0xFF00003Cu -#define JTK_KEY_LEFT 0xFF00003Du -#define JTK_KEY_UP 0xFF00003Eu -#define JTK_KEY_RIGHT 0xFF00003Fu -#define JTK_KEY_DOWN 0xFF000040u -#define JTK_KEY_PAGE_UP 0xFF000042u -#define JTK_KEY_PAGE_DOWN 0xFF000044u -#define JTK_KEY_END 0xFF000045u -#define JTK_KEY_BEGIN 0xFF000046u +#define JTK_KEY_SHIFT_L 0x00FF0030u +#define JTK_KEY_SHIFT_R 0x00FF0031u +#define JTK_KEY_CTRL_L 0x00FF0032u +#define JTK_KEY_CTRL_R 0x00FF0033u +#define JTK_KEY_CAPS_LOCK 0x00FF0034u +#define JTK_KEY_SHIFT_LOCK 0x00FF0035u -#define JTK_KEY_SELECT 0xFF000047u -#define JTK_KEY_PRINT 0xFF000048u -#define JTK_KEY_EXECUTE 0xFF000049u -#define JTK_KEY_INSERT 0xFF00004Au -#define JTK_KEY_UNDO 0xFF00004Bu -#define JTK_KEY_REDO 0xFF00004Cu -#define JTK_KEY_MENU 0xFF00004Du -#define JTK_KEY_FIND 0xFF00004Eu -#define JTK_KEY_CANCEL 0xFF00004Fu -#define JTK_KEY_HELP 0xFF000050u -#define JTK_KEY_BREAK 0xFF000051u -#define JTK_KEY_NUM_LOCK 0xFF000054u +#define JTK_KEY_META_L 0x00FF0036u +#define JTK_KEY_META_R 0x00FF0037u +#define JTK_KEY_ALT_L 0x00FF0038u +#define JTK_KEY_ALT_R 0x00FF0039u +#define JTK_KEY_SUPER_L 0x00FF003Au +#define JTK_KEY_SUPER_R 0x00FF003Bu -#define JTK_KEY_KP_SPACE 0xFF000055u -#define JTK_KEY_KP_TAB 0xFF000056u -#define JTK_KEY_KP_ENTER 0xFF000057u -#define JTK_KEY_KP_F1 0xFF000058u -#define JTK_KEY_KP_F2 0xFF000059u -#define JTK_KEY_KP_F3 0xFF00005Au -#define JTK_KEY_KP_F4 0xFF00005Bu -#define JTK_KEY_KP_HOME 0xFF00005Cu -#define JTK_KEY_KP_LEFT 0xFF00005Du -#define JTK_KEY_KP_UP 0xFF00005Eu -#define JTK_KEY_KP_RIGHT 0xFF00005Fu -#define JTK_KEY_KP_DOWN 0xFF000060u -#define JTK_KEY_KP_PAGE_UP 0xFF000062u -#define JTK_KEY_KP_PAGE_DOWN 0xFF000064u -#define JTK_KEY_KP_END 0xFF000065u -#define JTK_KEY_KP_BEGIN 0xFF000066u -#define JTK_KEY_KP_INSERT 0xFF000067u -#define JTK_KEY_KP_DELETE 0xFF000068u -#define JTK_KEY_KP_EQUAL 0xFF000069u -#define JTK_KEY_KP_MULTIPLY 0xFF00006Au -#define JTK_KEY_KP_ADD 0xFF00006Bu -#define JTK_KEY_KP_SEPARATOR 0xFF00006Cu -#define JTK_KEY_KP_SUBTRACT 0xFF00006Du -#define JTK_KEY_KP_DECIMAL 0xFF00006Eu -#define JTK_KEY_KP_DIVIDE 0xFF00006Fu +#define JTK_KEY_HOME 0x00FF003Cu +#define JTK_KEY_LEFT 0x00FF003Du +#define JTK_KEY_UP 0x00FF003Eu +#define JTK_KEY_RIGHT 0x00FF003Fu +#define JTK_KEY_DOWN 0x00FF0040u +#define JTK_KEY_PAGE_UP 0x00FF0042u +#define JTK_KEY_PAGE_DOWN 0x00FF0044u +#define JTK_KEY_END 0x00FF0045u +#define JTK_KEY_BEGIN 0x00FF0046u -#define JTK_KEY_KP_0 0xFF000070u -#define JTK_KEY_KP_1 0xFF000071u -#define JTK_KEY_KP_2 0xFF000072u -#define JTK_KEY_KP_3 0xFF000073u -#define JTK_KEY_KP_4 0xFF000074u -#define JTK_KEY_KP_5 0xFF000075u -#define JTK_KEY_KP_6 0xFF000076u -#define JTK_KEY_KP_7 0xFF000077u -#define JTK_KEY_KP_8 0xFF000078u -#define JTK_KEY_KP_9 0xFF000079u +#define JTK_KEY_SELECT 0x00FF0047u +#define JTK_KEY_PRINT 0x00FF0048u +#define JTK_KEY_EXECUTE 0x00FF0049u +#define JTK_KEY_INSERT 0x00FF004Au +#define JTK_KEY_UNDO 0x00FF004Bu +#define JTK_KEY_REDO 0x00FF004Cu +#define JTK_KEY_MENU 0x00FF004Du +#define JTK_KEY_FIND 0x00FF004Eu +#define JTK_KEY_CANCEL 0x00FF004Fu +#define JTK_KEY_HELP 0x00FF0050u +#define JTK_KEY_BREAK 0x00FF0051u +#define JTK_KEY_NUM_LOCK 0x00FF0054u + +#define JTK_KEY_KP_SPACE 0x00FF0055u +#define JTK_KEY_KP_TAB 0x00FF0056u +#define JTK_KEY_KP_ENTER 0x00FF0057u +#define JTK_KEY_KP_F1 0x00FF0058u +#define JTK_KEY_KP_F2 0x00FF0059u +#define JTK_KEY_KP_F3 0x00FF005Au +#define JTK_KEY_KP_F4 0x00FF005Bu +#define JTK_KEY_KP_HOME 0x00FF005Cu +#define JTK_KEY_KP_LEFT 0x00FF005Du +#define JTK_KEY_KP_UP 0x00FF005Eu +#define JTK_KEY_KP_RIGHT 0x00FF005Fu +#define JTK_KEY_KP_DOWN 0x00FF0060u +#define JTK_KEY_KP_PAGE_UP 0x00FF0062u +#define JTK_KEY_KP_PAGE_DOWN 0x00FF0064u +#define JTK_KEY_KP_END 0x00FF0065u +#define JTK_KEY_KP_BEGIN 0x00FF0066u +#define JTK_KEY_KP_INSERT 0x00FF0067u +#define JTK_KEY_KP_DELETE 0x00FF0068u +#define JTK_KEY_KP_EQUAL 0x00FF0069u +#define JTK_KEY_KP_MULTIPLY 0x00FF006Au +#define JTK_KEY_KP_ADD 0x00FF006Bu +#define JTK_KEY_KP_SEPARATOR 0x00FF006Cu +#define JTK_KEY_KP_SUBTRACT 0x00FF006Du +#define JTK_KEY_KP_DECIMAL 0x00FF006Eu +#define JTK_KEY_KP_DIVIDE 0x00FF006Fu + +#define JTK_KEY_KP_0 0x00FF0070u +#define JTK_KEY_KP_1 0x00FF0071u +#define JTK_KEY_KP_2 0x00FF0072u +#define JTK_KEY_KP_3 0x00FF0073u +#define JTK_KEY_KP_4 0x00FF0074u +#define JTK_KEY_KP_5 0x00FF0075u +#define JTK_KEY_KP_6 0x00FF0076u +#define JTK_KEY_KP_7 0x00FF0077u +#define JTK_KEY_KP_8 0x00FF0078u +#define JTK_KEY_KP_9 0x00FF0079u #endif