diff --git a/src/gui/jtk/Jtk_event.cc b/src/gui/jtk/Jtk_event.cc index cb1231e..bf8ac3d 100644 --- a/src/gui/jtk/Jtk_event.cc +++ b/src/gui/jtk/Jtk_event.cc @@ -12,8 +12,6 @@ /** Do not wait longer than 100ms */ #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 g_repeating_keys; static std::unordered_map 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) { XKeyEvent x_key_event; @@ -36,7 +43,8 @@ static uint32_t XKeyToJtkKey(unsigned int x_keycode) x_key_event.display = g_display; /* Turn off the ControlMask bit for looking up keys. We'll handle control * 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; char buffer; KeySym keysym; @@ -166,15 +174,15 @@ static uint32_t XKeyToJtkKey(unsigned int x_keycode) } /* OR in the modifier states */ - if (g_x_state & ShiftMask) + if (x_state & ShiftMask) { key |= JTK_KEY_MODS_SHIFT; } - if (g_x_state & LockMask) + if (x_state & LockMask) { key |= JTK_KEY_MODS_LOCK; } - if (g_x_state & ControlMask) + if (x_state & ControlMask) { 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) { unsigned int x_keycode = x_event->xkey.keycode; - g_x_state = x_event->xkey.state; event->type = JTK_EVENT_KEY_PRESS; event->key.repeat = false; event->key.key = XKeyToJtkKey(x_keycode); @@ -243,7 +250,6 @@ static bool ProcessXKeyReleaseEvent(XEvent * x_event, Jtk_Event * event) { return false; } - g_x_state = x_event->xkey.state; StopKeyRepeat(x_event->xkey.keycode); return false; }