diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index b29396e971..fcd0e259d5 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -511,6 +511,7 @@ struct _GtkWidgetPrivate /* Animations and other things to update on clock ticks */ GList *tick_callbacks; + guint clock_tick_id; /* A hash by GType key, containing hash tables by widget name */ @@ -4732,12 +4733,11 @@ unref_tick_callback_info (GtkWidget *widget, g_slice_free (GtkTickCallbackInfo, info); } - if (priv->tick_callbacks == NULL && priv->realized) + if (priv->tick_callbacks == NULL && priv->clock_tick_id) { GdkFrameClock *frame_clock = gtk_widget_get_frame_clock (widget); - g_signal_handlers_disconnect_by_func (frame_clock, - (gpointer) gtk_widget_on_frame_clock_update, - widget); + g_signal_handler_disconnect (frame_clock, priv->clock_tick_id); + priv->clock_tick_id = 0; gdk_frame_clock_end_updating (frame_clock); } } @@ -4835,12 +4835,12 @@ gtk_widget_add_tick_callback (GtkWidget *widget, priv = widget->priv; - if (priv->tick_callbacks == NULL && priv->realized) + if (priv->realized && !priv->clock_tick_id) { GdkFrameClock *frame_clock = gtk_widget_get_frame_clock (widget); - g_signal_connect (frame_clock, "update", - G_CALLBACK (gtk_widget_on_frame_clock_update), - widget); + priv->clock_tick_id = g_signal_connect (frame_clock, "update", + G_CALLBACK (gtk_widget_on_frame_clock_update), + widget); gdk_frame_clock_begin_updating (frame_clock); } @@ -4899,11 +4899,11 @@ gtk_widget_connect_frame_clock (GtkWidget *widget, if (GTK_IS_CONTAINER (widget)) _gtk_container_maybe_start_idle_sizer (GTK_CONTAINER (widget)); - if (priv->tick_callbacks != NULL) + if (priv->tick_callbacks != NULL && !priv->clock_tick_id) { - g_signal_connect (frame_clock, "update", - G_CALLBACK (gtk_widget_on_frame_clock_update), - widget); + priv->clock_tick_id = g_signal_connect (frame_clock, "update", + G_CALLBACK (gtk_widget_on_frame_clock_update), + widget); gdk_frame_clock_begin_updating (frame_clock); } @@ -4920,11 +4920,10 @@ gtk_widget_disconnect_frame_clock (GtkWidget *widget, if (GTK_IS_CONTAINER (widget)) _gtk_container_stop_idle_sizer (GTK_CONTAINER (widget)); - if (priv->tick_callbacks) + if (priv->clock_tick_id) { - g_signal_handlers_disconnect_by_func (frame_clock, - (gpointer) gtk_widget_on_frame_clock_update, - widget); + g_signal_handler_disconnect (frame_clock, priv->clock_tick_id); + priv->clock_tick_id = 0; gdk_frame_clock_end_updating (frame_clock); }