summaryrefslogtreecommitdiff
path: root/gtk/gtkcssselector.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-01-18 18:19:23 -0500
committerMatthias Clasen <mclasen@redhat.com>2020-01-18 23:06:25 -0500
commit95f00c6071f96a6ebd667d90dc34df4ac858f88a (patch)
tree8519603e1318c6467f0d90159894e065863fa1bc /gtk/gtkcssselector.c
parent55cfeccfd251417e74fe56a5c99b5aa3c3217bd0 (diff)
downloadgtk+-95f00c6071f96a6ebd667d90dc34df4ac858f88a.tar.gz
css: Redo the pseudoclass selectors
There is no need to duplicate the classes, we can make do with a single class for all the states.
Diffstat (limited to 'gtk/gtkcssselector.c')
-rw-r--r--gtk/gtkcssselector.c64
1 files changed, 23 insertions, 41 deletions
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index dc35d839db..48432ca171 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -726,31 +726,30 @@ comp_pseudoclass_state (const GtkCssSelector *a,
return a->state.state - b->state.state;
}
-#define GTK_CSS_CHANGE_PSEUDOCLASS_HOVER GTK_CSS_CHANGE_HOVER
-DEFINE_SIMPLE_SELECTOR(pseudoclass_hover, PSEUDOCLASS_HOVER, print_pseudoclass_state,
- match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
- FALSE, TRUE, FALSE, TRUE)
-#undef GTK_CSS_CHANGE_PSEUDOCLASS_HOVER
+static GtkCssChange
+change_pseudoclass_state (const GtkCssSelector *selector)
+{
+ GtkStateFlags states = selector->state.state;
+ GtkCssChange change = 0;
-#define GTK_CSS_CHANGE_PSEUDOCLASS_DISABLED GTK_CSS_CHANGE_DISABLED
-DEFINE_SIMPLE_SELECTOR(pseudoclass_disabled, PSEUDOCLASS_DISABLED, print_pseudoclass_state,
- match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
- FALSE, TRUE, FALSE, TRUE)
-#undef GTK_CSS_CHANGE_PSEUDOCLASS_DISABLED
+ if (states & GTK_STATE_FLAG_PRELIGHT)
+ change |= GTK_CSS_CHANGE_HOVER;
+ if (states & GTK_STATE_FLAG_INSENSITIVE)
+ change |= GTK_CSS_CHANGE_DISABLED;
+ if (states & GTK_STATE_FLAG_BACKDROP)
+ change |= GTK_CSS_CHANGE_BACKDROP;
+ if (states & GTK_STATE_FLAG_SELECTED)
+ change |= GTK_CSS_CHANGE_SELECTED;
+ if (states & ~(GTK_STATE_FLAG_PRELIGHT |
+ GTK_STATE_FLAG_INSENSITIVE |
+ GTK_STATE_FLAG_BACKDROP |
+ GTK_STATE_FLAG_SELECTED))
+ change |= GTK_CSS_CHANGE_STATE;
-#define GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP GTK_CSS_CHANGE_BACKDROP
-DEFINE_SIMPLE_SELECTOR(pseudoclass_backdrop, PSEUDOCLASS_BACKDROP, print_pseudoclass_state,
- match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
- FALSE, TRUE, FALSE, TRUE)
-#undef GTK_CSS_CHANGE_PSEUDOCLASS_BACKDROP
-
-#define GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED GTK_CSS_CHANGE_SELECTED
-DEFINE_SIMPLE_SELECTOR(pseudoclass_selected, PSEUDOCLASS_SELECTED, print_pseudoclass_state,
- match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
- FALSE, TRUE, FALSE, TRUE)
-#undef GTK_CSS_CHANGE_PSEUDOCLASS_SELECTED
+ return change;
+}
-#define GTK_CSS_CHANGE_PSEUDOCLASS_STATE GTK_CSS_CHANGE_STATE
+#define GTK_CSS_CHANGE_PSEUDOCLASS_STATE change_pseudoclass_state (selector)
DEFINE_SIMPLE_SELECTOR(pseudoclass_state, PSEUDOCLASS_STATE, print_pseudoclass_state,
match_pseudoclass_state, hash_pseudoclass_state, comp_pseudoclass_state,
FALSE, TRUE, FALSE, TRUE)
@@ -1310,26 +1309,9 @@ gtk_css_selector_parse_selector_pseudo_class (GtkCssParser *parser,
{
if (pseudo_classes[i].state_flag)
{
- if (pseudo_classes[i].state_flag == GTK_STATE_FLAG_PRELIGHT)
- selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_HOVER
- : &GTK_CSS_SELECTOR_PSEUDOCLASS_HOVER,
- selector);
- else if (pseudo_classes[i].state_flag == GTK_STATE_FLAG_INSENSITIVE)
- selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_DISABLED
- : &GTK_CSS_SELECTOR_PSEUDOCLASS_DISABLED,
- selector);
- else if (pseudo_classes[i].state_flag == GTK_STATE_FLAG_BACKDROP)
- selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_BACKDROP
- : &GTK_CSS_SELECTOR_PSEUDOCLASS_BACKDROP,
- selector);
- else if (pseudo_classes[i].state_flag == GTK_STATE_FLAG_SELECTED)
- selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_SELECTED
- : &GTK_CSS_SELECTOR_PSEUDOCLASS_SELECTED,
- selector);
- else
- selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_STATE
+ selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_STATE
: &GTK_CSS_SELECTOR_PSEUDOCLASS_STATE,
- selector);
+ selector);
selector->state.state = pseudo_classes[i].state_flag;
}
else