summaryrefslogtreecommitdiff
path: root/gtk/gtkcssnode.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkcssnode.c')
-rw-r--r--gtk/gtkcssnode.c16
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]);
}
}