diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-01-28 19:36:24 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-01-28 19:36:24 -0500 |
commit | e3e021d757bde46b149ae795fd7e9ac51ee44a65 (patch) | |
tree | 014cabd7b8f75b19eb07f5ac56d877c8750d167c /gtk/gtkcssprovider.c | |
parent | 477557b1d40a042c672b17ef04c66eb3dbe64347 (diff) | |
download | gtk+-key-themes.tar.gz |
Improve binding-set parserkey-themes
Make gtk_binding_entry_add_signal_from_string() return the expected
token in case of parsing error, so that we can return a GError
instead of spewing. Also, add a separate scope for binding-set,
since allowing {} in identifiers in SCOPE_VALUE breaks the fact
that the ; after the last assignment in a rule is optional.
Diffstat (limited to 'gtk/gtkcssprovider.c')
-rw-r--r-- | gtk/gtkcssprovider.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 1c5441f567..7313bba534 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -801,7 +801,8 @@ enum ParserScope { SCOPE_PSEUDO_CLASS, SCOPE_NTH_CHILD, SCOPE_DECLARATION, - SCOPE_VALUE + SCOPE_VALUE, + SCOPE_BINDING_SET }; /* Extend GtkStateType, since these @@ -1507,6 +1508,12 @@ scanner_apply_scope (GScanner *scanner, if (scope == SCOPE_VALUE) { scanner->config->cset_identifier_first = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_"; + scanner->config->cset_identifier_nth = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_ +(),.%\t\n'/\""; + scanner->config->scan_identifier_1char = TRUE; + } + else if (scope == SCOPE_BINDING_SET) + { + scanner->config->cset_identifier_first = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_"; scanner->config->cset_identifier_nth = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_ +(){}<>,.%\t\n'/\""; scanner->config->scan_identifier_1char = TRUE; } @@ -3318,19 +3325,27 @@ parse_rule (GtkCssProvider *css_provider, if (scanner->token != G_TOKEN_LEFT_CURLY) return G_TOKEN_LEFT_CURLY; - css_provider_push_scope (css_provider, SCOPE_VALUE); + css_provider_push_scope (css_provider, SCOPE_BINDING_SET); g_scanner_get_next_token (scanner); do { + GTokenType ret; + if (scanner->token != G_TOKEN_IDENTIFIER) { scanner->user_data = "Binding definition"; return G_TOKEN_IDENTIFIER; } - gtk_binding_entry_add_signal_from_string (binding_set, - scanner->value.v_identifier); + ret = gtk_binding_entry_add_signal_from_string (binding_set, + scanner->value.v_identifier); + if (ret != G_TOKEN_NONE) + { + scanner->user_data = "Binding definition"; + return ret; + } + g_scanner_get_next_token (scanner); if (scanner->token != ';') |