Filter out repeated key presses
This commit is contained in:
parent
035f5805ad
commit
f424fd573d
@ -158,6 +158,34 @@ static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event)
|
||||
return true;
|
||||
}
|
||||
|
||||
static Bool KeyRepeatCheckIfEvent(Display * display, XEvent * chkev,
|
||||
XPointer arg)
|
||||
{
|
||||
XEvent * release_event = (XEvent *)arg;
|
||||
if (chkev->type == KeyPress &&
|
||||
chkev->xkey.keycode == release_event->xkey.keycode &&
|
||||
chkev->xkey.time - release_event->xkey.time < 2)
|
||||
return True;
|
||||
return False;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if this is a repeated key.
|
||||
*/
|
||||
static bool IsRepeatKey(Display * display, XEvent * event)
|
||||
{
|
||||
XEvent dummyev;
|
||||
if (XPending(display))
|
||||
{
|
||||
if (XCheckIfEvent(display, &dummyev, KeyRepeatCheckIfEvent,
|
||||
(XPointer)event) == True)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process an X event.
|
||||
*
|
||||
@ -180,6 +208,9 @@ static bool ProcessXEvent(XEvent * x_event, Jtk_Event * event)
|
||||
return ProcessXKeyEvent(x_event, event);
|
||||
|
||||
case KeyRelease:
|
||||
if (IsRepeatKey(g_display, x_event)) {
|
||||
return false;
|
||||
}
|
||||
event->type = JTK_EVENT_KEY_RELEASE;
|
||||
return ProcessXKeyEvent(x_event, event);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user