[gtk/wip/otte/css: 51/66] cssprovider: Change section handling
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/css: 51/66] cssprovider: Change section handling
- Date: Thu, 11 Apr 2019 22:44:55 +0000 (UTC)
commit 0f8a77ff3323bb1b0b74f2ee8699c6cec3074eea
Author: Benjamin Otte <otte redhat com>
Date: Wed Apr 10 16:37:52 2019 +0200
cssprovider: Change section handling
Instead of building a full tree of sections that then nobody cares
about, just create sections as necessary for when we use it in the
inspector.
docs/reference/gtk/gtk4-sections.txt | 5 +-
gtk/gtkcssprovider.c | 142 ++++++++---------------------------
gtk/gtkcsssection.c | 54 +++++++------
gtk/gtkcsssection.h | 4 +
gtk/gtkcsssectionprivate.h | 5 --
5 files changed, 63 insertions(+), 147 deletions(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index bf98069542..9797298262 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -5092,12 +5092,13 @@ GtkCssParserWarning
<SUBSECTION>
GtkCssLocation
GtkCssSection
+gtk_css_section_new
+gtk_css_section_ref
+gtk_css_section_unref
gtk_css_section_get_file
gtk_css_section_get_parent
gtk_css_section_get_start_location
gtk_css_section_get_end_location
-gtk_css_section_ref
-gtk_css_section_unref
<SUBSECTION Standard>
GTK_TYPE_CSS_PROVIDER
GTK_CSS_PROVIDER
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 7bc5893fff..8e811a1091 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -103,7 +103,6 @@ struct _GtkCssScanner
{
GtkCssProvider *provider;
GtkCssParser *parser;
- GtkCssSection *section;
GtkCssScanner *parent;
GSList *state;
};
@@ -309,8 +308,6 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset,
static void
gtk_css_scanner_destroy (GtkCssScanner *scanner)
{
- if (scanner->section)
- gtk_css_section_unref (scanner->section);
g_object_unref (scanner->provider);
gtk_css_parser_unref (scanner->parser);
@@ -331,7 +328,7 @@ gtk_css_provider_emit_error (GtkCssProvider *provider,
const GError *error)
{
gtk_css_style_provider_emit_error (GTK_STYLE_PROVIDER (provider),
- scanner ? scanner->section : NULL,
+ NULL /* FIXME */,
error);
}
@@ -343,14 +340,20 @@ gtk_css_scanner_parser_error (GtkCssParser *parser,
gpointer user_data)
{
GtkCssScanner *scanner = user_data;
+ GtkCssSection *section;
+
+ section = gtk_css_section_new (gtk_css_parser_get_file (parser),
+ start,
+ end);
+
+ gtk_css_style_provider_emit_error (GTK_STYLE_PROVIDER (scanner->provider), section, error);
- gtk_css_provider_emit_error (scanner->provider, scanner, error);
+ gtk_css_section_unref (section);
}
static GtkCssScanner *
gtk_css_scanner_new (GtkCssProvider *provider,
GtkCssScanner *parent,
- GtkCssSection *section,
GFile *file,
GBytes *bytes)
{
@@ -361,8 +364,6 @@ gtk_css_scanner_new (GtkCssProvider *provider,
g_object_ref (provider);
scanner->provider = provider;
scanner->parent = parent;
- if (section)
- scanner->section = gtk_css_section_ref (section);
scanner->parser = gtk_css_parser_new_for_bytes (bytes,
file,
@@ -390,34 +391,6 @@ gtk_css_scanner_would_recurse (GtkCssScanner *scanner,
return FALSE;
}
-static void
-gtk_css_scanner_push_section (GtkCssScanner *scanner)
-{
- GtkCssSection *section;
-
- section = gtk_css_section_new_for_parser (scanner->section,
- scanner->parser);
-
- if (scanner->section)
- gtk_css_section_unref (scanner->section);
- scanner->section = section;
-}
-
-static void
-gtk_css_scanner_pop_section (GtkCssScanner *scanner)
-{
- GtkCssSection *parent;
-
- parent = gtk_css_section_get_parent (scanner->section);
- if (parent)
- gtk_css_section_ref (parent);
-
- _gtk_css_section_end (scanner->section);
- gtk_css_section_unref (scanner->section);
-
- scanner->section = parent;
-}
-
static void
gtk_css_provider_init (GtkCssProvider *css_provider)
{
@@ -772,13 +745,8 @@ parse_import (GtkCssScanner *scanner)
{
GFile *file;
- gtk_css_scanner_push_section (scanner);
-
if (!gtk_css_parser_try_at_keyword (scanner->parser, "import"))
- {
- gtk_css_scanner_pop_section (scanner);
- return FALSE;
- }
+ return FALSE;
if (gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_STRING))
{
@@ -836,8 +804,6 @@ parse_import (GtkCssScanner *scanner)
g_clear_object (&file);
- gtk_css_scanner_pop_section (scanner);
-
return TRUE;
}
@@ -848,26 +814,17 @@ parse_color_definition (GtkCssScanner *scanner)
GtkCssValue *color;
char *name;
- gtk_css_scanner_push_section (scanner);
-
if (!gtk_css_parser_try_at_keyword (scanner->parser, "define-color"))
- {
- gtk_css_scanner_pop_section (scanner);
- return FALSE;
- }
+ return FALSE;
name = gtk_css_parser_consume_ident (scanner->parser);
if (name == NULL)
- {
- gtk_css_scanner_pop_section (scanner);
- return TRUE;
- }
+ return TRUE;
color = _gtk_css_color_value_parse (scanner->parser);
if (color == NULL)
{
g_free (name);
- gtk_css_scanner_pop_section (scanner);
return TRUE;
}
@@ -880,14 +837,11 @@ parse_color_definition (GtkCssScanner *scanner)
GTK_CSS_PARSER_ERROR,
GTK_CSS_PARSER_ERROR_SYNTAX,
"Missing semicolon at end of color definition");
-
- gtk_css_scanner_pop_section (scanner);
return TRUE;
}
g_hash_table_insert (priv->symbolic_colors, name, color);
- gtk_css_scanner_pop_section (scanner);
return TRUE;
}
@@ -898,20 +852,12 @@ parse_keyframes (GtkCssScanner *scanner)
GtkCssKeyframes *keyframes;
char *name;
- gtk_css_scanner_push_section (scanner);
-
if (!gtk_css_parser_try_at_keyword (scanner->parser, "keyframes"))
- {
- gtk_css_scanner_pop_section (scanner);
- return FALSE;
- }
+ return FALSE;
name = gtk_css_parser_consume_ident (scanner->parser);
if (name == NULL)
- {
- gtk_css_scanner_pop_section (scanner);
- return FALSE;
- }
+ return FALSE;
if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{
@@ -920,7 +866,6 @@ parse_keyframes (GtkCssScanner *scanner)
GTK_CSS_PARSER_ERROR,
GTK_CSS_PARSER_ERROR_SYNTAX,
"Expected '{' for keyframes");
- gtk_css_scanner_pop_section (scanner);
return FALSE;
}
@@ -939,8 +884,6 @@ parse_keyframes (GtkCssScanner *scanner)
"expected '}' after declarations");
}
- gtk_css_scanner_pop_section (scanner);
-
return TRUE;
}
@@ -968,23 +911,16 @@ parse_selector_list (GtkCssScanner *scanner)
{
GSList *selectors = NULL;
- gtk_css_scanner_push_section (scanner);
-
do {
GtkCssSelector *select = _gtk_css_selector_parse (scanner->parser);
if (select == NULL)
- {
- gtk_css_scanner_pop_section (scanner);
- return NULL;
- }
+ return NULL;
selectors = g_slist_prepend (selectors, select);
}
while (gtk_css_parser_try_token (scanner->parser, GTK_CSS_TOKEN_COMMA));
- gtk_css_scanner_pop_section (scanner);
-
return selectors;
}
@@ -995,14 +931,12 @@ parse_declaration (GtkCssScanner *scanner,
GtkStyleProperty *property;
char *name;
- gtk_css_scanner_push_section (scanner);
gtk_css_parser_start_semicolon_block (scanner->parser, GTK_CSS_TOKEN_EOF);
if (gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{
gtk_css_parser_warn_syntax (scanner->parser, "Empty declaration");
gtk_css_parser_end_block (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
return;
}
@@ -1010,7 +944,6 @@ parse_declaration (GtkCssScanner *scanner,
if (name == NULL)
{
gtk_css_parser_end_block (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
return;
}
@@ -1018,6 +951,7 @@ parse_declaration (GtkCssScanner *scanner,
if (property)
{
+ GtkCssSection *section;
GtkCssValue *value;
if (!gtk_css_parser_try_token (scanner->parser, GTK_CSS_TOKEN_COLON))
@@ -1025,20 +959,15 @@ parse_declaration (GtkCssScanner *scanner,
gtk_css_parser_error_syntax (scanner->parser, "Expected ':'");
g_free (name);
gtk_css_parser_end_block (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
return;
}
- gtk_css_scanner_push_section (scanner);
-
value = _gtk_style_property_parse_value (property,
scanner->parser);
if (value == NULL)
{
gtk_css_parser_end_block (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
- gtk_css_scanner_pop_section (scanner);
return;
}
@@ -1050,11 +979,18 @@ parse_declaration (GtkCssScanner *scanner,
GTK_CSS_PARSER_ERROR_SYNTAX,
"Junk at end of value for %s", property->name);
gtk_css_parser_end_block (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
- gtk_css_scanner_pop_section (scanner);
return;
}
+ if (gtk_keep_css_sections)
+ {
+ section = gtk_css_section_new (gtk_css_parser_get_file (scanner->parser),
+ gtk_css_parser_get_block_location (scanner->parser),
+ gtk_css_parser_get_end_location (scanner->parser));
+ }
+ else
+ section = NULL;
+
if (GTK_IS_CSS_SHORTHAND_PROPERTY (property))
{
GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (property);
@@ -1065,14 +1001,15 @@ parse_declaration (GtkCssScanner *scanner,
GtkCssStyleProperty *child = _gtk_css_shorthand_property_get_subproperty (shorthand, i);
GtkCssValue *sub = _gtk_css_array_value_get_nth (value, i);
- gtk_css_ruleset_add (ruleset, child, _gtk_css_value_ref (sub), scanner->section);
+ gtk_css_ruleset_add (ruleset, child, _gtk_css_value_ref (sub), section);
}
_gtk_css_value_unref (value);
}
else if (GTK_IS_CSS_STYLE_PROPERTY (property))
{
- gtk_css_ruleset_add (ruleset, GTK_CSS_STYLE_PROPERTY (property), value, scanner->section);
+
+ gtk_css_ruleset_add (ruleset, GTK_CSS_STYLE_PROPERTY (property), value, section);
}
else
{
@@ -1080,8 +1017,7 @@ parse_declaration (GtkCssScanner *scanner,
_gtk_css_value_unref (value);
}
-
- gtk_css_scanner_pop_section (scanner);
+ g_clear_pointer (§ion, gtk_css_section_unref);
}
else
{
@@ -1091,7 +1027,6 @@ parse_declaration (GtkCssScanner *scanner,
g_free (name);
gtk_css_parser_end_block (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
}
static void
@@ -1110,14 +1045,11 @@ parse_ruleset (GtkCssScanner *scanner)
GSList *selectors;
GtkCssRuleset ruleset = { 0, };
- gtk_css_scanner_push_section (scanner);
-
selectors = parse_selector_list (scanner);
if (selectors == NULL)
{
gtk_css_parser_skip_until (scanner->parser, GTK_CSS_TOKEN_OPEN_CURLY);
gtk_css_parser_skip (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
return;
}
@@ -1131,7 +1063,6 @@ parse_ruleset (GtkCssScanner *scanner)
g_slist_free_full (selectors, (GDestroyNotify) _gtk_css_selector_free);
gtk_css_parser_skip_until (scanner->parser, GTK_CSS_TOKEN_OPEN_CURLY);
gtk_css_parser_skip (scanner->parser);
- gtk_css_scanner_pop_section (scanner);
return;
}
@@ -1143,7 +1074,6 @@ parse_ruleset (GtkCssScanner *scanner)
css_provider_commit (scanner->provider, selectors, &ruleset);
gtk_css_ruleset_clear (&ruleset);
- gtk_css_scanner_pop_section (scanner);
}
static void
@@ -1158,8 +1088,6 @@ parse_statement (GtkCssScanner *scanner)
static void
parse_stylesheet (GtkCssScanner *scanner)
{
- gtk_css_scanner_push_section (scanner);
-
while (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{
if (gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_CDO) ||
@@ -1171,8 +1099,6 @@ parse_stylesheet (GtkCssScanner *scanner)
parse_statement (scanner);
}
-
- gtk_css_scanner_pop_section (scanner);
}
static int
@@ -1248,13 +1174,10 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
{
GBytes *tmp_bytes = g_bytes_new_static ("", 0);
scanner = gtk_css_scanner_new (css_provider,
- NULL,
NULL,
file,
tmp_bytes);
g_bytes_unref (tmp_bytes);
-
- gtk_css_scanner_push_section (scanner);
}
else
scanner = parent;
@@ -1267,11 +1190,7 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
load_error->message);
if (parent == NULL)
- {
- gtk_css_scanner_pop_section (scanner);
-
- gtk_css_scanner_destroy (scanner);
- }
+ gtk_css_scanner_destroy (scanner);
}
}
@@ -1279,7 +1198,6 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
{
scanner = gtk_css_scanner_new (css_provider,
parent,
- parent ? parent->section : NULL,
file,
bytes);
diff --git a/gtk/gtkcsssection.c b/gtk/gtkcsssection.c
index c581ca952f..a1f1249457 100644
--- a/gtk/gtkcsssection.c
+++ b/gtk/gtkcsssection.c
@@ -28,42 +28,43 @@ struct _GtkCssSection
GtkCssSection *parent;
GFile *file;
GtkCssLocation start_location;
- GtkCssParser *parser; /* parser if section isn't finished parsing yet or %NULL */
GtkCssLocation end_location; /* end location if parser is %NULL */
};
G_DEFINE_BOXED_TYPE (GtkCssSection, gtk_css_section, gtk_css_section_ref, gtk_css_section_unref)
+/**
+ * gtk_css_section_new: (constructor)
+ * @file: (optional) (transfer none): The file this section refers to
+ * @start: The start location
+ * @end: The end location
+ *
+ * Creates a new #GtkCssSection referring to the section
+ * in the given @file from the @start location to the
+ * @end location.
+ *
+ * Returns: a new #GtkCssSection
+ **/
GtkCssSection *
-gtk_css_section_new_for_parser (GtkCssSection *parent,
- GtkCssParser *parser)
+gtk_css_section_new (GFile *file,
+ const GtkCssLocation *start,
+ const GtkCssLocation *end)
{
- GtkCssSection *section;
+ GtkCssSection *result;
- gtk_internal_return_val_if_fail (parser != NULL, NULL);
+ gtk_internal_return_val_if_fail (file == NULL || G_IS_FILE (file), NULL);
+ gtk_internal_return_val_if_fail (start != NULL, NULL);
+ gtk_internal_return_val_if_fail (end != NULL, NULL);
- section = g_slice_new0 (GtkCssSection);
+ result = g_slice_new0 (GtkCssSection);
- section->ref_count = 1;
- if (parent)
- section->parent = gtk_css_section_ref (parent);
- section->file = gtk_css_parser_get_file (parser);
- if (section->file)
- g_object_ref (section->file);
- section->parser = parser;
- section->start_location = *gtk_css_parser_get_start_location (section->parser);
+ result->ref_count = 1;
+ if (file)
+ result->file = g_object_ref (file);
+ result->start_location = *start;
+ result->end_location = *end;
- return section;
-}
-
-void
-_gtk_css_section_end (GtkCssSection *section)
-{
- gtk_internal_return_if_fail (section != NULL);
- gtk_internal_return_if_fail (section->parser != NULL);
-
- section->end_location = *gtk_css_parser_get_end_location (section->parser);
- section->parser = NULL;
+ return result;
}
/**
@@ -180,9 +181,6 @@ gtk_css_section_get_end_location (const GtkCssSection *section)
{
gtk_internal_return_val_if_fail (section != NULL, NULL);
- if (section->parser)
- return gtk_css_parser_get_end_location (section->parser);
-
return §ion->end_location;
}
diff --git a/gtk/gtkcsssection.h b/gtk/gtkcsssection.h
index 5763aad204..1fd56eab3f 100644
--- a/gtk/gtkcsssection.h
+++ b/gtk/gtkcsssection.h
@@ -37,6 +37,10 @@ typedef struct _GtkCssSection GtkCssSection;
GDK_AVAILABLE_IN_ALL
GType gtk_css_section_get_type (void) G_GNUC_CONST;
+GDK_AVAILABLE_IN_ALL
+GtkCssSection * gtk_css_section_new (GFile *file,
+ const GtkCssLocation *start,
+ const GtkCssLocation *end);
GDK_AVAILABLE_IN_ALL
GtkCssSection * gtk_css_section_ref (GtkCssSection *section);
GDK_AVAILABLE_IN_ALL
diff --git a/gtk/gtkcsssectionprivate.h b/gtk/gtkcsssectionprivate.h
index 39ec70266b..863ee2bd4f 100644
--- a/gtk/gtkcsssectionprivate.h
+++ b/gtk/gtkcsssectionprivate.h
@@ -24,11 +24,6 @@
G_BEGIN_DECLS
-GtkCssSection * gtk_css_section_new_for_parser (GtkCssSection *parent,
- GtkCssParser *parser);
-
-void _gtk_css_section_end (GtkCssSection *section);
-
void _gtk_css_section_print (const GtkCssSection *section,
GString *string);
char * _gtk_css_section_to_string (const GtkCssSection *section);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]