[gtk/benzea/take-child-visible-into-account] widgetnode: Take child-visible into account for node visibility
- From: Benjamin Berg <bberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/benzea/take-child-visible-into-account] widgetnode: Take child-visible into account for node visibility
- Date: Mon, 15 Jun 2020 21:32:17 +0000 (UTC)
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]