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
This commit is contained in:
Benjamin Otte 2022-07-10 21:15:22 +02:00 committed by Marvin W
parent 36ed85cc9c
commit 41396e1344
No known key found for this signature in database
GPG Key ID: 072E9235DB996F2A

View File

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