From 41396e1344156b5616ff93e8c627855ef4110415 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 10 Jul 2022 21:15:22 +0200 Subject: [PATCH] frameclock: Run paint idle from flush idle Don't return to the main loop, instead force a run of the paint idle. The paint idle will know to skip all the phases that aren't requested. This is critically important becuase gdksurface.c assumes the FLUSH_EVENTS and RESUME_EVENTS phases are matched, and we cannot guarantee that if we return to the main loop and let various reentrant code change the frame clock state. This would lead to bugs with events being paused and never unpaused again or even crashes. Fixes #4941 --- gdk/gdkframeclockidle.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gdk/gdkframeclockidle.c b/gdk/gdkframeclockidle.c index 10c4e5cd2a..9c0c7263dd 100644 --- a/gdk/gdkframeclockidle.c +++ b/gdk/gdkframeclockidle.c @@ -373,6 +373,9 @@ gdk_frame_clock_flush_idle (void *data) else priv->phase = GDK_FRAME_CLOCK_PHASE_NONE; + g_clear_handle_id (&priv->paint_idle_id, g_source_remove); + gdk_frame_clock_paint_idle (data); + return FALSE; }