diff options
author | David Robillard <d@drobilla.net> | 2020-03-15 18:30:24 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-03-15 20:53:37 +0100 |
commit | efc053fe5a38a4928fbfd3780f5665dd43bc7f95 (patch) | |
tree | c3e28366d5b57592e82c004ab59a3e364d4ef57f /test | |
parent | 3b9e8287fd4c1096a2d6244aa07bc28cacb4da8d (diff) | |
download | pugl-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.c | 17 | ||||
-rw-r--r-- | test/test_show_hide.c | 6 | ||||
-rw-r--r-- | test/test_update.c | 124 | ||||
-rw-r--r-- | test/test_utils.h | 4 |
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, |