diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index dc7d63fdaf..5d02fc1c6c 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -414,6 +414,7 @@ struct _GtkWidgetPrivate /* Animations and other things to update on clock ticks */ GList *tick_callbacks; + guint clock_tick_id; #ifdef G_ENABLE_DEBUG /* Number of gtk_widget_push_verify_invariants () */ @@ -4566,12 +4567,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); } } @@ -4669,12 +4669,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); } @@ -4730,11 +4730,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); } @@ -4751,11 +4751,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); }