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 497e66ce6a
commit c9cfeb8318
2 changed files with 8 additions and 0 deletions

View File

@ -117,6 +117,8 @@ struct _StThemeNode {
CoglPipeline *color_pipeline;
StThemeNodePaintState cached_state;
int cached_scale_factor;
};
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->pseudo_classes = split_on_whitespace (pseudo_class);
node->inline_style = g_strdup (inline_style);
node->cached_scale_factor = st_theme_context_get_scale_factor (context);
return node;
}
@ -345,6 +346,7 @@ st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b)
node_a->context != node_b->context ||
node_a->theme != node_b->theme ||
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->inline_style, node_b->inline_style))
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->theme);
hash = hash * 33 + ((guint) node->element_type);
hash = hash * 33 + ((guint) node->cached_scale_factor);
if (node->element_id != NULL)
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);
if (node->cached_scale_factor != other->cached_scale_factor)
return FALSE;
_st_theme_node_ensure_geometry (node);
_st_theme_node_ensure_geometry (other);