[gtk/benzea/take-child-visible-into-account] widgetnode: Take child-visible into account for node visibility



commit 7d5d96782bcd16414ef271918e1ddd189a631c8a
Author: Benjamin Berg <bberg redhat com>
Date:   Mon Jun 15 23:28:29 2020 +0200

    widgetnode: Take child-visible into account for node visibility
    
    Otherwise e.g. a spinner inside a GtkStack will trigger wakeups with
    60Hz even though it is completely invisible because a different stack
    page is selected.
    
    Seen a lot in fractal, which uses the pattern of having a GtkStack with
    a spinner and the actual UI a lot. In that case, the code would need to
    be changed to explicitly show/hide or start/stop the spinner every time
    it is shown. And there are a lot of places using this pattern.

 gtk/gtkcsswidgetnode.c | 2 +-
 gtk/gtkwidget.c        | 6 +++++-
 2 files changed, 6 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkcsswidgetnode.c b/gtk/gtkcsswidgetnode.c
index 575e3ca46b..74fda8ca37 100644
--- a/gtk/gtkcsswidgetnode.c
+++ b/gtk/gtkcsswidgetnode.c
@@ -297,7 +297,7 @@ gtk_css_widget_node_new (GtkWidget *widget)
   result = g_object_new (GTK_TYPE_CSS_WIDGET_NODE, NULL);
   result->widget = widget;
   gtk_css_node_set_visible (GTK_CSS_NODE (result),
-                            _gtk_widget_get_visible (widget));
+                            _gtk_widget_get_visible (widget) && _gtk_widget_get_child_visible (widget));
 
   return GTK_CSS_NODE (result);
 }
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 1bdd2ce42f..bf45ecaa4e 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -4843,7 +4843,8 @@ gtk_widget_show (GtkWidget *widget)
             gtk_widget_queue_compute_expand (parent);
         }
 
-      gtk_css_node_set_visible (widget->priv->cssnode, TRUE);
+      gtk_css_node_set_visible (widget->priv->cssnode,
+                                _gtk_widget_get_child_visible (widget));
 
       g_signal_emit (widget, widget_signals[SHOW], 0);
       g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_VISIBLE]);
@@ -10825,6 +10826,9 @@ gtk_widget_set_child_visible (GtkWidget *widget,
        gtk_widget_unmap (widget);
     }
 
+  gtk_css_node_set_visible (widget->priv->cssnode,
+                            _gtk_widget_get_visible (widget) && is_visible);
+
   gtk_widget_verify_invariants (widget);
   g_object_unref (widget);
 }


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