aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-03-15 18:30:24 +0100
committerDavid Robillard <d@drobilla.net>2020-03-15 20:53:37 +0100
commitefc053fe5a38a4928fbfd3780f5665dd43bc7f95 (patch)
treec3e28366d5b57592e82c004ab59a3e364d4ef57f /test
parent3b9e8287fd4c1096a2d6244aa07bc28cacb4da8d (diff)
downloadpugl-efc053fe5a38a4928fbfd3780f5665dd43bc7f95.tar.gz
pugl-efc053fe5a38a4928fbfd3780f5665dd43bc7f95.tar.bz2
pugl-efc053fe5a38a4928fbfd3780f5665dd43bc7f95.zip
Unify event loop functions as puglUpdate()
The previous separation between polling and dispatching was a lie, especially on MacOS where it is impossible to only poll for events without dispatching anything. Providing such an API is misleading, and problematic in various other ways. So, merge them into a single puglUpdate() function which can do the right thing on all platforms. This also adds the behaviour of actually processing all events in the given time interval, which is almost always what clients actually want to do when using a positive timeout (naively doing this before caused terrible input lag).
Diffstat (limited to 'test')
-rw-r--r--test/test_redisplay.c17
-rw-r--r--test/test_show_hide.c6
-rw-r--r--test/test_update.c124
-rw-r--r--test/test_utils.h4
4 files changed, 137 insertions, 14 deletions
diff --git a/test/test_redisplay.c b/test/test_redisplay.c
index 4470053..6ec5bb8 100644
--- a/test/test_redisplay.c
+++ b/test/test_redisplay.c
@@ -31,6 +31,12 @@
#include <stddef.h>
#include <stdint.h>
+#ifdef __APPLE__
+static const double timeout = 1 / 60.0;
+#else
+static const double timeout = -1.0;
+#endif
+
typedef enum {
START,
EXPOSED,
@@ -85,13 +91,6 @@ onEvent(PuglView* view, const PuglEvent* event)
return PUGL_SUCCESS;
}
-static void
-tick(PuglWorld* world)
-{
- assert(!puglPollEvents(world, -1));
- assert(!puglDispatchEvents(world));
-}
-
int
main(int argc, char** argv)
{
@@ -111,7 +110,7 @@ main(int argc, char** argv)
assert(!puglCreateWindow(app.view, "Pugl Test"));
assert(!puglShowWindow(app.view));
while (app.state != EXPOSED) {
- tick(app.world);
+ assert(!puglUpdate(app.world, timeout));
}
// Send a custom event to trigger a redisplay in the event loop
@@ -121,7 +120,7 @@ main(int argc, char** argv)
// Loop until an expose happens in the same iteration as the redisplay
app.state = SHOULD_REDISPLAY;
while (app.state != REDISPLAYED) {
- tick(app.world);
+ assert(!puglUpdate(app.world, timeout));
assert(app.state != POSTED_REDISPLAY);
}
diff --git a/test/test_show_hide.c b/test/test_show_hide.c
index b942f45..ed5ede7 100644
--- a/test/test_show_hide.c
+++ b/test/test_show_hide.c
@@ -95,12 +95,10 @@ tick(PuglWorld* world)
#ifdef __APPLE__
// FIXME: Expose events are not events on MacOS, so we can't block
// indefinitely here since it will block forever
- assert(!puglPollEvents(world, 1 / 30.0));
+ assert(!puglUpdate(world, 1 / 30.0));
#else
- assert(!puglPollEvents(world, -1));
+ assert(!puglUpdate(world, -1));
#endif
-
- assert(!puglDispatchEvents(world));
}
int
diff --git a/test/test_update.c b/test/test_update.c
new file mode 100644
index 0000000..bbda94a
--- /dev/null
+++ b/test/test_update.c
@@ -0,0 +1,124 @@
+/*
+ Copyright 2020 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+/*
+ Tests that redisplays posted in the event handler are dispatched at the end
+ of the same event loop iteration.
+*/
+
+#undef NDEBUG
+
+#include "test_utils.h"
+
+#include "pugl/pugl.h"
+#include "pugl/pugl_stub.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __APPLE__
+static const double timeout = 1 / 60.0;
+#else
+static const double timeout = -1.0;
+#endif
+
+typedef enum {
+ START,
+ EXPOSED1,
+ UPDATED,
+ EXPOSED2,
+} State;
+
+typedef struct {
+ PuglTestOptions opts;
+ PuglWorld* world;
+ PuglView* view;
+ State state;
+} PuglTest;
+
+static PuglStatus
+onEvent(PuglView* view, const PuglEvent* event)
+{
+ PuglTest* test = (PuglTest*)puglGetHandle(view);
+
+ if (test->opts.verbose) {
+ printEvent(event, "Event: ", true);
+ }
+
+ switch (event->type) {
+ case PUGL_EXPOSE:
+ switch (test->state) {
+ case START:
+ test->state = EXPOSED1;
+ break;
+ case UPDATED:
+ test->state = EXPOSED2;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case PUGL_UPDATE:
+ if (test->state == EXPOSED1) {
+ puglPostRedisplay(view);
+ test->state = UPDATED;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return PUGL_SUCCESS;
+}
+
+int
+main(int argc, char** argv)
+{
+ PuglTest app = {puglParseTestOptions(&argc, &argv),
+ puglNewWorld(PUGL_PROGRAM, 0),
+ NULL,
+ START};
+
+ // Set up view
+ app.view = puglNewView(app.world);
+ puglSetClassName(app.world, "Pugl Test");
+ puglSetBackend(app.view, puglStubBackend());
+ puglSetHandle(app.view, &app);
+ puglSetEventFunc(app.view, onEvent);
+
+ // Create and show window
+ assert(!puglCreateWindow(app.view, "Pugl Test"));
+ assert(!puglShowWindow(app.view));
+
+ // Tick until an expose happens
+ while (app.state <= EXPOSED1) {
+ assert(!puglUpdate(app.world, timeout));
+ assert(app.state != UPDATED);
+ }
+
+ // Tick once and ensure the update and the expose it posted both happened
+ assert(!puglUpdate(app.world, 0.0));
+ assert(app.state == EXPOSED2);
+
+ // Tear down
+ puglFreeView(app.view);
+ puglFreeWorld(app.world);
+
+ return 0;
+}
diff --git a/test/test_utils.h b/test/test_utils.h
index 7dc6e6e..3e62714 100644
--- a/test/test_utils.h
+++ b/test/test_utils.h
@@ -1,5 +1,5 @@
/*
- Copyright 2012-2019 David Robillard <http://drobilla.net>
+ Copyright 2012-2020 David Robillard <http://drobilla.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -140,6 +140,8 @@ printEvent(const PuglEvent* event, const char* prefix, const bool verbose)
return fprintf(stderr, "%sMap\n", prefix);
case PUGL_UNMAP:
return fprintf(stderr, "%sUnmap\n", prefix);
+ case PUGL_UPDATE:
+ return fprintf(stderr, "%sUpdate\n", prefix);
case PUGL_CONFIGURE:
return PRINT("%sConfigure " PFMT " " PFMT "\n",
prefix,