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); handle_keysym(event.key.keysym.sym);
} }
#endif #endif
handle_keyval(event.key.key); handle_keypress(event.key.key);
break; break;
case JTK_EVENT_KEY_RELEASE: 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: case JTK_KEY_HOME:
m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL); m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL);
@ -287,7 +288,7 @@ void Window::handle_keyval(uint32_t keyval)
default: default:
if (m_focused_buffer_pane->insert_mode()) if (m_focused_buffer_pane->insert_mode())
{ {
if (keyval == '\033') if (keycode == '\033')
{ {
if (m_focused_buffer_pane == m_command_buffer_pane) 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(); 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(); EncodedString command = m_command_buffer->get_string();
m_command_buffer_pane->clear(); m_command_buffer_pane->clear();
@ -312,13 +313,13 @@ void Window::handle_keyval(uint32_t keyval)
} }
else else
{ {
m_focused_buffer_pane->insert_code_point(keyval); m_focused_buffer_pane->insert_code_point(keycode);
} }
} }
} }
else else
{ {
switch (keyval) switch (keyval & (JTK_KEY_KEYCODE_MASK | JTK_KEY_MODS_CTRL))
{ {
case '0': case '0':
m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL); m_focused_buffer_pane->cursor_move(BufferPane::CursorMovement::SOL);
@ -381,22 +382,22 @@ void Window::handle_keyval(uint32_t keyval)
case 'x': case 'x':
m_focused_buffer_pane->kill_character_at_cursor(); m_focused_buffer_pane->kill_character_at_cursor();
break; break;
case Keymod::CTRL + 'b': case JTK_KEY_MODS_CTRL + 'b':
m_focused_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); m_focused_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN);
break; break;
case Keymod::CTRL + 'd': case JTK_KEY_MODS_CTRL + 'd':
m_focused_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN); m_focused_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN);
break; break;
case Keymod::CTRL + 'e': case JTK_KEY_MODS_CTRL + 'e':
m_focused_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE); m_focused_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE);
break; break;
case Keymod::CTRL + 'f': case JTK_KEY_MODS_CTRL + 'f':
m_focused_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); m_focused_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN);
break; break;
case Keymod::CTRL + 'u': case JTK_KEY_MODS_CTRL + 'u':
m_focused_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN); m_focused_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN);
break; break;
case Keymod::CTRL + 'y': case JTK_KEY_MODS_CTRL + 'y':
m_focused_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE); m_focused_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE);
break; break;
} }

View File

