gdk/surface: Try to reschedule pending phase until dispatched

If a surface scheduled a relayout, got frozen, and a layout phase
happened, then got unfrozen, it wouldn't see it's layout being
requested; avoid this race by remembering the pending phases until they
actually happened.
This commit is contained in:
Jonas Ådahl 2020-12-02 09:39:48 +01:00
parent 880ceebae4
commit e0f13ecae7

View File

@ -1368,6 +1368,8 @@ gdk_surface_layout_on_clock (GdkFrameClock *clock,
if (surface->update_freeze_count)
return;
surface->pending_phases &= ~GDK_FRAME_CLOCK_PHASE_LAYOUT;
class = GDK_SURFACE_GET_CLASS (surface);
if (class->compute_size)
class->compute_size (surface);
@ -1420,6 +1422,7 @@ gdk_surface_paint_on_clock (GdkFrameClock *clock,
* do the update later when idle instead. */
!surface->in_update)
{
surface->pending_phases &= ~GDK_FRAME_CLOCK_PHASE_PAINT;
gdk_surface_process_updates_internal (surface);
gdk_surface_remove_update_surface (surface);
}
@ -1602,10 +1605,7 @@ gdk_surface_thaw_updates (GdkSurface *surface)
_gdk_frame_clock_inhibit_freeze (frame_clock);
if (surface->pending_phases)
{
gdk_frame_clock_request_phase (frame_clock, surface->pending_phases);
surface->pending_phases = 0;
}
gdk_frame_clock_request_phase (frame_clock, surface->pending_phases);
}
}