summaryrefslogtreecommitdiff
path: root/gtk/gtkcssprovider.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2011-01-28 01:52:03 +0100
committerMatthias Clasen <mclasen@redhat.com>2011-01-30 21:24:51 -0500
commitdbff92fd9f4f4ba2af5f0db9ddee8641c559bc7d (patch)
tree59ff363bdebd55b31b4f9e1e228bbdaa32655c52 /gtk/gtkcssprovider.c
parent53ca6eb0b5b821bde2d96b873f0e02588aa2a7fb (diff)
downloadgtk+-dbff92fd9f4f4ba2af5f0db9ddee8641c559bc7d.tar.gz
Add @binding-set rules to the CSS parser
these custom rules can be used to define key themes as in the RC files, a series of bind/unbind rules may be added then: @binding foo-bar { bind "<alt>1" { "move-cursor" (visual-positions, 1, 0) }; unbind "<ctl>d" }
Diffstat (limited to 'gtk/gtkcssprovider.c')
-rw-r--r--gtk/gtkcssprovider.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 45324fc9fc..70461e2b3b 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -33,6 +33,7 @@
#include "gtkthemingengine.h"
#include "gtkstyleprovider.h"
#include "gtkstylecontextprivate.h"
+#include "gtkbindings.h"
#include "gtkprivate.h"
/**
@@ -1475,7 +1476,7 @@ 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->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_SELECTOR)
@@ -3233,6 +3234,60 @@ parse_rule (GtkCssProvider *css_provider,
else
return G_TOKEN_NONE;
}
+ else if (strcmp (directive, "binding-set") == 0)
+ {
+ GtkBindingSet *binding_set;
+ gchar *binding_set_name;
+
+ g_scanner_get_next_token (scanner);
+
+ if (scanner->token != G_TOKEN_IDENTIFIER)
+ {
+ scanner->user_data = "Binding name";
+ return G_TOKEN_IDENTIFIER;
+ }
+
+ binding_set_name = scanner->value.v_identifier;
+ binding_set = gtk_binding_set_find (scanner->value.v_identifier);
+
+ if (!binding_set)
+ {
+ binding_set = gtk_binding_set_new (scanner->value.v_identifier);
+ binding_set->parsed = TRUE;
+ }
+
+ g_scanner_get_next_token (scanner);
+
+ if (scanner->token != G_TOKEN_LEFT_CURLY)
+ return G_TOKEN_LEFT_CURLY;
+
+ css_provider_push_scope (css_provider, SCOPE_VALUE);
+ g_scanner_get_next_token (scanner);
+
+ do
+ {
+ 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);
+ g_scanner_get_next_token (scanner);
+
+ if (scanner->token != ';')
+ return ';';
+
+ g_scanner_get_next_token (scanner);
+ }
+ while (scanner->token != G_TOKEN_RIGHT_CURLY);
+
+ css_provider_pop_scope (css_provider);
+ g_scanner_get_next_token (scanner);
+
+ return G_TOKEN_NONE;
+ }
else
{
scanner->user_data = "Directive";