GtkCssParser *parser;
GtkCssSection *section;
GtkCssScanner *parent;
- GFile *file;
- GFile *base;
GSList *state;
};
if (scanner->section)
gtk_css_section_unref (scanner->section);
g_object_unref (scanner->provider);
- if (scanner->file)
- g_object_unref (scanner->file);
- g_object_unref (scanner->base);
_gtk_css_parser_free (scanner->parser);
g_slice_free (GtkCssScanner, scanner);
if (section)
scanner->section = gtk_css_section_ref (section);
- if (file)
- {
- scanner->file = g_object_ref (file);
- scanner->base = g_file_get_parent (file);
- }
- else
- {
- char *dir = g_get_current_dir ();
- scanner->base = g_file_new_for_path (dir);
- g_free (dir);
- }
-
scanner->parser = _gtk_css_parser_new (text,
gtk_css_scanner_parser_error,
scanner);
return scanner;
}
-static GFile *
-gtk_css_scanner_get_base_url (GtkCssScanner *scanner)
-{
- return scanner->base;
-}
-
static gboolean
gtk_css_scanner_would_recurse (GtkCssScanner *scanner,
GFile *file)
{
while (scanner)
{
- if (scanner->file && g_file_equal (scanner->file, file))
+ GFile *parser_file = _gtk_css_parser_get_file (scanner->parser);
+ if (parser_file && g_file_equal (parser_file, file))
return TRUE;
scanner = scanner->parent;
props = gtk_style_properties_new ();
css_provider_dump_symbolic_colors (css_provider, props);
- _gtk_css_matcher_init (&matcher, path, 0);
-
- for (i = 0; i < priv->rulesets->len; i++)
+ if (_gtk_css_matcher_init (&matcher, path, 0))
{
- GtkCssRuleset *ruleset;
+ for (i = 0; i < priv->rulesets->len; i++)
+ {
+ GtkCssRuleset *ruleset;
- ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
+ ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
- if (ruleset->styles == NULL)
- continue;
+ if (ruleset->styles == NULL)
+ continue;
- if (!gtk_css_ruleset_matches (ruleset, &matcher))
- continue;
+ if (!gtk_css_ruleset_matches (ruleset, &matcher))
+ continue;
- for (j = 0; j < ruleset->n_styles; j++)
- _gtk_style_properties_set_property_by_property (props,
- GTK_CSS_STYLE_PROPERTY (ruleset->styles[i].property),
- _gtk_css_selector_get_state_flags (ruleset->selector),
- ruleset->styles[i].value);
+ for (j = 0; j < ruleset->n_styles; j++)
+ _gtk_style_properties_set_property_by_property (props,
+ GTK_CSS_STYLE_PROPERTY (ruleset->styles[i].property),
+ _gtk_css_selector_get_state_flags (ruleset->selector),
+ ruleset->styles[i].value);
+ }
}
return props;
gchar *prop_name;
gint i;
+ if (!_gtk_css_matcher_init (&matcher, path, state))
+ return FALSE;
+
prop_name = g_strdup_printf ("-%s-%s",
g_type_name (pspec->owner_type),
pspec->name);
- _gtk_css_matcher_init (&matcher, path, 0);
for (i = priv->rulesets->len - 1; i >= 0; i--)
{
char *uri;
uri = _gtk_css_parser_read_string (scanner->parser);
- file = g_file_resolve_relative_path (gtk_css_scanner_get_base_url (scanner), uri);
+ file = _gtk_css_parser_get_file_for_path (scanner->parser, uri);
g_free (uri);
}
else
static gboolean
parse_color_definition (GtkCssScanner *scanner)
{
- GtkSymbolicColor *symbolic;
+ GtkCssValue *symbolic;
char *name;
gtk_css_scanner_push_section (scanner, GTK_CSS_SECTION_COLOR_DEFINITION);
return TRUE;
}
- symbolic = _gtk_css_parser_read_symbolic_color (scanner->parser);
+ symbolic = _gtk_css_symbolic_value_new (scanner->parser);
if (symbolic == NULL)
{
g_free (name);
if (!_gtk_css_parser_try (scanner->parser, ";", TRUE))
{
g_free (name);
- gtk_symbolic_color_unref (symbolic);
+ _gtk_css_value_unref (symbolic);
gtk_css_provider_error_literal (scanner->provider,
scanner,
GTK_CSS_PROVIDER_ERROR,
g_free (free_data);
+ _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (css_provider));
+
return ret;
}
GFile *file,
GError **error)
{
+ gboolean success;
+
g_return_val_if_fail (GTK_IS_CSS_PROVIDER (css_provider), FALSE);
g_return_val_if_fail (G_IS_FILE (file), FALSE);
gtk_css_provider_reset (css_provider);
- return gtk_css_provider_load_internal (css_provider, NULL, file, NULL, error);
+ success = gtk_css_provider_load_internal (css_provider, NULL, file, NULL, error);
+
+ _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (css_provider));
+
+ return success;
}
/**
if (!provider)
{
- const gchar *home_dir;
gchar *subpath, *path = NULL;
if (variant)
else
subpath = g_strdup ("gtk-3.0" G_DIR_SEPARATOR_S "gtk.css");
- /* First look in the users home directory
+ /* First look in the user's config directory
*/
- home_dir = g_get_home_dir ();
- if (home_dir)
+ path = g_build_filename (g_get_user_data_dir (), "themes", name, subpath, NULL);
+ if (!g_file_test (path, G_FILE_TEST_EXISTS))
{
- path = g_build_filename (home_dir, ".themes", name, subpath, NULL);
+ g_free (path);
+ path = NULL;
+ }
- if (!g_file_test (path, G_FILE_TEST_EXISTS))
+ /* Next look in the user's home directory
+ */
+ if (!path)
+ {
+ const gchar *home_dir;
+
+ home_dir = g_get_home_dir ();
+ if (home_dir)
{
- g_free (path);
- path = NULL;
+ path = g_build_filename (home_dir, ".themes", name, subpath, NULL);
+
+ if (!g_file_test (path, G_FILE_TEST_EXISTS))
+ {
+ g_free (path);
+ path = NULL;
+ }
}
}