Jtk: encode key modifiers in key value field for keyboard events

This commit is contained in:
Josh Holtrop 2017-10-01 17:00:06 -04:00
parent 15fcaa80fa
commit 486253d0b6
5 changed files with 137 additions and 144 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -15,7 +15,6 @@
typedef struct
{
uint32_t key;
uint8_t mods;
} Jtk_KeyEvent;
typedef struct

View File

@ -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