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 */
|
/** 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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user