[gnome-shell/gbsneto/fix-switching-scale] st/widget: Compare scale factor when recomputing style



commit eb70606a05e4a6b0c2ab1a7ce8241915f2954355
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Fri Apr 3 16:54:44 2020 -0300

    st/widget: Compare scale factor when recomputing style
    
    Changing the scale affects not only painting, but also the actual
    geometry of the actors. Right now, however, it is not being accounted
    for when recomputing styles, which results in various UI elements
    (the icon grid, top panel elements, etc) to have an old geometry.
    
    Compare scale factors when recomputing style, and consider scale
    factor changes as geometry changes.

 src/st/st-widget.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
---
diff --git a/src/st/st-widget.c b/src/st/st-widget.c
index 7314a6ca5f..1fd1d7d098 100644
--- a/src/st/st-widget.c
+++ b/src/st/st-widget.c
@@ -80,6 +80,8 @@ struct _StWidgetPrivate
   AtkRole accessible_role;
   AtkStateSet *local_state_set;
 
+  int scale_factor;
+
   ClutterActor *label_actor;
   gchar        *accessible_name;
 
@@ -1648,6 +1650,7 @@ st_widget_init (StWidget *actor)
   priv = st_widget_get_instance_private (actor);
   priv->transition_animation = NULL;
   priv->local_state_set = atk_state_set_new ();
+  priv->scale_factor = 1;
 
   /* connect style changed */
   g_signal_connect (actor, "notify::name", G_CALLBACK (st_widget_name_notify), NULL);
@@ -1686,6 +1689,7 @@ st_widget_recompute_style (StWidget    *widget,
   StSettings *settings;
   gboolean paint_equal, geometry_equal = FALSE;
   gboolean animations_enabled;
+  ClutterActor *stage;
 
   if (new_theme_node == old_theme_node)
     {
@@ -1697,6 +1701,23 @@ st_widget_recompute_style (StWidget    *widget,
 
   if (old_theme_node)
     geometry_equal = st_theme_node_geometry_equal (old_theme_node, new_theme_node);
+
+  stage = clutter_actor_get_stage (CLUTTER_ACTOR (widget));
+  if (stage)
+    {
+      StThemeContext *context;
+      int scale_factor;
+
+      context = st_theme_context_get_for_stage (CLUTTER_STAGE (stage));
+      g_object_get (context, "scale-factor", &scale_factor, NULL);
+
+      if (scale_factor != priv->scale_factor)
+        {
+          priv->scale_factor = scale_factor;
+          geometry_equal = FALSE;
+        }
+    }
+
   if (!geometry_equal)
     clutter_actor_queue_relayout ((ClutterActor *) widget);
 


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