* if we need to change things. */
#define GTK_CSS_RADICAL_CHANGE (GTK_CSS_CHANGE_ID | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_SOURCE | GTK_CSS_CHANGE_PARENT_STYLE)
+/* When these change, we need to recompute the change flags for the new style
+ * since they may have changed.
+ */
+#define GTK_CSS_CHANGE_NEEDS_RECOMPUTE (GTK_CSS_RADICAL_CHANGE & ~GTK_CSS_CHANGE_PARENT_STYLE)
+
G_DEFINE_TYPE (GtkCssNode, gtk_css_node, G_TYPE_OBJECT)
enum {
}
static GtkCssStyle *
-gtk_css_node_create_style (GtkCssNode *cssnode)
+gtk_css_node_create_style (GtkCssNode *cssnode,
+ GtkCssChange change)
{
const GtkCssNodeDeclaration *decl;
GtkCssMatcher matcher;
GtkCssStyle *parent;
GtkCssStyle *style;
+ GtkCssChange style_change;
decl = gtk_css_node_get_declaration (cssnode);
parent = cssnode->parent ? cssnode->parent->style : NULL;
+ if (change & GTK_CSS_CHANGE_NEEDS_RECOMPUTE)
+ {
+ /* Need to recompute the change flags */
+ style_change = 0;
+ }
+ else
+ {
+ style_change = gtk_css_static_style_get_change (gtk_css_style_get_static_style (cssnode->style));
+ }
+
if (gtk_css_node_init_matcher (cssnode, &matcher))
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
&matcher,
- parent);
+ parent,
+ style_change);
else
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
NULL,
- parent);
+ parent,
+ style_change);
store_in_global_parent_cache (cssnode, decl, style);
static_style = GTK_CSS_STYLE (gtk_css_style_get_static_style (style));
if (gtk_css_style_needs_recreation (static_style, change))
- new_static_style = gtk_css_node_create_style (cssnode);
+ new_static_style = gtk_css_node_create_style (cssnode, change);
else
new_static_style = g_object_ref (static_style);
}
else if (static_style != style && (change & GTK_CSS_CHANGE_TIMESTAMP))
{
- new_style = gtk_css_animated_style_new_advance ((GtkCssAnimatedStyle *)style,
+ new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
static_style,
timestamp);
}
settings = gtk_settings_get_default ();
default_style = gtk_css_static_style_new_compute (GTK_STYLE_PROVIDER (settings),
NULL,
- NULL);
+ NULL,
+ TRUE);
g_object_set_data_full (G_OBJECT (settings), I_("gtk-default-style"),
default_style, clear_default_style);
}
GtkCssStyle *
gtk_css_static_style_new_compute (GtkStyleProvider *provider,
const GtkCssMatcher *matcher,
- GtkCssStyle *parent)
+ GtkCssStyle *parent,
+ GtkCssChange change)
{
GtkCssStaticStyle *result;
GtkCssLookup lookup;
- GtkCssChange change = GTK_CSS_CHANGE_ANY_SELF | GTK_CSS_CHANGE_ANY_SIBLING | GTK_CSS_CHANGE_ANY_PARENT;
_gtk_css_lookup_init (&lookup);
gtk_style_provider_lookup (provider,
matcher,
&lookup,
- &change);
+ change == 0 ? &change : NULL);
result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
GtkCssStyle * gtk_css_static_style_get_default (void);
GtkCssStyle * gtk_css_static_style_new_compute (GtkStyleProvider *provider,
const GtkCssMatcher *matcher,
- GtkCssStyle *parent);
+ GtkCssStyle *parent,
+ GtkCssChange change);
void gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
GtkStyleProvider *provider,