[gtk/wip/otte/for-main] frameclock: Run paint idle from flush idle




commit 988e20cd53c08cf69aeb43f40f63c47ab218ffd5
Author: Benjamin Otte <otte redhat com>
Date:   Sun Jul 10 21:15:22 2022 +0200

    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;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]