+ priv->update_id = g_signal_connect (priv->frame_clock,
+ "update",
+ G_CALLBACK (gtk_timeline_on_update),
+ timeline);
+
+ gdk_frame_clock_request_phase (priv->frame_clock, GDK_FRAME_CLOCK_PHASE_UPDATE);
+ priv->last_time = gdk_frame_clock_get_frame_time (priv->frame_clock);
+}
+
+static void
+gtk_timeline_stop_updating (GtkTimeline *timeline)
+{
+ GtkTimelinePriv *priv = timeline->priv;
+
+ g_assert (priv->running && priv->frame_clock && priv->update_id != 0);
+
+ g_signal_handler_disconnect (priv->frame_clock,
+ priv->update_id);
+ priv->update_id = 0;
+}
+
+static void
+gtk_timeline_start_running (GtkTimeline *timeline)
+{
+ GtkTimelinePriv *priv = timeline->priv;
+
+ g_assert (priv->running);
+
+ if (priv->widget)
+ gtk_widget_add_frame_clock_target (priv->widget,
+ GDK_FRAME_CLOCK_TARGET (timeline));
+ else if (priv->frame_clock)
+ gtk_timeline_start_updating (timeline);
+}
+
+static void
+gtk_timeline_stop_running (GtkTimeline *timeline)
+{
+ GtkTimelinePriv *priv = timeline->priv;
+
+ g_assert (priv->running);
+
+ if (priv->widget)
+ gtk_widget_remove_frame_clock_target (priv->widget,
+ GDK_FRAME_CLOCK_TARGET (timeline));
+ else if (priv->frame_clock)
+ gtk_timeline_stop_updating (timeline);