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:
parent
402fd8ec29
commit
2721c306af
@ -117,6 +117,8 @@ struct _StThemeNode {
|
|||||||
CoglPipeline *color_pipeline;
|
CoglPipeline *color_pipeline;
|
||||||
|
|
||||||
StThemeNodePaintState cached_state;
|
StThemeNodePaintState cached_state;
|
||||||
|
|
||||||
|
int scale_factor;
|
||||||
};
|
};
|
||||||
|
|
||||||
void _st_theme_node_ensure_background (StThemeNode *node);
|
void _st_theme_node_ensure_background (StThemeNode *node);
|
||||||
|
@ -219,6 +219,8 @@ st_theme_node_new (StThemeContext *context,
|
|||||||
if (theme == NULL && parent_node != NULL)
|
if (theme == NULL && parent_node != NULL)
|
||||||
theme = parent_node->theme;
|
theme = parent_node->theme;
|
||||||
|
|
||||||
|
g_object_get (context, "scale-factor", &node->scale_factor, NULL);
|
||||||
|
|
||||||
g_set_object (&node->theme, theme);
|
g_set_object (&node->theme, theme);
|
||||||
node->element_type = element_type;
|
node->element_type = element_type;
|
||||||
node->element_id = g_strdup (element_id);
|
node->element_id = g_strdup (element_id);
|
||||||
@ -345,6 +347,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->scale_factor != node_b->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 +399,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->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 +3971,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->scale_factor != other->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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user