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 */
#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<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)
{
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;
}