diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-01-15 15:10:06 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-01-15 15:56:05 -0500 |
commit | 13e2445adb42cfeca254a46f6bd07c9f4e6a0cc8 (patch) | |
tree | 2f571932be6f17629aef32fe48c10daa9e3d63d7 /gtk/gtkcssnode.c | |
parent | 67fd975d77443d7fc61eac571edf523e9449716d (diff) | |
download | gtk+-wip/matthiasc/css-change.tar.gz |
css: Track hover and active state changes separatelywip/matthiasc/css-change
The idea is that this reduce the amount of frequently
changing state that css nodes are sensitive to.
This is going to reduce the amount of style recomputation.
Diffstat (limited to 'gtk/gtkcssnode.c')
-rw-r--r-- | gtk/gtkcssnode.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c index 5b0de1323c..bd90df4bf0 100644 --- a/gtk/gtkcssnode.c +++ b/gtk/gtkcssnode.c @@ -1210,9 +1210,23 @@ void gtk_css_node_set_state (GtkCssNode *cssnode, GtkStateFlags state_flags) { + GtkStateFlags old_state; + + old_state = gtk_css_node_declaration_get_state (cssnode->decl); + if (gtk_css_node_declaration_set_state (&cssnode->decl, state_flags)) { - gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_STATE); + GtkStateFlags states = old_state ^ state_flags; + GtkCssChange change = 0; + + if (states & GTK_STATE_FLAG_PRELIGHT) + change |= GTK_CSS_CHANGE_HOVER; + if (states & GTK_STATE_FLAG_ACTIVE) + change |= GTK_CSS_CHANGE_ACTIVE; + if (states & ~(GTK_STATE_FLAG_PRELIGHT|GTK_STATE_FLAG_ACTIVE)) + change |= GTK_CSS_CHANGE_STATE; + + gtk_css_node_invalidate (cssnode, change); g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_STATE]); } } |