summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-01-12 12:31:11 -0500
committerMatthias Clasen <mclasen@redhat.com>2020-01-15 17:06:40 -0500
commitce755144f5fbb250999efb6e24589306503e5d90 (patch)
tree89ca4736540db6cadf97f91524fb8becc95f4c1d
parente8eb1df29f15361697d7f6062d0466f61d072f2e (diff)
downloadgtk+-ce755144f5fbb250999efb6e24589306503e5d90.tar.gz
css: Implement the superset matcher smarter
Instead of wrapping the individual vfuncs, and having a branch in the inner loop, rewrite the matcher class.
-rw-r--r--gtk/gtkcssmatcher.c50
-rw-r--r--gtk/gtkcssmatcherprivate.h1
-rw-r--r--gtk/gtkcssprovider.c3
3 files changed, 26 insertions, 28 deletions
diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c
index 899a7f74f6..0fee1ea6c3 100644
--- a/gtk/gtkcssmatcher.c
+++ b/gtk/gtkcssmatcher.c
@@ -22,6 +22,7 @@
#include "gtkcssnodedeclarationprivate.h"
#include "gtkcssnodeprivate.h"
#include "gtkwidgetpath.h"
+#include "gtkprivate.h"
/* GTK_CSS_MATCHER_WIDGET_PATH */
@@ -459,12 +460,7 @@ gtk_css_matcher_superset_get_previous (GtkCssMatcher *matcher,
static GtkStateFlags
gtk_css_matcher_superset_get_state (const GtkCssMatcher *matcher)
{
- /* XXX: This gets tricky when we implement :not() */
-
- if (matcher->superset.relevant & GTK_CSS_CHANGE_STATE)
- return _gtk_css_matcher_get_state (matcher->superset.subset);
- else
- return GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED
+ return GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED
| GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_INCONSISTENT
| GTK_STATE_FLAG_FOCUSED | GTK_STATE_FLAG_BACKDROP | GTK_STATE_FLAG_LINK
| GTK_STATE_FLAG_VISITED;
@@ -474,30 +470,21 @@ static gboolean
gtk_css_matcher_superset_has_name (const GtkCssMatcher *matcher,
/*interned*/ const char *name)
{
- if (matcher->superset.relevant & GTK_CSS_CHANGE_NAME)
- return _gtk_css_matcher_has_name (matcher->superset.subset, name);
- else
- return TRUE;
+ return TRUE;
}
static gboolean
gtk_css_matcher_superset_has_class (const GtkCssMatcher *matcher,
GQuark class_name)
{
- if (matcher->superset.relevant & GTK_CSS_CHANGE_CLASS)
- return _gtk_css_matcher_has_class (matcher->superset.subset, class_name);
- else
- return TRUE;
+ return TRUE;
}
static gboolean
gtk_css_matcher_superset_has_id (const GtkCssMatcher *matcher,
const char *id)
{
- if (matcher->superset.relevant & GTK_CSS_CHANGE_NAME)
- return _gtk_css_matcher_has_id (matcher->superset.subset, id);
- else
- return TRUE;
+ return TRUE;
}
static gboolean
@@ -506,13 +493,10 @@ gtk_css_matcher_superset_has_position (const GtkCssMatcher *matcher,
int a,
int b)
{
- if (matcher->superset.relevant & GTK_CSS_CHANGE_POSITION)
- return _gtk_css_matcher_has_position (matcher->superset.subset, forward, a, b);
- else
- return TRUE;
+ return TRUE;
}
-static const GtkCssMatcherClass GTK_CSS_MATCHER_SUPERSET = {
+static const GtkCssMatcherClass GTK_CSS_MATCHER_SUPERSET2 = {
gtk_css_matcher_superset_get_parent,
gtk_css_matcher_superset_get_previous,
gtk_css_matcher_superset_get_state,
@@ -526,13 +510,25 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_SUPERSET = {
void
_gtk_css_matcher_superset_init (GtkCssMatcher *matcher,
const GtkCssMatcher *subset,
+ GtkCssMatcherClass *klass,
GtkCssChange relevant)
{
g_return_if_fail (subset != NULL);
g_return_if_fail ((relevant & ~(GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_STATE)) == 0);
- matcher->superset.klass = &GTK_CSS_MATCHER_SUPERSET;
- matcher->superset.subset = subset;
- matcher->superset.relevant = relevant;
-}
+ *klass = GTK_CSS_MATCHER_SUPERSET2;
+ if (relevant & GTK_CSS_CHANGE_CLASS)
+ klass->has_class = subset->klass->has_class;
+ if (relevant & GTK_CSS_CHANGE_NAME)
+ klass->has_name = subset->klass->has_name;
+ if (relevant & GTK_CSS_CHANGE_NAME)
+ klass->has_id = subset->klass->has_id;
+ if (relevant & GTK_CSS_CHANGE_POSITION)
+ klass->has_position = subset->klass->has_position;
+ if (relevant & GTK_CSS_CHANGE_STATE)
+ klass->get_state = subset->klass->get_state;
+
+ *matcher = *subset;
+ matcher->klass = klass;
+}
diff --git a/gtk/gtkcssmatcherprivate.h b/gtk/gtkcssmatcherprivate.h
index a78f777abb..6f5e9d195c 100644
--- a/gtk/gtkcssmatcherprivate.h
+++ b/gtk/gtkcssmatcherprivate.h
@@ -88,6 +88,7 @@ void _gtk_css_matcher_node_init (GtkCssMatcher *match
void _gtk_css_matcher_any_init (GtkCssMatcher *matcher);
void _gtk_css_matcher_superset_init (GtkCssMatcher *matcher,
const GtkCssMatcher *subset,
+ GtkCssMatcherClass *klass,
GtkCssChange relevant);
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index b7d7fcf731..6039ecf8a3 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -553,8 +553,9 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider,
if (change)
{
GtkCssMatcher change_matcher;
+ GtkCssMatcherClass matcher_class;
- _gtk_css_matcher_superset_init (&change_matcher, matcher, GTK_CSS_CHANGE_NAME | GTK_CSS_CHANGE_CLASS);
+ _gtk_css_matcher_superset_init (&change_matcher, matcher, &matcher_class, GTK_CSS_CHANGE_CLASS | GTK_CSS_CHANGE_NAME);
*change = _gtk_css_selector_tree_get_change_all (priv->tree, &change_matcher);
verify_tree_get_change_results (css_provider, &change_matcher, *change);