Filter out repeated key presses

This commit is contained in:
Josh Holtrop 2017-09-30 22:46:46 -04:00
parent 035f5805ad
commit f424fd573d

View File

@ -158,6 +158,34 @@ static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event)
return true; 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. * Process an X event.
* *
@ -180,6 +208,9 @@ static bool ProcessXEvent(XEvent * x_event, Jtk_Event * event)
return ProcessXKeyEvent(x_event, event); return ProcessXKeyEvent(x_event, event);
case KeyRelease: case KeyRelease:
if (IsRepeatKey(g_display, x_event)) {
return false;
}
event->type = JTK_EVENT_KEY_RELEASE; event->type = JTK_EVENT_KEY_RELEASE;
return ProcessXKeyEvent(x_event, event); return ProcessXKeyEvent(x_event, event);