[gtk] scaler: Avoid some signal connections



commit d2f76d689f9bf0819b929953fd88bc81b6ee583f
Author: Timm Bäder <mail baedert org>
Date:   Thu Aug 15 17:12:30 2019 +0200

    scaler: Avoid some signal connections
    
    We're mainly using this for icons that will never change contents or
    size, and we're using a GtkScaler per such icon when on a hidpi setup,
    so just avoid the two signal connections per icon.

 gtk/gtkscaler.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkscaler.c b/gtk/gtkscaler.c
index 3824635bf2..c07a083f36 100644
--- a/gtk/gtkscaler.c
+++ b/gtk/gtkscaler.c
@@ -122,8 +122,14 @@ gtk_scaler_dispose (GObject *object)
 
   if (self->paintable)
     {
-      g_signal_handlers_disconnect_by_func (self->paintable, gdk_paintable_invalidate_contents, self);
-      g_signal_handlers_disconnect_by_func (self->paintable, gdk_paintable_invalidate_size, self);
+      const guint flags = gdk_paintable_get_flags (self->paintable);
+
+      if ((flags & GDK_PAINTABLE_STATIC_CONTENTS) == 0)
+        g_signal_handlers_disconnect_by_func (self->paintable, gdk_paintable_invalidate_contents, self);
+
+      if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
+        g_signal_handlers_disconnect_by_func (self->paintable, gdk_paintable_invalidate_size, self);
+
       g_clear_object (&self->paintable);
     }
 
@@ -149,6 +155,7 @@ gtk_scaler_new (GdkPaintable *paintable,
                 double        scale_factor)
 {
   GtkScaler *self;
+  guint flags;
 
   g_return_val_if_fail (GDK_IS_PAINTABLE (paintable), NULL);
   g_return_val_if_fail (scale_factor > 0.0, NULL);
@@ -156,8 +163,14 @@ gtk_scaler_new (GdkPaintable *paintable,
   self = g_object_new (GTK_TYPE_SCALER, NULL);
 
   self->paintable = g_object_ref (paintable);
-  g_signal_connect_swapped (paintable, "invalidate-contents", G_CALLBACK 
(gdk_paintable_invalidate_contents), self);
-  g_signal_connect_swapped (paintable, "invalidate-size", G_CALLBACK (gdk_paintable_invalidate_size), self);
+  flags = gdk_paintable_get_flags (paintable);
+
+  if ((flags & GDK_PAINTABLE_STATIC_CONTENTS) == 0)
+    g_signal_connect_swapped (paintable, "invalidate-contents", G_CALLBACK 
(gdk_paintable_invalidate_contents), self);
+
+  if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
+    g_signal_connect_swapped (paintable, "invalidate-size", G_CALLBACK (gdk_paintable_invalidate_size), 
self);
+
   self->scale_factor = scale_factor;
 
   return GDK_PAINTABLE (self);


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