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