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



commit a251386b649f4ebc12b0f4849fa0e8d445b052af
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.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176

 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]