summaryrefslogtreecommitdiff
path: root/src/play.c
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2022-10-10 19:52:03 -0700
committerVito Caputo <vcaputo@pengaru.com>2022-10-10 19:52:03 -0700
commit36b0f83075c15fc8d107ece20bd6be95a8d2588c (patch)
treead85c51109d3c765f88dc35585dd640d6e77ed96 /src/play.c
parentcbbe0abec7e0e0f21f3315b455f3f795cedf2c9a (diff)
play: introduce play_run_slice()HEADmaster
Sometimes a more granular main loop integration is required. In such situations play_run() taking over is untenable, so this splits out the body of play_run()'s loop as a separately callable function. Existing main loops can use this to run the play main loop for a single slice. The impetus for this has been experimenting with escripten support in SARS, e.g. emscripten_set_main_loop_arg((void(*)(void *))play_run_slice, play, -1, 1);
Diffstat (limited to 'src/play.c')
-rw-r--r--src/play.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/play.c b/src/play.c
index 5c51cbf..0a4630d 100644
--- a/src/play.c
+++ b/src/play.c
@@ -448,29 +448,38 @@ int play_shutdown(play_t *play)
}
-void play_run(play_t *play)
+int play_run_slice(play_t *play)
{
- for (;;) {
- SDL_Event ev;
+ SDL_Event ev;
- do {
- play->update_needed = 0;
+ do {
+ play->update_needed = 0;
- if (play->ops[play->context]->update)
- play->ops[play->context]->update(play, play->contexts[play->context]);
+ if (play->ops[play->context]->update)
+ play->ops[play->context]->update(play, play->contexts[play->context]);
- /* see comment in play_context_enter() for why play->update_needed exists */
- } while (play->update_needed);
+ /* see comment in play_context_enter() for why play->update_needed exists */
+ } while (play->update_needed);
- if (play->ops[play->context]->render)
- play->ops[play->context]->render(play, play->contexts[play->context]);
+ if (play->ops[play->context]->render)
+ play->ops[play->context]->render(play, play->contexts[play->context]);
- while (!play->update_needed && SDL_PollEvent(&ev)) {
- if (ev.type == SDL_APP_TERMINATING || ev.type == SDL_QUIT)
- return;
+ while (!play->update_needed && SDL_PollEvent(&ev)) {
+ if (ev.type == SDL_APP_TERMINATING || ev.type == SDL_QUIT)
+ return 0;
- if (play->ops[play->context]->dispatch)
- play->ops[play->context]->dispatch(play, play->contexts[play->context], &ev);
- }
+ if (play->ops[play->context]->dispatch)
+ play->ops[play->context]->dispatch(play, play->contexts[play->context], &ev);
+ }
+
+ return 1;
+}
+
+
+void play_run(play_t *play)
+{
+ for (;;) {
+ if (!play_run_slice(play))
+ return;
}
}
© All Rights Reserved