GdkFrameClockIdle: don't start the tiemout/idle when in a frame

Don't start the idle if we're in the middle of painting a frame -
this will prevent us from getting the timing right when starting
the idle after the frame.

https://bugzilla.gnome.org/show_bug.cgi?id=685460
This commit is contained in:
Owen W. Taylor 2012-11-14 13:26:13 -05:00
parent 15ee04c66f
commit dc6dedab4d

View File

@ -46,6 +46,8 @@ struct _GdkFrameClockIdlePrivate
GdkFrameClockPhase requested; GdkFrameClockPhase requested;
GdkFrameClockPhase phase; GdkFrameClockPhase phase;
guint in_paint_idle : 1;
}; };
static gboolean gdk_frame_clock_flush_idle (void *data); static gboolean gdk_frame_clock_flush_idle (void *data);
@ -170,6 +172,7 @@ maybe_start_idle (GdkFrameClockIdle *clock_idle)
} }
if (priv->paint_idle_id == 0 && if (priv->paint_idle_id == 0 &&
!priv->in_paint_idle &&
(priv->requested & ~GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0) (priv->requested & ~GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0)
{ {
priv->paint_idle_id = gdk_threads_add_timeout_full (GDK_PRIORITY_REDRAW, priv->paint_idle_id = gdk_threads_add_timeout_full (GDK_PRIORITY_REDRAW,
@ -217,6 +220,7 @@ gdk_frame_clock_paint_idle (void *data)
gboolean skip_to_resume_events; gboolean skip_to_resume_events;
priv->paint_idle_id = 0; priv->paint_idle_id = 0;
priv->in_paint_idle = TRUE;
skip_to_resume_events = skip_to_resume_events =
(priv->requested & ~(GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS | GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS)) == 0; (priv->requested & ~(GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS | GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS)) == 0;
@ -299,7 +303,10 @@ gdk_frame_clock_paint_idle (void *data)
g_signal_emit_by_name (G_OBJECT (clock), "resume-events"); g_signal_emit_by_name (G_OBJECT (clock), "resume-events");
} }
priv->phase = GDK_FRAME_CLOCK_PHASE_NONE; if (priv->freeze_count == 0)
priv->phase = GDK_FRAME_CLOCK_PHASE_NONE;
priv->in_paint_idle = FALSE;
if (priv->freeze_count == 0 && priv->requested != 0) if (priv->freeze_count == 0 && priv->requested != 0)
{ {