Query for X modifier state when needed

This commit is contained in:
Josh Holtrop 2017-10-05 20:16:46 -04:00
parent 4e3050dbec
commit 07cdc5f8d0

View File

@ -12,8 +12,6 @@
/** Do not wait longer than 100ms */ /** Do not wait longer than 100ms */
#define MAX_WAIT_TIME 100000u #define MAX_WAIT_TIME 100000u
/** Hold a copy of the last-seen keyboard modifier state. */
static unsigned int g_x_state;
static std::unordered_map<unsigned int, size_t> g_repeating_keys; static std::unordered_map<unsigned int, size_t> g_repeating_keys;
static std::unordered_map<size_t, unsigned int> g_key_repeat_timers; static std::unordered_map<size_t, unsigned int> g_key_repeat_timers;
@ -29,6 +27,15 @@ static void StopKeyRepeat(unsigned int x_keycode)
} }
} }
static unsigned int GetXState()
{
Window win;
int i;
unsigned int state;
XQueryPointer(g_display, RootWindow(g_display, DefaultScreen(g_display)), &win, &win, &i, &i, &i, &i, &state);
return state;
}
static uint32_t XKeyToJtkKey(unsigned int x_keycode) static uint32_t XKeyToJtkKey(unsigned int x_keycode)
{ {
XKeyEvent x_key_event; XKeyEvent x_key_event;
@ -36,7 +43,8 @@ static uint32_t XKeyToJtkKey(unsigned int x_keycode)
x_key_event.display = g_display; x_key_event.display = g_display;
/* Turn off the ControlMask bit for looking up keys. We'll handle control /* Turn off the ControlMask bit for looking up keys. We'll handle control
* keys ourselves. */ * keys ourselves. */
x_key_event.state = g_x_state & ~ControlMask; unsigned int x_state = GetXState();
x_key_event.state = x_state & ~ControlMask;
x_key_event.keycode = x_keycode; x_key_event.keycode = x_keycode;
char buffer; char buffer;
KeySym keysym; KeySym keysym;
@ -166,15 +174,15 @@ static uint32_t XKeyToJtkKey(unsigned int x_keycode)
} }
/* OR in the modifier states */ /* OR in the modifier states */
if (g_x_state & ShiftMask) if (x_state & ShiftMask)
{ {
key |= JTK_KEY_MODS_SHIFT; key |= JTK_KEY_MODS_SHIFT;
} }
if (g_x_state & LockMask) if (x_state & LockMask)
{ {
key |= JTK_KEY_MODS_LOCK; key |= JTK_KEY_MODS_LOCK;
} }
if (g_x_state & ControlMask) if (x_state & ControlMask)
{ {
key |= JTK_KEY_MODS_CTRL; key |= JTK_KEY_MODS_CTRL;
} }
@ -221,7 +229,6 @@ static bool IsRepeatKey(Display * display, XEvent * event)
static bool ProcessXKeyPressEvent(XEvent * x_event, Jtk_Event * event) static bool ProcessXKeyPressEvent(XEvent * x_event, Jtk_Event * event)
{ {
unsigned int x_keycode = x_event->xkey.keycode; unsigned int x_keycode = x_event->xkey.keycode;
g_x_state = x_event->xkey.state;
event->type = JTK_EVENT_KEY_PRESS; event->type = JTK_EVENT_KEY_PRESS;
event->key.repeat = false; event->key.repeat = false;
event->key.key = XKeyToJtkKey(x_keycode); event->key.key = XKeyToJtkKey(x_keycode);
@ -243,7 +250,6 @@ static bool ProcessXKeyReleaseEvent(XEvent * x_event, Jtk_Event * event)
{ {
return false; return false;
} }
g_x_state = x_event->xkey.state;
StopKeyRepeat(x_event->xkey.keycode); StopKeyRepeat(x_event->xkey.keycode);
return false; return false;
} }