css: Make the style provider take a matcher as an input argument

This commit is contained in:
Benjamin Otte 2012-03-17 02:36:11 +01:00
parent c0b7c3321d
commit a94b85d375
12 changed files with 43 additions and 62 deletions

View File

@ -62,11 +62,10 @@ _gtk_css_matcher_get_previous (GtkCssMatcher *matcher,
return TRUE; return TRUE;
} }
gboolean GtkStateFlags
_gtk_css_matcher_has_state (const GtkCssMatcher *matcher, _gtk_css_matcher_get_state (const GtkCssMatcher *matcher)
GtkStateFlags state_flags)
{ {
return (matcher->state_flags & state_flags) == state_flags; return matcher->state_flags;
} }
gboolean gboolean

View File

@ -40,8 +40,7 @@ gboolean _gtk_css_matcher_get_parent (GtkCssMatcher *match
gboolean _gtk_css_matcher_get_previous (GtkCssMatcher *matcher, gboolean _gtk_css_matcher_get_previous (GtkCssMatcher *matcher,
const GtkCssMatcher *next); const GtkCssMatcher *next);
gboolean _gtk_css_matcher_has_state (const GtkCssMatcher *matcher, GtkStateFlags _gtk_css_matcher_get_state (const GtkCssMatcher *matcher);
GtkStateFlags state_flags);
gboolean _gtk_css_matcher_has_name (const GtkCssMatcher *matcher, gboolean _gtk_css_matcher_has_name (const GtkCssMatcher *matcher,
const char *name); const char *name);
gboolean _gtk_css_matcher_has_class (const GtkCssMatcher *matcher, gboolean _gtk_css_matcher_has_class (const GtkCssMatcher *matcher,

View File

@ -1294,10 +1294,9 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset,
static gboolean static gboolean
gtk_css_ruleset_matches (GtkCssRuleset *ruleset, gtk_css_ruleset_matches (GtkCssRuleset *ruleset,
GtkWidgetPath *path, const GtkCssMatcher *matcher)
GtkStateFlags state)
{ {
return _gtk_css_selector_matches (ruleset->selector, path, state); return _gtk_css_selector_matches (ruleset->selector, matcher);
} }
static void static void
@ -1469,6 +1468,7 @@ static GtkStyleProperties *
gtk_css_provider_get_style (GtkStyleProvider *provider, gtk_css_provider_get_style (GtkStyleProvider *provider,
GtkWidgetPath *path) GtkWidgetPath *path)
{ {
GtkCssMatcher matcher;
GtkCssProvider *css_provider; GtkCssProvider *css_provider;
GtkCssProviderPrivate *priv; GtkCssProviderPrivate *priv;
GtkStyleProperties *props; GtkStyleProperties *props;
@ -1479,6 +1479,7 @@ gtk_css_provider_get_style (GtkStyleProvider *provider,
props = gtk_style_properties_new (); props = gtk_style_properties_new ();
css_provider_dump_symbolic_colors (css_provider, props); css_provider_dump_symbolic_colors (css_provider, props);
_gtk_css_matcher_init (&matcher, path, 0);
for (i = 0; i < priv->rulesets->len; i++) for (i = 0; i < priv->rulesets->len; i++)
{ {
@ -1489,7 +1490,7 @@ gtk_css_provider_get_style (GtkStyleProvider *provider,
if (ruleset->styles == NULL) if (ruleset->styles == NULL)
continue; continue;
if (!gtk_css_ruleset_matches (ruleset, path, 0)) if (!gtk_css_ruleset_matches (ruleset, &matcher))
continue; continue;
for (j = 0; j < ruleset->n_styles; j++) for (j = 0; j < ruleset->n_styles; j++)
@ -1512,6 +1513,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
GtkCssProvider *css_provider = GTK_CSS_PROVIDER (provider); GtkCssProvider *css_provider = GTK_CSS_PROVIDER (provider);
GtkCssProviderPrivate *priv = css_provider->priv; GtkCssProviderPrivate *priv = css_provider->priv;
WidgetPropertyValue *val; WidgetPropertyValue *val;
GtkCssMatcher matcher;
gboolean found = FALSE; gboolean found = FALSE;
gchar *prop_name; gchar *prop_name;
gint i; gint i;
@ -1519,6 +1521,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
prop_name = g_strdup_printf ("-%s-%s", prop_name = g_strdup_printf ("-%s-%s",
g_type_name (pspec->owner_type), g_type_name (pspec->owner_type),
pspec->name); pspec->name);
_gtk_css_matcher_init (&matcher, path, 0);
for (i = priv->rulesets->len - 1; i >= 0; i--) for (i = priv->rulesets->len - 1; i >= 0; i--)
{ {
@ -1529,7 +1532,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
if (ruleset->widget_style == NULL) if (ruleset->widget_style == NULL)
continue; continue;
if (!gtk_css_ruleset_matches (ruleset, path, state)) if (!gtk_css_ruleset_matches (ruleset, &matcher))
continue; continue;
for (val = ruleset->widget_style; val != NULL; val = val->next) for (val = ruleset->widget_style; val != NULL; val = val->next)
@ -1581,8 +1584,7 @@ gtk_css_style_provider_get_color (GtkStyleProviderPrivate *provider,
static void static void
gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider, gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup) GtkCssLookup *lookup)
{ {
GtkCssProvider *css_provider; GtkCssProvider *css_provider;
@ -1606,7 +1608,7 @@ gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider,
ruleset->set_styles)) ruleset->set_styles))
continue; continue;
if (!gtk_css_ruleset_matches (ruleset, path, state)) if (!gtk_css_ruleset_matches (ruleset, matcher))
continue; continue;
for (j = 0; j < ruleset->n_styles; j++) for (j = 0; j < ruleset->n_styles; j++)

View File

@ -21,7 +21,6 @@
#include <string.h> #include <string.h>
#include "gtkcssmatcherprivate.h"
#include "gtkcssprovider.h" #include "gtkcssprovider.h"
#include "gtkstylecontextprivate.h" #include "gtkstylecontextprivate.h"
@ -370,7 +369,9 @@ static gboolean
gtk_css_selector_pseudoclass_state_match (const GtkCssSelector *selector, gtk_css_selector_pseudoclass_state_match (const GtkCssSelector *selector,
const GtkCssMatcher *matcher) const GtkCssMatcher *matcher)
{ {
if (!_gtk_css_matcher_has_state (matcher, GPOINTER_TO_UINT (selector->data))) GtkStateFlags state = GPOINTER_TO_UINT (selector->data);
if ((_gtk_css_matcher_get_state (matcher) & state) != state)
return FALSE; return FALSE;
return gtk_css_selector_match (gtk_css_selector_previous (selector), matcher); return gtk_css_selector_match (gtk_css_selector_previous (selector), matcher);
@ -830,17 +831,13 @@ _gtk_css_selector_to_string (const GtkCssSelector *selector)
**/ **/
gboolean gboolean
_gtk_css_selector_matches (const GtkCssSelector *selector, _gtk_css_selector_matches (const GtkCssSelector *selector,
const GtkWidgetPath *path, const GtkCssMatcher *matcher)
GtkStateFlags state)
{ {
GtkCssMatcher matcher;
g_return_val_if_fail (selector != NULL, FALSE); g_return_val_if_fail (selector != NULL, FALSE);
g_return_val_if_fail (path != NULL, FALSE); g_return_val_if_fail (matcher != NULL, FALSE);
_gtk_css_matcher_init (&matcher, path, state); return gtk_css_selector_match (selector, matcher);
return gtk_css_selector_match (selector, &matcher);
} }
/* Computes specificity according to CSS 2.1. /* Computes specificity according to CSS 2.1.

View File

@ -20,6 +20,7 @@
#include <gtk/gtkenums.h> #include <gtk/gtkenums.h>
#include <gtk/gtktypes.h> #include <gtk/gtktypes.h>
#include "gtk/gtkcssmatcherprivate.h"
#include "gtk/gtkcssparserprivate.h" #include "gtk/gtkcssparserprivate.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@ -36,8 +37,7 @@ void _gtk_css_selector_print (const GtkCssSelector *sel
GtkStateFlags _gtk_css_selector_get_state_flags (const GtkCssSelector *selector); GtkStateFlags _gtk_css_selector_get_state_flags (const GtkCssSelector *selector);
gboolean _gtk_css_selector_matches (const GtkCssSelector *selector, gboolean _gtk_css_selector_matches (const GtkCssSelector *selector,
const GtkWidgetPath *path, const GtkCssMatcher *matcher);
GtkStateFlags state);
int _gtk_css_selector_compare (const GtkCssSelector *a, int _gtk_css_selector_compare (const GtkCssSelector *a,
const GtkCssSelector *b); const GtkCssSelector *b);

View File

@ -144,15 +144,13 @@ gtk_modifier_style_provider_get_color (GtkStyleProviderPrivate *provider,
static void static void
gtk_modifier_style_provider_lookup (GtkStyleProviderPrivate *provider, gtk_modifier_style_provider_lookup (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup) GtkCssLookup *lookup)
{ {
GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider); GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider);
_gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style), _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style),
path, matcher,
state,
lookup); lookup);
} }

View File

@ -1469,8 +1469,7 @@ gtk_settings_style_provider_get_color (GtkStyleProviderPrivate *provider,
static void static void
gtk_settings_style_provider_lookup (GtkStyleProviderPrivate *provider, gtk_settings_style_provider_lookup (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup) GtkCssLookup *lookup)
{ {
GtkSettings *settings = GTK_SETTINGS (provider); GtkSettings *settings = GTK_SETTINGS (provider);
@ -1478,8 +1477,7 @@ gtk_settings_style_provider_lookup (GtkStyleProviderPrivate *provider,
settings_ensure_style (settings); settings_ensure_style (settings);
_gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (settings->priv->style), _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (settings->priv->style),
path, matcher,
state,
lookup); lookup);
} }

View File

@ -173,8 +173,7 @@ gtk_style_cascade_get_color (GtkStyleProviderPrivate *provider,
static void static void
gtk_style_cascade_lookup (GtkStyleProviderPrivate *provider, gtk_style_cascade_lookup (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup) GtkCssLookup *lookup)
{ {
GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider); GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider);
@ -188,22 +187,13 @@ gtk_style_cascade_lookup (GtkStyleProviderPrivate *provider,
if (GTK_IS_STYLE_PROVIDER_PRIVATE (item)) if (GTK_IS_STYLE_PROVIDER_PRIVATE (item))
{ {
_gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (item), _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (item),
path, matcher,
state,
lookup); lookup);
} }
else else
{ {
GtkStyleProperties *provider_style = gtk_style_provider_get_style (item, path); /* you lose */
g_warn_if_reached ();
if (provider_style)
{
_gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (provider_style),
path,
state,
lookup);
g_object_unref (provider_style);
}
} }
} }
} }

View File

@ -884,15 +884,16 @@ build_properties (GtkStyleContext *context,
GtkStateFlags state) GtkStateFlags state)
{ {
GtkStyleContextPrivate *priv; GtkStyleContextPrivate *priv;
GtkCssMatcher matcher;
GtkCssLookup *lookup; GtkCssLookup *lookup;
priv = context->priv; priv = context->priv;
_gtk_css_matcher_init (&matcher, path, state);
lookup = _gtk_css_lookup_new (); lookup = _gtk_css_lookup_new ();
_gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (priv->cascade), _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
path, &matcher,
state,
lookup); lookup);
style_data->store = _gtk_css_computed_values_new (); style_data->store = _gtk_css_computed_values_new ();

View File

@ -303,8 +303,7 @@ gtk_style_properties_provider_get_color (GtkStyleProviderPrivate *provider,
static void static void
gtk_style_properties_provider_lookup (GtkStyleProviderPrivate *provider, gtk_style_properties_provider_lookup (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup) GtkCssLookup *lookup)
{ {
GtkStyleProperties *props; GtkStyleProperties *props;
@ -330,7 +329,7 @@ gtk_style_properties_provider_lookup (GtkStyleProviderPrivate *provider,
if (!_gtk_css_lookup_is_missing (lookup, id)) if (!_gtk_css_lookup_is_missing (lookup, id))
continue; continue;
value = property_data_match_state (data, state); value = property_data_match_state (data, _gtk_css_matcher_get_state (matcher));
if (value == NULL) if (value == NULL)
continue; continue;

View File

@ -45,14 +45,13 @@ _gtk_style_provider_private_get_color (GtkStyleProviderPrivate *provider,
void void
_gtk_style_provider_private_lookup (GtkStyleProviderPrivate *provider, _gtk_style_provider_private_lookup (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup) GtkCssLookup *lookup)
{ {
GtkStyleProviderPrivateInterface *iface; GtkStyleProviderPrivateInterface *iface;
g_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider)); g_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider));
g_return_if_fail (path != NULL); g_return_if_fail (matcher != NULL);
g_return_if_fail (lookup != NULL); g_return_if_fail (lookup != NULL);
iface = GTK_STYLE_PROVIDER_PRIVATE_GET_INTERFACE (provider); iface = GTK_STYLE_PROVIDER_PRIVATE_GET_INTERFACE (provider);
@ -60,5 +59,5 @@ _gtk_style_provider_private_lookup (GtkStyleProviderPrivate *provider,
if (!iface->lookup) if (!iface->lookup)
return; return;
iface->lookup (provider, path, state, lookup); iface->lookup (provider, matcher, lookup);
} }

View File

@ -20,6 +20,7 @@
#include <glib-object.h> #include <glib-object.h>
#include "gtk/gtkcsslookupprivate.h" #include "gtk/gtkcsslookupprivate.h"
#include "gtk/gtkcssmatcherprivate.h"
#include <gtk/gtkenums.h> #include <gtk/gtkenums.h>
#include <gtk/gtksymboliccolor.h> #include <gtk/gtksymboliccolor.h>
#include <gtk/gtktypes.h> #include <gtk/gtktypes.h>
@ -41,8 +42,7 @@ struct _GtkStyleProviderPrivateInterface
GtkSymbolicColor * (* get_color) (GtkStyleProviderPrivate *provider, GtkSymbolicColor * (* get_color) (GtkStyleProviderPrivate *provider,
const char *name); const char *name);
void (* lookup) (GtkStyleProviderPrivate *provider, void (* lookup) (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup); GtkCssLookup *lookup);
}; };
@ -51,8 +51,7 @@ GType _gtk_style_provider_private_get_type (void) G_GNUC_C
GtkSymbolicColor * _gtk_style_provider_private_get_color (GtkStyleProviderPrivate *provider, GtkSymbolicColor * _gtk_style_provider_private_get_color (GtkStyleProviderPrivate *provider,
const char *name); const char *name);
void _gtk_style_provider_private_lookup (GtkStyleProviderPrivate *provider, void _gtk_style_provider_private_lookup (GtkStyleProviderPrivate *provider,
GtkWidgetPath *path, const GtkCssMatcher *matcher,
GtkStateFlags state,
GtkCssLookup *lookup); GtkCssLookup *lookup);
G_END_DECLS G_END_DECLS