From 1da65bbc982e0ef042f8d8a79367bb9053040ba9 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Tue, 24 Feb 2026 00:25:52 +0100 Subject: [PATCH] Only reject RUN_ON_MAIN_THREAD events on quit Use SDL_PeepEvents() to consume only SC_EVENT_RUN_ON_MAIN_THREAD events. Other events are not dropped and can still be processed later. PR #6662 --- app/src/scrcpy.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index 68fdc226..537bc6a7 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -209,17 +209,18 @@ event_loop(struct scrcpy *s, bool has_screen) { } static void -terminate_event_loop(void) { +terminate_runnables_on_event_loop(void) { sc_reject_new_runnables(); SDL_Event event; - while (SDL_PollEvent(&event)) { - if (event.type == SC_EVENT_RUN_ON_MAIN_THREAD) { - // Make sure all posted runnables are run, to avoid memory leaks - sc_runnable_fn run = event.user.data1; - void *userdata = event.user.data2; - run(userdata); - } + while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, + SC_EVENT_RUN_ON_MAIN_THREAD, + SC_EVENT_RUN_ON_MAIN_THREAD) == 1) { + assert(event.type == SC_EVENT_RUN_ON_MAIN_THREAD); + // Make sure all posted runnables are run, to avoid memory leaks + sc_runnable_fn run = event.user.data1; + void *userdata = event.user.data2; + run(userdata); } } @@ -946,7 +947,7 @@ aoa_complete: } ret = event_loop(s, options->window); - terminate_event_loop(); + terminate_runnables_on_event_loop(); LOGD("quit..."); if (options->window) {