@ -15,18 +15,6 @@ class BufferPane;
class Window class Window
{ {
public: public:
class Keymod
{
public:
enum : uint32_t
{
CTRL = 0x10000,
ALT = 0x20000,
SHIFT = 0x40000,
GUI = 0x80000,
};
};
enum class ScrollMode : uint8_t enum class ScrollMode : uint8_t
{ {
ONE_LINE, ONE_LINE,
@ -56,7 +44,7 @@ protected:
void resize(); void resize();
void redraw(); void redraw();
void handle_event(Jtk_Event & event); void handle_event(Jtk_Event & event);
void handle_keyval(uint32_t keyval); void handle_keypress(uint32_t keyval);
#if 0 #if 0
uint32_t get_keyval(SDL_Keycode keysym); uint32_t get_keyval(SDL_Keycode keysym);
uint32_t get_shifted(uint32_t 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; x_event_for_key_lookup.xkey.state &= ~ControlMask;
if (XLookupString(&x_event_for_key_lookup.xkey, &buffer, 1, &keysym, nullptr) > 0) 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') if (buffer == '\r')
{ {
event->key.key = '\n'; event->key.key = '\n';
@ -50,7 +37,6 @@ static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event)
{ {
event->key.key = buffer; event->key.key = buffer;
} }
event->key.mods = mods;
} }
else else
{ {
@ -166,6 +152,21 @@ static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event)
return false; 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; return true;
} }

View File

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

View File

@ -1,114 +1,118 @@
#ifndef JTK_KEYS_H #ifndef JTK_KEYS_H
#define JTK_KEYS_H #define JTK_KEYS_H
#define JTK_KEY_MODS_SHIFT 0x1u #define JTK_KEY_MODS_MASK 0xFF000000u
#define JTK_KEY_MODS_LOCK 0x2u
#define JTK_KEY_MODS_CTRL 0x4u
#define JTK_KEY_F1 0xFF000001u #define JTK_KEY_MODS_SHIFT 0x01000000u
#define JTK_KEY_F2 0xFF000002u #define JTK_KEY_MODS_LOCK 0x02000000u
#define JTK_KEY_F3 0xFF000003u #define JTK_KEY_MODS_CTRL 0x04000000u
#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_SHIFT_L 0xFF000030u #define JTK_KEY_KEYCODE_MASK 0x00FFFFFFu
#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_META_L 0xFF000036u #define JTK_KEY_F1 0x00FF0001u
#define JTK_KEY_META_R 0xFF000037u #define JTK_KEY_F2 0x00FF0002u
#define JTK_KEY_ALT_L 0xFF000038u #define JTK_KEY_F3 0x00FF0003u
#define JTK_KEY_ALT_R 0xFF000039u #define JTK_KEY_F4 0x00FF0004u
#define JTK_KEY_SUPER_L 0xFF00003Au #define JTK_KEY_F5 0x00FF0005u
#define JTK_KEY_SUPER_R 0xFF00003Bu #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_SHIFT_L 0x00FF0030u
#define JTK_KEY_LEFT 0xFF00003Du #define JTK_KEY_SHIFT_R 0x00FF0031u
#define JTK_KEY_UP 0xFF00003Eu #define JTK_KEY_CTRL_L 0x00FF0032u
#define JTK_KEY_RIGHT 0xFF00003Fu #define JTK_KEY_CTRL_R 0x00FF0033u
#define JTK_KEY_DOWN 0xFF000040u #define JTK_KEY_CAPS_LOCK 0x00FF0034u
#define JTK_KEY_PAGE_UP 0xFF000042u #define JTK_KEY_SHIFT_LOCK 0x00FF0035u
#define JTK_KEY_PAGE_DOWN 0xFF000044u
#define JTK_KEY_END 0xFF000045u
#define JTK_KEY_BEGIN 0xFF000046u
#define JTK_KEY_SELECT 0xFF000047u #define JTK_KEY_META_L 0x00FF0036u
#define JTK_KEY_PRINT 0xFF000048u #define JTK_KEY_META_R 0x00FF0037u
#define JTK_KEY_EXECUTE 0xFF000049u #define JTK_KEY_ALT_L 0x00FF0038u
#define JTK_KEY_INSERT 0xFF00004Au #define JTK_KEY_ALT_R 0x00FF0039u
#define JTK_KEY_UNDO 0xFF00004Bu #define JTK_KEY_SUPER_L 0x00FF003Au
#define JTK_KEY_REDO 0xFF00004Cu #define JTK_KEY_SUPER_R 0x00FF003Bu
#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_KP_SPACE 0xFF000055u #define JTK_KEY_HOME 0x00FF003Cu
#define JTK_KEY_KP_TAB 0xFF000056u #define JTK_KEY_LEFT 0x00FF003Du
#define JTK_KEY_KP_ENTER 0xFF000057u #define JTK_KEY_UP 0x00FF003Eu
#define JTK_KEY_KP_F1 0xFF000058u #define JTK_KEY_RIGHT 0x00FF003Fu
#define JTK_KEY_KP_F2 0xFF000059u #define JTK_KEY_DOWN 0x00FF0040u
#define JTK_KEY_KP_F3 0xFF00005Au #define JTK_KEY_PAGE_UP 0x00FF0042u
#define JTK_KEY_KP_F4 0xFF00005Bu #define JTK_KEY_PAGE_DOWN 0x00FF0044u
#define JTK_KEY_KP_HOME 0xFF00005Cu #define JTK_KEY_END 0x00FF0045u
#define JTK_KEY_KP_LEFT 0xFF00005Du #define JTK_KEY_BEGIN 0x00FF0046u
#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_KP_0 0xFF000070u #define JTK_KEY_SELECT 0x00FF0047u
#define JTK_KEY_KP_1 0xFF000071u #define JTK_KEY_PRINT 0x00FF0048u
#define JTK_KEY_KP_2 0xFF000072u #define JTK_KEY_EXECUTE 0x00FF0049u
#define JTK_KEY_KP_3 0xFF000073u #define JTK_KEY_INSERT 0x00FF004Au
#define JTK_KEY_KP_4 0xFF000074u #define JTK_KEY_UNDO 0x00FF004Bu
#define JTK_KEY_KP_5 0xFF000075u #define JTK_KEY_REDO 0x00FF004Cu
#define JTK_KEY_KP_6 0xFF000076u #define JTK_KEY_MENU 0x00FF004Du
#define JTK_KEY_KP_7 0xFF000077u #define JTK_KEY_FIND 0x00FF004Eu
#define JTK_KEY_KP_8 0xFF000078u #define JTK_KEY_CANCEL 0x00FF004Fu
#define JTK_KEY_KP_9 0xFF000079u #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 #endif