From 4c6ac6b1c3e9f7ac04b5f6ba0b30eb8eacfcce9c Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 4 Aug 2019 22:00:04 +0200 Subject: Factor out parsing test options --- test/pugl_cairo_test.c | 35 +++++++++--------------------- test/pugl_test.c | 49 ++++++++++++------------------------------ test/test_utils.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 60 deletions(-) diff --git a/test/pugl_cairo_test.c b/test/pugl_cairo_test.c index 278a74d..3a36e53 100644 --- a/test/pugl_cairo_test.c +++ b/test/pugl_cairo_test.c @@ -31,8 +31,8 @@ #include static PuglWorld* world = NULL; +PuglTestOptions opts = {0}; -static bool continuous = false; static int quit = 0; static bool entered = false; static bool mouseDown = false; @@ -133,7 +133,7 @@ onDisplay(PuglView* view) // Draw button for (Button* b = buttons; b->label; ++b) { - buttonDraw(cr, b, continuous ? puglGetTime(world) : 0.0); + buttonDraw(cr, b, opts.continuous ? puglGetTime(world) : 0.0); } ++framesDrawn; @@ -184,25 +184,10 @@ onEvent(PuglView* view, const PuglEvent* event) int main(int argc, char** argv) { - bool ignoreKeyRepeat = false; - bool resizable = false; - for (int i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "-c")) { - continuous = true; - } else if (!strcmp(argv[i], "-h")) { - printf("USAGE: %s [OPTIONS]...\n\n" - " -c Continuously animate and draw\n" - " -h Display this help\n" - " -i Ignore key repeat\n" - " -r Resizable window\n", argv[0]); - return 0; - } else if (!strcmp(argv[i], "-i")) { - ignoreKeyRepeat = true; - } else if (!strcmp(argv[i], "-r")) { - resizable = true; - } else { - fprintf(stderr, "Unknown option: %s\n", argv[i]); - } + opts = puglParseTestOptions(&argc, &argv); + if (opts.help) { + puglPrintTestUsage("pugl_test", ""); + return 1; } world = puglNewWorld(); @@ -212,10 +197,10 @@ main(int argc, char** argv) PuglView* view = puglNewView(world); puglSetFrame(view, frame); puglSetMinSize(view, 256, 256); - puglSetViewHint(view, PUGL_RESIZABLE, resizable); + puglSetViewHint(view, PUGL_RESIZABLE, opts.resizable); puglSetBackend(view, puglCairoBackend()); - puglSetViewHint(view, PUGL_IGNORE_KEY_REPEAT, ignoreKeyRepeat); + puglSetViewHint(view, PUGL_IGNORE_KEY_REPEAT, opts.ignoreKeyRepeat); puglSetEventFunc(view, onEvent); if (puglCreateWindow(view, "Pugl Test")) { @@ -226,7 +211,7 @@ main(int argc, char** argv) PuglFpsPrinter fpsPrinter = { puglGetTime(world) }; while (!quit) { - if (continuous) { + if (opts.continuous) { puglPostRedisplay(view); } else { puglPollEvents(world, -1); @@ -234,7 +219,7 @@ main(int argc, char** argv) puglDispatchEvents(world); - if (continuous) { + if (opts.continuous) { puglPrintFps(world, &fpsPrinter, &framesDrawn); } } diff --git a/test/pugl_test.c b/test/pugl_test.c index 6c4e3e8..740ebcd 100644 --- a/test/pugl_test.c +++ b/test/pugl_test.c @@ -281,35 +281,14 @@ main(int argc, char** argv) PuglTestApp app = {0}; app.dist = 10; - int samples = 0; - int doubleBuffer = PUGL_FALSE; - bool ignoreKeyRepeat = false; - bool resizable = false; - for (int i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "-a")) { - samples = 4; - } else if (!strcmp(argv[i], "-c")) { - app.continuous = true; - } else if (!strcmp(argv[i], "-d")) { - doubleBuffer = PUGL_TRUE; - } else if (!strcmp(argv[i], "-h")) { - printf("USAGE: %s [OPTIONS]...\n\n" - " -a Enable anti-aliasing\n" - " -c Continuously animate and draw\n" - " -d Enable double-buffering\n" - " -h Display this help\n" - " -i Ignore key repeat\n" - " -r Resizable window\n", argv[0]); - return 0; - } else if (!strcmp(argv[i], "-i")) { - ignoreKeyRepeat = true; - } else if (!strcmp(argv[i], "-r")) { - resizable = true; - } else { - fprintf(stderr, "Unknown option: %s\n", argv[i]); - } + const PuglTestOptions opts = puglParseTestOptions(&argc, &argv); + if (opts.help) { + puglPrintTestUsage("pugl_test", ""); + return 1; } + app.continuous = opts.continuous; + app.world = puglNewWorld(); app.parent = puglNewView(app.world); app.child = puglNewView(app.world); @@ -322,11 +301,11 @@ main(int argc, char** argv) puglSetAspectRatio(app.parent, 1, 1, 16, 9); puglSetBackend(app.parent, puglGlBackend()); - puglSetViewHint(app.parent, PUGL_RESIZABLE, resizable); - puglSetViewHint(app.parent, PUGL_SAMPLES, samples); - puglSetViewHint(app.parent, PUGL_DOUBLE_BUFFER, doubleBuffer); - puglSetViewHint(app.parent, PUGL_SWAP_INTERVAL, doubleBuffer); - puglSetViewHint(app.parent, PUGL_IGNORE_KEY_REPEAT, ignoreKeyRepeat); + puglSetViewHint(app.parent, PUGL_RESIZABLE, opts.resizable); + puglSetViewHint(app.parent, PUGL_SAMPLES, opts.samples); + puglSetViewHint(app.parent, PUGL_DOUBLE_BUFFER, opts.doubleBuffer); + puglSetViewHint(app.parent, PUGL_SWAP_INTERVAL, opts.doubleBuffer); + puglSetViewHint(app.parent, PUGL_IGNORE_KEY_REPEAT, opts.ignoreKeyRepeat); puglSetHandle(app.parent, &app); puglSetEventFunc(app.parent, onParentEvent); @@ -340,11 +319,11 @@ main(int argc, char** argv) puglSetFrame(app.child, getChildFrame(parentFrame)); puglSetParentWindow(app.child, puglGetNativeWindow(app.parent)); - puglSetViewHint(app.child, PUGL_SAMPLES, samples); - puglSetViewHint(app.child, PUGL_DOUBLE_BUFFER, doubleBuffer); + puglSetViewHint(app.child, PUGL_SAMPLES, opts.samples); + puglSetViewHint(app.child, PUGL_DOUBLE_BUFFER, opts.doubleBuffer); puglSetViewHint(app.child, PUGL_SWAP_INTERVAL, 0); puglSetBackend(app.child, puglGlBackend()); - puglSetViewHint(app.child, PUGL_IGNORE_KEY_REPEAT, ignoreKeyRepeat); + puglSetViewHint(app.child, PUGL_IGNORE_KEY_REPEAT, opts.ignoreKeyRepeat); puglSetHandle(app.child, &app); puglSetEventFunc(app.child, onEvent); diff --git a/test/test_utils.h b/test/test_utils.h index bf058ac..f4f6c31 100644 --- a/test/test_utils.h +++ b/test/test_utils.h @@ -19,11 +19,21 @@ #include #include #include +#include typedef struct { double lastReportTime; } PuglFpsPrinter; +typedef struct { + int samples; + int doubleBuffer; + bool continuous; + bool help; + bool ignoreKeyRepeat; + bool resizable; +} PuglTestOptions; + static const float cubeStripVertices[] = { -1.0f, 1.0f, 1.0f, // Front top left 1.0f, 1.0f, 1.0f, // Front top right @@ -142,6 +152,54 @@ printEvent(const PuglEvent* event, const char* prefix) return 0; } +static inline void +puglPrintTestUsage(const char* prog, const char* posHelp) +{ + printf("Usage: %s [OPTION]... %s\n\n" + " -a Enable anti-aliasing\n" + " -c Continuously animate and draw\n" + " -d Enable double-buffering\n" + " -h Display this help\n" + " -i Ignore key repeat\n" + " -r Resizable window\n", + prog, posHelp); +} + +static inline PuglTestOptions +puglParseTestOptions(int* pargc, char*** pargv) +{ + PuglTestOptions opts = { 0, 0, false, false, false, false }; + + char** const argv = *pargv; + int i = 1; + for (; i < *pargc; ++i) { + if (!strcmp(argv[i], "-a")) { + opts.samples = 4; + } else if (!strcmp(argv[i], "-c")) { + opts.continuous = true; + } else if (!strcmp(argv[i], "-d")) { + opts.doubleBuffer = PUGL_TRUE; + } else if (!strcmp(argv[i], "-h")) { + opts.help = true; + return opts; + } else if (!strcmp(argv[i], "-i")) { + opts.ignoreKeyRepeat = true; + } else if (!strcmp(argv[i], "-r")) { + opts.resizable = true; + } else if (argv[i][0] != '-') { + break; + } else { + opts.help = true; + fprintf(stderr, "error: Unknown option: %s\n", argv[i]); + } + } + + *pargc -= i; + *pargv += i; + + return opts; +} + static inline void puglPrintFps(const PuglWorld* world, PuglFpsPrinter* printer, -- cgit v1.2.1