aboutsummaryrefslogtreecommitdiffstats
path: root/pugl
diff options
context:
space:
mode:
Diffstat (limited to 'pugl')
-rw-r--r--pugl/pugl.h6
-rw-r--r--pugl/pugl_internal.h7
-rw-r--r--pugl/pugl_x11.c13
3 files changed, 18 insertions, 8 deletions
diff --git a/pugl/pugl.h b/pugl/pugl.h
index 45e1653..58b2101 100644
--- a/pugl/pugl.h
+++ b/pugl/pugl.h
@@ -250,6 +250,12 @@ int
puglGetModifiers(PuglView* view);
/**
+ Ignore synthetic repeated key events.
+*/
+void
+puglIgnoreKeyRepeat(PuglView* view, bool ignore);
+
+/**
Set the function to call when the window is closed.
*/
PUGL_API void
diff --git a/pugl/pugl_internal.h b/pugl/pugl_internal.h
index 21e9eb4..6ddcdf8 100644
--- a/pugl/pugl_internal.h
+++ b/pugl/pugl_internal.h
@@ -43,6 +43,7 @@ struct PuglViewImpl {
int width;
int height;
int mods;
+ bool ignoreKeyRepeat;
bool redisplay;
};
@@ -65,6 +66,12 @@ puglGetModifiers(PuglView* view)
}
void
+puglIgnoreKeyRepeat(PuglView* view, bool ignore)
+{
+ view->ignoreKeyRepeat = ignore;
+}
+
+void
puglSetCloseFunc(PuglView* view, PuglCloseFunc closeFunc)
{
view->closeFunc = closeFunc;
diff --git a/pugl/pugl_x11.c b/pugl/pugl_x11.c
index 08bfc40..35d2d42 100644
--- a/pugl/pugl_x11.c
+++ b/pugl/pugl_x11.c
@@ -156,7 +156,6 @@ puglDestroy(PuglView* view)
if (!glXMakeCurrent(view->impl->display, None, NULL)) {
printf("Could not release drawing context.\n");
}
- /* destroy the context */
glXDestroyContext(view->impl->display, view->impl->ctx);
view->impl->ctx = NULL;
}
@@ -259,8 +258,6 @@ PuglStatus
puglProcessEvents(PuglView* view)
{
XEvent event;
-
- /* handle the events in the queue */
while (XPending(view->impl->display) > 0) {
XNextEvent(view->impl->display, &event);
switch (event.type) {
@@ -331,20 +328,20 @@ puglProcessEvents(PuglView* view)
break;
case KeyRelease: {
setModifiers(view, event.xkey.state);
- bool retriggered = false;
- if (XEventsQueued(view->impl->display, QueuedAfterReading)) {
+ bool repeated = false;
+ if (view->ignoreKeyRepeat &&
+ XEventsQueued(view->impl->display, QueuedAfterReading)) {
XEvent next;
XPeekEvent(view->impl->display, &next);
if (next.type == KeyPress &&
next.xkey.time == event.xkey.time &&
next.xkey.keycode == event.xkey.keycode) {
- // Key repeat, ignore fake KeyPress event
XNextEvent(view->impl->display, &event);
- retriggered = true;
+ repeated = true;
}
}
- if (!retriggered && view->keyboardFunc) {
+ if (!repeated && view->keyboardFunc) {
KeySym sym = XKeycodeToKeysym(
view->impl->display, event.xkey.keycode, 0);
PuglKey special = keySymToSpecial(sym);