st/theme-node: Consider scale factor when comparing

The CSS engine of St is scale-aware, which means every length
and size it produces is multiplied by the current scale factor.

However, the individual nodes aren't aware of the scale factor
when they compare to each other.

Store and compare the scale factors in the nodes themselves.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1635

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
This commit is contained in:
Georges Basile Stavracas Neto 2020-04-03 17:44:54 -03:00
parent 0368ad29e9
commit e68604b1aa
2 changed files with 8 additions and 0 deletions

View File

@ -117,6 +117,8 @@ struct _StThemeNode {
CoglPipeline *color_pipeline; CoglPipeline *color_pipeline;
StThemeNodePaintState cached_state; StThemeNodePaintState cached_state;
int cached_scale_factor;
}; };
void _st_theme_node_ensure_background (StThemeNode *node); void _st_theme_node_ensure_background (StThemeNode *node);

View File

@ -225,6 +225,7 @@ st_theme_node_new (StThemeContext *context,
node->element_classes = split_on_whitespace (element_class); node->element_classes = split_on_whitespace (element_class);
node->pseudo_classes = split_on_whitespace (pseudo_class); node->pseudo_classes = split_on_whitespace (pseudo_class);
node->inline_style = g_strdup (inline_style); node->inline_style = g_strdup (inline_style);
node->cached_scale_factor = st_theme_context_get_scale_factor (context);
return node; return node;
} }
@ -345,6 +346,7 @@ st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b)
node_a->context != node_b->context || node_a->context != node_b->context ||
node_a->theme != node_b->theme || node_a->theme != node_b->theme ||
node_a->element_type != node_b->element_type || node_a->element_type != node_b->element_type ||
node_a->cached_scale_factor != node_b->cached_scale_factor ||
g_strcmp0 (node_a->element_id, node_b->element_id) || g_strcmp0 (node_a->element_id, node_b->element_id) ||
g_strcmp0 (node_a->inline_style, node_b->inline_style)) g_strcmp0 (node_a->inline_style, node_b->inline_style))
return FALSE; return FALSE;
@ -396,6 +398,7 @@ st_theme_node_hash (StThemeNode *node)
hash = hash * 33 + GPOINTER_TO_UINT (node->context); hash = hash * 33 + GPOINTER_TO_UINT (node->context);
hash = hash * 33 + GPOINTER_TO_UINT (node->theme); hash = hash * 33 + GPOINTER_TO_UINT (node->theme);
hash = hash * 33 + ((guint) node->element_type); hash = hash * 33 + ((guint) node->element_type);
hash = hash * 33 + ((guint) node->cached_scale_factor);
if (node->element_id != NULL) if (node->element_id != NULL)
hash = hash * 33 + g_str_hash (node->element_id); hash = hash * 33 + g_str_hash (node->element_id);
@ -3967,6 +3970,9 @@ st_theme_node_geometry_equal (StThemeNode *node,
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE); g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
if (node->cached_scale_factor != other->cached_scale_factor)
return FALSE;
_st_theme_node_ensure_geometry (node); _st_theme_node_ensure_geometry (node);
_st_theme_node_ensure_geometry (other); _st_theme_node_ensure_geometry (other);