[gtk+/gtk-3-8] GtkWidget: Avoid lingering clock frame updates



commit 2ca82e6ddf1a4561f0fd5c8e8fda67fcca0a0dfc
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Oct 22 18:42:01 2013 +0200

    GtkWidget: Avoid lingering clock frame updates
    
    For some widgets, like GtkTreeView, which setup a clock frame
    update during realize, it was possible to call
    gdk_frame_clock_begin_updating() twice, but only ever disconnecting
    from it once. This happens because the realized flag is set at an
    unpredictable time by the GtkWidget's realize implementation.
    
    Keep the signal handler ID from us connecting to the "update" signal
    to avoid connecting to it twice.
    
    This fixes high wake-up count from any application using GtkTreeView,
    even idle ones.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=710666

 gtk/gtkwidget.c |   31 +++++++++++++++----------------
 1 files changed, 15 insertions(+), 16 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index dc7d63f..5d02fc1 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);
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]