Query for X modifier state when needed
This commit is contained in:
parent
4e3050dbec
commit
07cdc5f8d0
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user