From f424fd573daa7177dc6bb879cf564ec11e8c96c5 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 30 Sep 2017 22:46:46 -0400 Subject: [PATCH] Filter out repeated key presses --- src/gui/jtk/Jtk_event.cc | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/gui/jtk/Jtk_event.cc b/src/gui/jtk/Jtk_event.cc index 8010053..6643311 100644 --- a/src/gui/jtk/Jtk_event.cc +++ b/src/gui/jtk/Jtk_event.cc @@ -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);