From 473e77e2c5ab380dcfcaefab699ed8cbff3ae915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 7 Feb 2021 23:21:55 +0100 Subject: [PATCH] st/widget: Fix applying :insensitive to initially unreactive widgets We are applying the :insensitive pseudo class to unreactive widgets, or at least we are supposed to. As we currently only update the style on notify, we don't apply it to initially unreactive widgets. This was covered up partially until recently when Clutter started to use G_PARAM_EXPLICIT_NOTIFY. Before that, the notify handler would run when explicitly setting :reactive to FALSE at construction time. Make sure we always apply the pseudo class correctly by updating it after construct properties have been set. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3685 Part-of: --- src/st/st-widget.c | 23 +++++++++++++++++++---- src/st/test-theme.c | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/st/st-widget.c b/src/st/st-widget.c index 2ee74af08..7e03028c0 100644 --- a/src/st/st-widget.c +++ b/src/st/st-widget.c @@ -142,6 +142,15 @@ static gboolean st_widget_real_navigate_focus (StWidget *widget, static AtkObject * st_widget_get_accessible (ClutterActor *actor); static gboolean st_widget_has_accessible (ClutterActor *actor); +static void +st_widget_update_insensitive (StWidget *widget) +{ + if (clutter_actor_get_reactive (CLUTTER_ACTOR (widget))) + st_widget_remove_style_pseudo_class (widget, "insensitive"); + else + st_widget_add_style_pseudo_class (widget, "insensitive"); +} + static void st_widget_set_property (GObject *gobject, guint prop_id, @@ -247,6 +256,14 @@ st_widget_get_property (GObject *gobject, } } +static void +st_widget_constructed (GObject *gobject) +{ + G_OBJECT_CLASS (st_widget_parent_class)->constructed (gobject); + + st_widget_update_insensitive (ST_WIDGET (gobject)); +} + static void st_widget_remove_transition (StWidget *widget) { @@ -840,6 +857,7 @@ st_widget_class_init (StWidgetClass *klass) gobject_class->set_property = st_widget_set_property; gobject_class->get_property = st_widget_get_property; + gobject_class->constructed = st_widget_constructed; gobject_class->dispose = st_widget_dispose; gobject_class->finalize = st_widget_finalize; @@ -1471,10 +1489,7 @@ st_widget_reactive_notify (StWidget *widget, { StWidgetPrivate *priv = st_widget_get_instance_private (widget); - if (clutter_actor_get_reactive (CLUTTER_ACTOR (widget))) - st_widget_remove_style_pseudo_class (widget, "insensitive"); - else - st_widget_add_style_pseudo_class (widget, "insensitive"); + st_widget_update_insensitive (widget); if (priv->track_hover) st_widget_sync_hover(widget); diff --git a/src/st/test-theme.c b/src/st/test-theme.c index d38b41f03..6aff82b0d 100644 --- a/src/st/test-theme.c +++ b/src/st/test-theme.c @@ -465,6 +465,8 @@ test_pseudo_class (void) /* Test the StWidget add/remove pseudo_class interfaces */ label = st_label_new ("foo"); + /* Make reactive, so we don't get the automatic :insensitive style */ + clutter_actor_set_reactive (CLUTTER_ACTOR (label), TRUE); clutter_actor_add_child (stage, CLUTTER_ACTOR (label)); labelNode = st_widget_get_theme_node (label);