summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog27
-rw-r--r--ChangeLog.pre-2-027
-rw-r--r--ChangeLog.pre-2-1027
-rw-r--r--ChangeLog.pre-2-227
-rw-r--r--ChangeLog.pre-2-427
-rw-r--r--ChangeLog.pre-2-627
-rw-r--r--ChangeLog.pre-2-827
-rw-r--r--gtk/gtk.defs31
-rw-r--r--gtk/gtkbindings.c287
-rw-r--r--gtk/gtkbindings.h1
-rw-r--r--gtk/gtkrc.c309
-rw-r--r--gtk/gtkrc.h44
-rw-r--r--gtk/gtktypebuiltins.h3
-rw-r--r--gtk/gtktypebuiltins_evals.c30
-rw-r--r--gtk/gtktypebuiltins_ids.c2
-rw-r--r--gtk/gtktypebuiltins_vars.c1
-rw-r--r--gtk/gtkwidget.c13
-rw-r--r--gtk/testgtk.c11
-rw-r--r--gtk/testgtkrc25
-rw-r--r--tests/testgtk.c11
-rw-r--r--tests/testgtkrc25
21 files changed, 835 insertions, 147 deletions
diff --git a/ChangeLog b/ChangeLog
index 13a21e47c..5d37892fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+Thu Jul 23 00:11:39 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtkrc: introduce testbindings on C-1 for buttons,
+ to check out binding priorities. someone should really write
+ gtkrc-mode for emacs.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): remove ugly bindings test.
+ * gtk/testgtk.c (main): and move it here ;). this test says something
+ on release of C-9. (this works only if the mouse pointer is on a
+ spinbutton and there is no focus widget).
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c:
+ export gtk_rc_parse_color, gtk_rc_parse_state and a new function
+ gtk_rc_parse_priority to parse path priority types.
+ export rc tokens.
+ feature binding parsing.
+
+Wed Jul 22 23:41:17 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/gtkbindings.h:
+ * gtk/gtkbindings.c: new function gtk_binding_parse_binding() to
+ feature binding parsing in rc files.
+ * gtk/gtkbindings.c (gtk_binding_set_new): bug fix.
+ * gtk/gtkbindings.c (gtk_binding_pattern_compare): bug fix, we used to
+ order the bindings with lowest priority first.
+
Wed Jul 22 15:21:08 PDT 1998 Manish Singh <yosh@gimp.org>
* gdk/gdkrgb.c: actually builds and runs properly on big
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index 13a21e47c..5d37892fb 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,30 @@
+Thu Jul 23 00:11:39 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtkrc: introduce testbindings on C-1 for buttons,
+ to check out binding priorities. someone should really write
+ gtkrc-mode for emacs.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): remove ugly bindings test.
+ * gtk/testgtk.c (main): and move it here ;). this test says something
+ on release of C-9. (this works only if the mouse pointer is on a
+ spinbutton and there is no focus widget).
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c:
+ export gtk_rc_parse_color, gtk_rc_parse_state and a new function
+ gtk_rc_parse_priority to parse path priority types.
+ export rc tokens.
+ feature binding parsing.
+
+Wed Jul 22 23:41:17 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/gtkbindings.h:
+ * gtk/gtkbindings.c: new function gtk_binding_parse_binding() to
+ feature binding parsing in rc files.
+ * gtk/gtkbindings.c (gtk_binding_set_new): bug fix.
+ * gtk/gtkbindings.c (gtk_binding_pattern_compare): bug fix, we used to
+ order the bindings with lowest priority first.
+
Wed Jul 22 15:21:08 PDT 1998 Manish Singh <yosh@gimp.org>
* gdk/gdkrgb.c: actually builds and runs properly on big
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 13a21e47c..5d37892fb 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,30 @@
+Thu Jul 23 00:11:39 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtkrc: introduce testbindings on C-1 for buttons,
+ to check out binding priorities. someone should really write
+ gtkrc-mode for emacs.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): remove ugly bindings test.
+ * gtk/testgtk.c (main): and move it here ;). this test says something
+ on release of C-9. (this works only if the mouse pointer is on a
+ spinbutton and there is no focus widget).
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c:
+ export gtk_rc_parse_color, gtk_rc_parse_state and a new function
+ gtk_rc_parse_priority to parse path priority types.
+ export rc tokens.
+ feature binding parsing.
+
+Wed Jul 22 23:41:17 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/gtkbindings.h:
+ * gtk/gtkbindings.c: new function gtk_binding_parse_binding() to
+ feature binding parsing in rc files.
+ * gtk/gtkbindings.c (gtk_binding_set_new): bug fix.
+ * gtk/gtkbindings.c (gtk_binding_pattern_compare): bug fix, we used to
+ order the bindings with lowest priority first.
+
Wed Jul 22 15:21:08 PDT 1998 Manish Singh <yosh@gimp.org>
* gdk/gdkrgb.c: actually builds and runs properly on big
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index 13a21e47c..5d37892fb 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,30 @@
+Thu Jul 23 00:11:39 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtkrc: introduce testbindings on C-1 for buttons,
+ to check out binding priorities. someone should really write
+ gtkrc-mode for emacs.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): remove ugly bindings test.
+ * gtk/testgtk.c (main): and move it here ;). this test says something
+ on release of C-9. (this works only if the mouse pointer is on a
+ spinbutton and there is no focus widget).
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c:
+ export gtk_rc_parse_color, gtk_rc_parse_state and a new function
+ gtk_rc_parse_priority to parse path priority types.
+ export rc tokens.
+ feature binding parsing.
+
+Wed Jul 22 23:41:17 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/gtkbindings.h:
+ * gtk/gtkbindings.c: new function gtk_binding_parse_binding() to
+ feature binding parsing in rc files.
+ * gtk/gtkbindings.c (gtk_binding_set_new): bug fix.
+ * gtk/gtkbindings.c (gtk_binding_pattern_compare): bug fix, we used to
+ order the bindings with lowest priority first.
+
Wed Jul 22 15:21:08 PDT 1998 Manish Singh <yosh@gimp.org>
* gdk/gdkrgb.c: actually builds and runs properly on big
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 13a21e47c..5d37892fb 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,30 @@
+Thu Jul 23 00:11:39 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtkrc: introduce testbindings on C-1 for buttons,
+ to check out binding priorities. someone should really write
+ gtkrc-mode for emacs.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): remove ugly bindings test.
+ * gtk/testgtk.c (main): and move it here ;). this test says something
+ on release of C-9. (this works only if the mouse pointer is on a
+ spinbutton and there is no focus widget).
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c:
+ export gtk_rc_parse_color, gtk_rc_parse_state and a new function
+ gtk_rc_parse_priority to parse path priority types.
+ export rc tokens.
+ feature binding parsing.
+
+Wed Jul 22 23:41:17 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/gtkbindings.h:
+ * gtk/gtkbindings.c: new function gtk_binding_parse_binding() to
+ feature binding parsing in rc files.
+ * gtk/gtkbindings.c (gtk_binding_set_new): bug fix.
+ * gtk/gtkbindings.c (gtk_binding_pattern_compare): bug fix, we used to
+ order the bindings with lowest priority first.
+
Wed Jul 22 15:21:08 PDT 1998 Manish Singh <yosh@gimp.org>
* gdk/gdkrgb.c: actually builds and runs properly on big
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 13a21e47c..5d37892fb 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,30 @@
+Thu Jul 23 00:11:39 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtkrc: introduce testbindings on C-1 for buttons,
+ to check out binding priorities. someone should really write
+ gtkrc-mode for emacs.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): remove ugly bindings test.
+ * gtk/testgtk.c (main): and move it here ;). this test says something
+ on release of C-9. (this works only if the mouse pointer is on a
+ spinbutton and there is no focus widget).
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c:
+ export gtk_rc_parse_color, gtk_rc_parse_state and a new function
+ gtk_rc_parse_priority to parse path priority types.
+ export rc tokens.
+ feature binding parsing.
+
+Wed Jul 22 23:41:17 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/gtkbindings.h:
+ * gtk/gtkbindings.c: new function gtk_binding_parse_binding() to
+ feature binding parsing in rc files.
+ * gtk/gtkbindings.c (gtk_binding_set_new): bug fix.
+ * gtk/gtkbindings.c (gtk_binding_pattern_compare): bug fix, we used to
+ order the bindings with lowest priority first.
+
Wed Jul 22 15:21:08 PDT 1998 Manish Singh <yosh@gimp.org>
* gdk/gdkrgb.c: actually builds and runs properly on big
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 13a21e47c..5d37892fb 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,30 @@
+Thu Jul 23 00:11:39 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtkrc: introduce testbindings on C-1 for buttons,
+ to check out binding priorities. someone should really write
+ gtkrc-mode for emacs.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): remove ugly bindings test.
+ * gtk/testgtk.c (main): and move it here ;). this test says something
+ on release of C-9. (this works only if the mouse pointer is on a
+ spinbutton and there is no focus widget).
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c:
+ export gtk_rc_parse_color, gtk_rc_parse_state and a new function
+ gtk_rc_parse_priority to parse path priority types.
+ export rc tokens.
+ feature binding parsing.
+
+Wed Jul 22 23:41:17 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/gtkbindings.h:
+ * gtk/gtkbindings.c: new function gtk_binding_parse_binding() to
+ feature binding parsing in rc files.
+ * gtk/gtkbindings.c (gtk_binding_set_new): bug fix.
+ * gtk/gtkbindings.c (gtk_binding_pattern_compare): bug fix, we used to
+ order the bindings with lowest priority first.
+
Wed Jul 22 15:21:08 PDT 1998 Manish Singh <yosh@gimp.org>
* gdk/gdkrgb.c: actually builds and runs properly on big
diff --git a/gtk/gtk.defs b/gtk/gtk.defs
index 6d9a02889..754230856 100644
--- a/gtk/gtk.defs
+++ b/gtk/gtk.defs
@@ -299,6 +299,37 @@
(bottom-to-top GTK_PROGRESS_BOTTOM_TO_TOP)
(top-to-bottom GTK_PROGRESS_TOP_TO_BOTTOM))
+; enumerations from "./gtkrc.h"
+
+(define-enum GtkRcTokenType
+ (invalid GTK_RC_TOKEN_INVALID)
+ (include GTK_RC_TOKEN_INCLUDE)
+ (normal GTK_RC_TOKEN_NORMAL)
+ (active GTK_RC_TOKEN_ACTIVE)
+ (prelight GTK_RC_TOKEN_PRELIGHT)
+ (selected GTK_RC_TOKEN_SELECTED)
+ (insensitive GTK_RC_TOKEN_INSENSITIVE)
+ (fg GTK_RC_TOKEN_FG)
+ (bg GTK_RC_TOKEN_BG)
+ (base GTK_RC_TOKEN_BASE)
+ (text GTK_RC_TOKEN_TEXT)
+ (font GTK_RC_TOKEN_FONT)
+ (fontset GTK_RC_TOKEN_FONTSET)
+ (bg-pixmap GTK_RC_TOKEN_BG_PIXMAP)
+ (pixmap-path GTK_RC_TOKEN_PIXMAP_PATH)
+ (style GTK_RC_TOKEN_STYLE)
+ (binding GTK_RC_TOKEN_BINDING)
+ (bind GTK_RC_TOKEN_BIND)
+ (widget GTK_RC_TOKEN_WIDGET)
+ (widget-class GTK_RC_TOKEN_WIDGET_CLASS)
+ (class GTK_RC_TOKEN_CLASS)
+ (lowest GTK_RC_TOKEN_LOWEST)
+ (gtk GTK_RC_TOKEN_GTK)
+ (application GTK_RC_TOKEN_APPLICATION)
+ (rc GTK_RC_TOKEN_RC)
+ (highest GTK_RC_TOKEN_HIGHEST)
+ (last GTK_RC_TOKEN_LAST))
+
; enumerations from "./gtkspinbutton.h"
(define-enum GtkSpinButtonUpdatePolicy
diff --git a/gtk/gtkbindings.c b/gtk/gtkbindings.c
index 12ed21c49..b991ca85c 100644
--- a/gtk/gtkbindings.c
+++ b/gtk/gtkbindings.c
@@ -25,6 +25,7 @@
#include "gtkbindings.h"
#include "gtksignal.h"
#include "gtkwidget.h"
+#include "gtkrc.h"
/* --- defines --- */
@@ -302,10 +303,12 @@ binding_compose_params (GtkBindingArg *args,
valid = FALSE;
break;
case GTK_TYPE_STRING:
- if (param_ftype == GTK_TYPE_STRING)
+ if (args->arg_type == GTK_TYPE_STRING &&
+ param_ftype == GTK_TYPE_STRING)
GTK_VALUE_STRING (*params) = args->d.string_data;
- else if (param_ftype == GTK_TYPE_ENUM ||
- param_ftype == GTK_TYPE_FLAGS)
+ else if (args->arg_type == GTK_TYPE_IDENTIFIER &&
+ (param_ftype == GTK_TYPE_ENUM ||
+ param_ftype == GTK_TYPE_FLAGS))
{
/* FIXME: we need identifier lookups here */
valid = FALSE;
@@ -421,7 +424,7 @@ gtk_binding_set_new (const gchar *set_name)
binding_set->entries = NULL;
binding_set->current = NULL;
- binding_set_list = g_slist_prepend (NULL, binding_set);
+ binding_set_list = g_slist_prepend (binding_set_list, binding_set);
return binding_set;
}
@@ -790,13 +793,17 @@ binding_match_activate (GSList *pspec_list,
}
static gint
-gtk_binding_pattern_compare (gconstpointer a,
- gconstpointer b)
+gtk_binding_pattern_compare (gconstpointer new_pattern,
+ gconstpointer existing_pattern)
{
- register const GtkPatternSpec *pa = a;
- register const GtkPatternSpec *pb = b;
+ register const GtkPatternSpec *np = new_pattern;
+ register const GtkPatternSpec *ep = existing_pattern;
- return pa->seq_id < pb->seq_id ? -1 : 1;
+ /* walk the list as long as the existing patterns have
+ * higher priorities.
+ */
+
+ return np->seq_id < ep->seq_id;
}
static inline GSList*
@@ -1169,3 +1176,265 @@ gtk_pattern_spec_free_segs (GtkPatternSpec *pspec)
g_free (pspec->pattern_reversed);
pspec->pattern_reversed = NULL;
}
+
+static guint
+gtk_binding_parse_signal (GScanner *scanner,
+ GtkBindingSet *binding_set,
+ guint keyval,
+ guint modifiers)
+{
+ gchar *signal;
+ guint expected_token = 0;
+ GSList *args;
+ GSList *slist;
+ gboolean done;
+ gboolean negate;
+ gboolean need_arg;
+ gboolean seen_comma;
+
+ g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+
+ g_scanner_get_next_token (scanner);
+ if (scanner->token != G_TOKEN_STRING)
+ return G_TOKEN_STRING;
+ g_scanner_peek_next_token (scanner);
+ if (scanner->next_token != '(')
+ {
+ g_scanner_get_next_token (scanner);
+ return '(';
+ }
+ signal = g_strdup (scanner->value.v_string);
+ g_scanner_get_next_token (scanner);
+
+ negate = FALSE;
+ args = NULL;
+ done = FALSE;
+ need_arg = TRUE;
+ seen_comma = FALSE;
+ scanner->config->scan_symbols = FALSE;
+ do
+ {
+ if (need_arg)
+ expected_token = G_TOKEN_INT;
+ else
+ expected_token = ')';
+ g_scanner_get_next_token (scanner);
+ switch (scanner->token)
+ {
+ GtkBindingArg *arg;
+
+ case G_TOKEN_FLOAT:
+ if (need_arg)
+ {
+ need_arg = FALSE;
+ arg = g_new (GtkBindingArg, 1);
+ arg->arg_type = GTK_TYPE_DOUBLE;
+ arg->d.double_data = scanner->value.v_float;
+ if (negate)
+ {
+ arg->d.double_data = - arg->d.double_data;
+ negate = FALSE;
+ }
+ args = g_slist_prepend (args, arg);
+ }
+ else
+ done = TRUE;
+ break;
+ case G_TOKEN_INT:
+ if (need_arg)
+ {
+ need_arg = FALSE;
+ arg = g_new (GtkBindingArg, 1);
+ arg->arg_type = GTK_TYPE_LONG;
+ arg->d.long_data = scanner->value.v_int;
+ if (negate)
+ {
+ arg->d.long_data = - arg->d.long_data;
+ negate = FALSE;
+ }
+ args = g_slist_prepend (args, arg);
+ }
+ else
+ done = TRUE;
+ break;
+ case G_TOKEN_STRING:
+ if (need_arg && !negate)
+ {
+ need_arg = FALSE;
+ arg = g_new (GtkBindingArg, 1);
+ arg->arg_type = GTK_TYPE_STRING;
+ arg->d.string_data = g_strdup (scanner->value.v_string);
+ args = g_slist_prepend (args, arg);
+ }
+ else
+ done = TRUE;
+ break;
+ case G_TOKEN_IDENTIFIER:
+ if (need_arg && !negate)
+ {
+ need_arg = FALSE;
+ arg = g_new (GtkBindingArg, 1);
+ arg->arg_type = GTK_TYPE_IDENTIFIER;
+ arg->d.string_data = g_strdup (scanner->value.v_identifier);
+ args = g_slist_prepend (args, arg);
+ }
+ else
+ done = TRUE;
+ break;
+ case '-':
+ if (!need_arg)
+ done = TRUE;
+ else if (negate)
+ {
+ expected_token = G_TOKEN_INT;
+ done = TRUE;
+ }
+ else
+ negate = TRUE;
+ break;
+ case ',':
+ seen_comma = TRUE;
+ if (need_arg)
+ done = TRUE;
+ else
+ need_arg = TRUE;
+ break;
+ case ')':
+ if (!(need_arg && seen_comma) && !negate)
+ {
+ args = g_slist_reverse (args);
+ gtk_binding_entry_add_signall (binding_set,
+ keyval,
+ modifiers,
+ signal,
+ args);
+ expected_token = G_TOKEN_NONE;
+ }
+ done = TRUE;
+ break;
+ default:
+ done = TRUE;
+ break;
+ }
+ }
+ while (!done);
+ scanner->config->scan_symbols = TRUE;
+
+ for (slist = args; slist; slist = slist->next)
+ {
+ GtkBindingArg *arg;
+
+ arg = slist->data;
+ if (GTK_FUNDAMENTAL_TYPE (arg->arg_type) == GTK_TYPE_STRING)
+ g_free (arg->d.string_data);
+ g_free (arg);
+ }
+ g_slist_free (args);
+ g_free (signal);
+
+ return expected_token;
+}
+
+static inline guint
+gtk_binding_parse_bind (GScanner *scanner,
+ GtkBindingSet *binding_set)
+{
+ guint keyval = 0;
+ guint modifiers = 0;
+
+ g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+
+ g_scanner_get_next_token (scanner);
+ if (scanner->token != GTK_RC_TOKEN_BIND)
+ return GTK_RC_TOKEN_BIND;
+ g_scanner_get_next_token (scanner);
+ if (scanner->token != G_TOKEN_STRING)
+ return G_TOKEN_STRING;
+ gtk_accelerator_parse (scanner->value.v_string, &keyval, &modifiers);
+ modifiers &= BINDING_MOD_MASK ();
+ if (keyval == 0)
+ return G_TOKEN_STRING;
+
+ g_scanner_get_next_token (scanner);
+ if (scanner->token != '{')
+ return '{';
+
+ gtk_binding_entry_clear (binding_set, keyval, modifiers);
+
+ g_scanner_peek_next_token (scanner);
+ while (scanner->next_token != '}')
+ {
+ switch (scanner->next_token)
+ {
+ guint expected_token;
+
+ case G_TOKEN_STRING:
+ expected_token = gtk_binding_parse_signal (scanner,
+ binding_set,
+ keyval,
+ modifiers);
+ if (expected_token != G_TOKEN_NONE)
+ return expected_token;
+ break;
+ default:
+ g_scanner_get_next_token (scanner);
+ return '}';
+ }
+ g_scanner_peek_next_token (scanner);
+ }
+ g_scanner_get_next_token (scanner);
+
+ return G_TOKEN_NONE;
+}
+
+guint
+gtk_binding_parse_binding (GScanner *scanner)
+{
+ gchar *name;
+ GtkBindingSet *binding_set;
+
+ g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+
+ g_scanner_get_next_token (scanner);
+ if (scanner->token != GTK_RC_TOKEN_BINDING)
+ return GTK_RC_TOKEN_BINDING;
+ g_scanner_get_next_token (scanner);
+ if (scanner->token != G_TOKEN_STRING)
+ return G_TOKEN_STRING;
+ name = g_strdup (scanner->value.v_string);
+
+ g_scanner_get_next_token (scanner);
+ if (scanner->token != '{')
+ {
+ g_free (name);
+ return G_TOKEN_STRING;
+ }
+
+ binding_set = gtk_binding_set_find (name);
+ if (!binding_set)
+ binding_set = gtk_binding_set_new (name);
+ g_free (name);
+
+ g_scanner_peek_next_token (scanner);
+ while (scanner->next_token != '}')
+ {
+ switch (scanner->next_token)
+ {
+ guint expected_token;
+
+ case GTK_RC_TOKEN_BIND:
+ expected_token = gtk_binding_parse_bind (scanner, binding_set);
+ if (expected_token != G_TOKEN_NONE)
+ return expected_token;
+ break;
+ default:
+ g_scanner_get_next_token (scanner);
+ return '}';
+ }
+ g_scanner_peek_next_token (scanner);
+ }
+ g_scanner_get_next_token (scanner);
+
+ return G_TOKEN_NONE;
+}
+
diff --git a/gtk/gtkbindings.h b/gtk/gtkbindings.h
index fc3012ba6..b9e173203 100644
--- a/gtk/gtkbindings.h
+++ b/gtk/gtkbindings.h
@@ -152,6 +152,7 @@ void gtk_binding_entry_add_signall (GtkBindingSet *binding_set,
guint modifiers,
const gchar *signal_name,
GSList *binding_args);
+guint gtk_binding_parse_binding (GScanner *scanner);
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index 7fc8ca826..adfa045a6 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -94,10 +94,6 @@ static guint gtk_rc_parse_font (GScanner *scanner,
GtkRcStyle *rc_style);
static guint gtk_rc_parse_fontset (GScanner *scanner,
GtkRcStyle *rc_style);
-static guint gtk_rc_parse_state (GScanner *scanner,
- GtkStateType *state);
-static guint gtk_rc_parse_color (GScanner *scanner,
- GdkColor *color);
static guint gtk_rc_parse_pixmap_path (GScanner *scanner);
static void gtk_rc_parse_pixmap_path_string (gchar *pix_path);
static char* gtk_rc_find_pixmap_in_path (GScanner *scanner,
@@ -122,10 +118,8 @@ static GScannerConfig gtk_rc_scanner_config =
) /* cset_identifier_first */,
(
G_CSET_a_2_z
- "_0123456789"
+ "_-0123456789"
G_CSET_A_2_Z
- G_CSET_LATINS
- G_CSET_LATINC
) /* cset_identifier_nth */,
( "#\n" ) /* cpair_comment_single */,
@@ -147,33 +141,10 @@ static GScannerConfig gtk_rc_scanner_config =
TRUE /* scan_string_dq */,
TRUE /* numbers_2_int */,
FALSE /* int_2_float */,
- TRUE /* identifier_2_string */,
+ FALSE /* identifier_2_string */,
TRUE /* char_2_token */,
TRUE /* symbol_2_token */,
-};
-
-enum {
- TOKEN_INVALID = G_TOKEN_LAST,
- TOKEN_INCLUDE,
- TOKEN_NORMAL,
- TOKEN_ACTIVE,
- TOKEN_PRELIGHT,
- TOKEN_SELECTED,
- TOKEN_INSENSITIVE,
- TOKEN_FG,
- TOKEN_BG,
- TOKEN_BASE,
- TOKEN_TEXT,
- TOKEN_FONT,
- TOKEN_FONTSET,
- TOKEN_BG_PIXMAP,
- TOKEN_PIXMAP_PATH,
- TOKEN_STYLE,
- TOKEN_BINDING,
- TOKEN_WIDGET,
- TOKEN_WIDGET_CLASS,
- TOKEN_CLASS,
- TOKEN_LAST
+ FALSE /* scope_0_fallback */,
};
static struct
@@ -181,27 +152,34 @@ static struct
gchar *name;
guint token;
} symbols[] = {
- { "include", TOKEN_INCLUDE },
- { "NORMAL", TOKEN_NORMAL },
- { "ACTIVE", TOKEN_ACTIVE },
- { "PRELIGHT", TOKEN_PRELIGHT },
- { "SELECTED", TOKEN_SELECTED },
- { "INSENSITIVE", TOKEN_INSENSITIVE },
- { "fg", TOKEN_FG },
- { "bg", TOKEN_BG },
- { "base", TOKEN_BASE },
- { "text", TOKEN_TEXT },
- { "font", TOKEN_FONT },
- { "fontset", TOKEN_FONTSET },
- { "bg_pixmap", TOKEN_BG_PIXMAP },
- { "pixmap_path", TOKEN_PIXMAP_PATH },
- { "style", TOKEN_STYLE },
- { "binding", TOKEN_BINDING },
- { "widget", TOKEN_WIDGET },
- { "widget_class", TOKEN_WIDGET_CLASS },
- { "class", TOKEN_CLASS },
+ { "include", GTK_RC_TOKEN_INCLUDE },
+ { "NORMAL", GTK_RC_TOKEN_NORMAL },
+ { "ACTIVE", GTK_RC_TOKEN_ACTIVE },
+ { "PRELIGHT", GTK_RC_TOKEN_PRELIGHT },
+ { "SELECTED", GTK_RC_TOKEN_SELECTED },
+ { "INSENSITIVE", GTK_RC_TOKEN_INSENSITIVE },
+ { "fg", GTK_RC_TOKEN_FG },
+ { "bg", GTK_RC_TOKEN_BG },
+ { "base", GTK_RC_TOKEN_BASE },
+ { "text", GTK_RC_TOKEN_TEXT },
+ { "font", GTK_RC_TOKEN_FONT },
+ { "fontset", GTK_RC_TOKEN_FONTSET },
+ { "bg_pixmap", GTK_RC_TOKEN_BG_PIXMAP },
+ { "pixmap_path", GTK_RC_TOKEN_PIXMAP_PATH },
+ { "style", GTK_RC_TOKEN_STYLE },
+ { "binding", GTK_RC_TOKEN_BINDING },
+ { "bind", GTK_RC_TOKEN_BIND },
+ { "widget", GTK_RC_TOKEN_WIDGET },
+ { "widget_class", GTK_RC_TOKEN_WIDGET_CLASS },
+ { "class", GTK_RC_TOKEN_CLASS },
+ { "lowest", GTK_RC_TOKEN_LOWEST },
+ { "gtk", GTK_RC_TOKEN_GTK },
+ { "application", GTK_RC_TOKEN_APPLICATION },
+ { "rc", GTK_RC_TOKEN_RC },
+ { "highest", GTK_RC_TOKEN_HIGHEST },
};
-static guint nsymbols = sizeof (symbols) / sizeof (symbols[0]);
+
+static guint n_symbols = sizeof (symbols) / sizeof (symbols[0]);
static GHashTable *rc_style_ht = NULL;
static GSList *gtk_rc_sets_widget = NULL;
@@ -592,9 +570,9 @@ gtk_rc_parse_any (const gchar *input_name,
g_scanner_input_text (scanner, input_string, strlen (input_string));
}
scanner->input_name = input_name;
-
+
g_scanner_freeze_symbol_table (scanner);
- for (i = 0; i < nsymbols; i++)
+ for (i = 0; i < n_symbols; i++)
g_scanner_add_symbol (scanner, symbols[i].name, GINT_TO_POINTER (symbols[i].token));
g_scanner_thaw_symbol_table (scanner);
@@ -615,25 +593,32 @@ gtk_rc_parse_any (const gchar *input_name,
gchar *msg;
msg = NULL;
- if (expected_token > TOKEN_INVALID &&
- expected_token < TOKEN_LAST)
- {
- for (i = 0; i < nsymbols; i++)
- if (symbols[i].token == expected_token)
- msg = symbols[i].name;
- if (msg)
- msg = g_strconcat ("e.g. `", msg, "'", NULL);
- }
- if (scanner->token > TOKEN_INVALID &&
- scanner->token < TOKEN_LAST)
+ symbol_name = NULL;
+ if (scanner->scope_id == 0)
{
- symbol_name = "???";
- for (i = 0; i < nsymbols; i++)
- if (symbols[i].token == scanner->token)
- symbol_name = symbols[i].name;
+ /* if we are in scope 0, we know the symbol names
+ * that are associated with certaintoken values.
+ * so we look them up to make the error messages
+ * more readable.
+ */
+ if (expected_token > GTK_RC_TOKEN_INVALID &&
+ expected_token < GTK_RC_TOKEN_LAST)
+ {
+ for (i = 0; i < n_symbols; i++)
+ if (symbols[i].token == expected_token)
+ msg = symbols[i].name;
+ if (msg)
+ msg = g_strconcat ("e.g. `", msg, "'", NULL);
+ }
+ if (scanner->token > GTK_RC_TOKEN_INVALID &&
+ scanner->token < GTK_RC_TOKEN_LAST)
+ {
+ symbol_name = "???";
+ for (i = 0; i < n_symbols; i++)
+ if (symbols[i].token == scanner->token)
+ symbol_name = symbols[i].name;
+ }
}
- else
- symbol_name = NULL;
g_scanner_unexp_token (scanner,
expected_token,
NULL,
@@ -776,10 +761,10 @@ gtk_rc_parse_statement (GScanner *scanner)
switch (token)
{
- case TOKEN_INCLUDE:
+ case GTK_RC_TOKEN_INCLUDE:
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_INCLUDE)
- return TOKEN_INCLUDE;
+ if (token != GTK_RC_TOKEN_INCLUDE)
+ return GTK_RC_TOKEN_INCLUDE;
token = g_scanner_get_next_token (scanner);
if (token != G_TOKEN_STRING)
@@ -788,24 +773,27 @@ gtk_rc_parse_statement (GScanner *scanner)
gtk_rc_parse_file (scanner->value.v_string, FALSE);
return G_TOKEN_NONE;
- case TOKEN_STYLE:
+ case GTK_RC_TOKEN_STYLE:
return gtk_rc_parse_style (scanner);
- case TOKEN_PIXMAP_PATH:
+ case GTK_RC_TOKEN_BINDING:
+ return gtk_binding_parse_binding (scanner);
+
+ case GTK_RC_TOKEN_PIXMAP_PATH:
return gtk_rc_parse_pixmap_path (scanner);
- case TOKEN_WIDGET:
+ case GTK_RC_TOKEN_WIDGET:
return gtk_rc_parse_path_pattern (scanner);
- case TOKEN_WIDGET_CLASS:
+ case GTK_RC_TOKEN_WIDGET_CLASS:
return gtk_rc_parse_path_pattern (scanner);
- case TOKEN_CLASS:
+ case GTK_RC_TOKEN_CLASS:
return gtk_rc_parse_path_pattern (scanner);
default:
g_scanner_get_next_token (scanner);
- return /* G_TOKEN_SYMBOL */ TOKEN_STYLE;
+ return /* G_TOKEN_SYMBOL */ GTK_RC_TOKEN_STYLE;
}
}
@@ -819,8 +807,8 @@ gtk_rc_parse_style (GScanner *scanner)
gint i;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_STYLE)
- return TOKEN_STYLE;
+ if (token != GTK_RC_TOKEN_STYLE)
+ return GTK_RC_TOKEN_STYLE;
token = g_scanner_get_next_token (scanner);
if (token != G_TOKEN_STRING)
@@ -913,25 +901,25 @@ gtk_rc_parse_style (GScanner *scanner)
{
switch (token)
{
- case TOKEN_BASE:
+ case GTK_RC_TOKEN_BASE:
token = gtk_rc_parse_base (scanner, rc_style->proto_style);
break;
- case TOKEN_BG:
+ case GTK_RC_TOKEN_BG:
token = gtk_rc_parse_bg (scanner, rc_style->proto_style);
break;
- case TOKEN_FG:
+ case GTK_RC_TOKEN_FG:
token = gtk_rc_parse_fg (scanner, rc_style->proto_style);
break;
- case TOKEN_TEXT:
+ case GTK_RC_TOKEN_TEXT:
token = gtk_rc_parse_text (scanner, rc_style->proto_style);
break;
- case TOKEN_BG_PIXMAP:
+ case GTK_RC_TOKEN_BG_PIXMAP:
token = gtk_rc_parse_bg_pixmap (scanner, rc_style);
break;
- case TOKEN_FONT:
+ case GTK_RC_TOKEN_FONT:
token = gtk_rc_parse_font (scanner, rc_style);
break;
- case TOKEN_FONTSET:
+ case GTK_RC_TOKEN_FONTSET:
token = gtk_rc_parse_fontset (scanner, rc_style);
break;
default:
@@ -993,8 +981,8 @@ gtk_rc_parse_base (GScanner *scanner,
guint token;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_BASE)
- return TOKEN_BASE;
+ if (token != GTK_RC_TOKEN_BASE)
+ return GTK_RC_TOKEN_BASE;
token = gtk_rc_parse_state (scanner, &state);
if (token != G_TOKEN_NONE)
@@ -1015,8 +1003,8 @@ gtk_rc_parse_bg (GScanner *scanner,
guint token;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_BG)
- return TOKEN_BG;
+ if (token != GTK_RC_TOKEN_BG)
+ return GTK_RC_TOKEN_BG;
token = gtk_rc_parse_state (scanner, &state);
if (token != G_TOKEN_NONE)
@@ -1037,8 +1025,8 @@ gtk_rc_parse_fg (GScanner *scanner,
guint token;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_FG)
- return TOKEN_FG;
+ if (token != GTK_RC_TOKEN_FG)
+ return GTK_RC_TOKEN_FG;
token = gtk_rc_parse_state (scanner, &state);
if (token != G_TOKEN_NONE)
@@ -1059,8 +1047,8 @@ gtk_rc_parse_text (GScanner *scanner,
guint token;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_TEXT)
- return TOKEN_TEXT;
+ if (token != GTK_RC_TOKEN_TEXT)
+ return GTK_RC_TOKEN_TEXT;
token = gtk_rc_parse_state (scanner, &state);
if (token != G_TOKEN_NONE)
@@ -1082,8 +1070,8 @@ gtk_rc_parse_bg_pixmap (GScanner *scanner,
gchar *pixmap_file;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_BG_PIXMAP)
- return TOKEN_BG_PIXMAP;
+ if (token != GTK_RC_TOKEN_BG_PIXMAP)
+ return GTK_RC_TOKEN_BG_PIXMAP;
token = gtk_rc_parse_state (scanner, &state);
if (token != G_TOKEN_NONE)
@@ -1148,8 +1136,8 @@ gtk_rc_parse_font (GScanner *scanner,
guint token;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_FONT)
- return TOKEN_FONT;
+ if (token != GTK_RC_TOKEN_FONT)
+ return GTK_RC_TOKEN_FONT;
token = g_scanner_get_next_token (scanner);
if (token != G_TOKEN_EQUAL_SIGN)
@@ -1173,8 +1161,8 @@ gtk_rc_parse_fontset (GScanner *scanner,
guint token;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_FONTSET)
- return TOKEN_FONTSET;
+ if (token != GTK_RC_TOKEN_FONTSET)
+ return GTK_RC_TOKEN_FONTSET;
token = g_scanner_get_next_token (scanner);
if (token != G_TOKEN_EQUAL_SIGN)
@@ -1191,11 +1179,21 @@ gtk_rc_parse_fontset (GScanner *scanner,
return G_TOKEN_NONE;
}
-static guint
+guint
gtk_rc_parse_state (GScanner *scanner,
GtkStateType *state)
{
+ guint old_scope;
guint token;
+
+ g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+ g_return_val_if_fail (state != NULL, G_TOKEN_ERROR);
+
+ /* we don't know where we got called from, so we reset the scope here.
+ * if we bail out due to errors, we *don't* reset the scope, so the
+ * error messaging code can make sense of our tokens.
+ */
+ old_scope = g_scanner_set_scope (scanner, 0);
token = g_scanner_get_next_token (scanner);
if (token != G_TOKEN_LEFT_BRACE)
@@ -1204,37 +1202,92 @@ gtk_rc_parse_state (GScanner *scanner,
token = g_scanner_get_next_token (scanner);
switch (token)
{
- case TOKEN_ACTIVE:
+ case GTK_RC_TOKEN_ACTIVE:
*state = GTK_STATE_ACTIVE;
break;
- case TOKEN_INSENSITIVE:
+ case GTK_RC_TOKEN_INSENSITIVE:
*state = GTK_STATE_INSENSITIVE;
break;
- case TOKEN_NORMAL:
+ case GTK_RC_TOKEN_NORMAL:
*state = GTK_STATE_NORMAL;
break;
- case TOKEN_PRELIGHT:
+ case GTK_RC_TOKEN_PRELIGHT:
*state = GTK_STATE_PRELIGHT;
break;
- case TOKEN_SELECTED:
+ case GTK_RC_TOKEN_SELECTED:
*state = GTK_STATE_SELECTED;
break;
default:
- return /* G_TOKEN_SYMBOL */ TOKEN_NORMAL;
+ return /* G_TOKEN_SYMBOL */ GTK_RC_TOKEN_NORMAL;
}
token = g_scanner_get_next_token (scanner);
if (token != G_TOKEN_RIGHT_BRACE)
return G_TOKEN_RIGHT_BRACE;
+ g_scanner_set_scope (scanner, old_scope);
+
return G_TOKEN_NONE;
}
-static guint
+guint
+gtk_rc_parse_priority (GScanner *scanner,
+ GtkPathPriorityType *priority)
+{
+ guint old_scope;
+ guint token;
+
+ g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+ g_return_val_if_fail (priority != NULL, G_TOKEN_ERROR);
+
+ /* we don't know where we got called from, so we reset the scope here.
+ * if we bail out due to errors, we *don't* reset the scope, so the
+ * error messaging code can make sense of our tokens.
+ */
+ old_scope = g_scanner_set_scope (scanner, 0);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != ':')
+ return ':';
+
+ token = g_scanner_get_next_token (scanner);
+ switch (token)
+ {
+ case GTK_RC_TOKEN_LOWEST:
+ *priority = GTK_PATH_PRIO_LOWEST;
+ break;
+ case GTK_RC_TOKEN_GTK:
+ *priority = GTK_PATH_PRIO_GTK;
+ break;
+ case GTK_RC_TOKEN_APPLICATION:
+ *priority = GTK_PATH_PRIO_APPLICATION;
+ break;
+ case GTK_RC_TOKEN_RC:
+ *priority = GTK_PATH_PRIO_RC;
+ break;
+ case GTK_RC_TOKEN_HIGHEST:
+ *priority = GTK_PATH_PRIO_HIGHEST;
+ break;
+ default:
+ return /* G_TOKEN_SYMBOL */ GTK_RC_TOKEN_APPLICATION;
+ }
+
+ g_scanner_set_scope (scanner, old_scope);
+
+ return G_TOKEN_NONE;
+}
+
+guint
gtk_rc_parse_color (GScanner *scanner,
GdkColor *color)
{
guint token;
+
+ g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+
+ /* we don't need to set our own scop here, because
+ * we don't need own symbols
+ */
token = g_scanner_get_next_token (scanner);
switch (token)
@@ -1347,8 +1400,8 @@ gtk_rc_parse_pixmap_path (GScanner *scanner)
guint token;
token = g_scanner_get_next_token (scanner);
- if (token != TOKEN_PIXMAP_PATH)
- return TOKEN_PIXMAP_PATH;
+ if (token != GTK_RC_TOKEN_PIXMAP_PATH)
+ return GTK_RC_TOKEN_PIXMAP_PATH;
token = g_scanner_get_next_token (scanner);
if (token != G_TOKEN_STRING)
@@ -1403,21 +1456,22 @@ gtk_rc_parse_path_pattern (GScanner *scanner)
GtkPathType path_type;
gchar *pattern;
gboolean is_binding;
+ GtkPathPriorityType priority = GTK_PATH_PRIO_RC;
token = g_scanner_get_next_token (scanner);
switch (token)
{
- case TOKEN_WIDGET:
+ case GTK_RC_TOKEN_WIDGET:
path_type = GTK_PATH_WIDGET;
break;
- case TOKEN_WIDGET_CLASS:
+ case GTK_RC_TOKEN_WIDGET_CLASS:
path_type = GTK_PATH_WIDGET_CLASS;
break;
- case TOKEN_CLASS:
+ case GTK_RC_TOKEN_CLASS:
path_type = GTK_PATH_CLASS;
break;
default:
- return TOKEN_WIDGET_CLASS;
+ return GTK_RC_TOKEN_WIDGET_CLASS;
}
token = g_scanner_get_next_token (scanner);
@@ -1427,14 +1481,25 @@ gtk_rc_parse_path_pattern (GScanner *scanner)
pattern = g_strdup (scanner->value.v_string);
token = g_scanner_get_next_token (scanner);
- if (token == TOKEN_STYLE)
+ if (token == GTK_RC_TOKEN_STYLE)
is_binding = FALSE;
- else if (token == TOKEN_BINDING)
- is_binding = TRUE;
+ else if (token == GTK_RC_TOKEN_BINDING)
+ {
+ is_binding = TRUE;
+ if (g_scanner_peek_next_token (scanner) == ':')
+ {
+ token = gtk_rc_parse_priority (scanner, &priority);
+ if (token != G_TOKEN_NONE)
+ {
+ g_free (pattern);
+ return token;
+ }
+ }
+ }
else
{
g_free (pattern);
- return TOKEN_STYLE;
+ return GTK_RC_TOKEN_STYLE;
}
token = g_scanner_get_next_token (scanner);
@@ -1454,7 +1519,7 @@ gtk_rc_parse_path_pattern (GScanner *scanner)
g_free (pattern);
return G_TOKEN_STRING;
}
- gtk_binding_set_add_path (binding, path_type, pattern, GTK_PATH_PRIO_RC);
+ gtk_binding_set_add_path (binding, path_type, pattern, priority);
}
else
{
diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h
index 631c05949..139765666 100644
--- a/gtk/gtkrc.h
+++ b/gtk/gtkrc.h
@@ -33,7 +33,7 @@ extern "C" {
void gtk_rc_init (void);
void gtk_rc_parse (const gchar *filename);
void gtk_rc_parse_string (const gchar *rc_string);
-gboolean gtk_rc_reparse_all (void);
+gboolean gtk_rc_reparse_all (void);
GtkStyle* gtk_rc_get_style (GtkWidget *widget);
void gtk_rc_add_widget_name_style (GtkStyle *style,
const gchar *pattern);
@@ -47,7 +47,7 @@ void gtk_rc_add_class_style (GtkStyle *style,
/* Tell gtkrc to use a custom routine to load images specified in rc files instead of
* the default xpm-only loader
*/
-typedef GdkPixmap * (*GtkImageLoader) (GdkWindow *window,
+typedef GdkPixmap * (*GtkImageLoader) (GdkWindow *window,
GdkColormap *colormap,
GdkBitmap **mask,
GdkColor *transparent_color,
@@ -55,6 +55,46 @@ typedef GdkPixmap * (*GtkImageLoader) (GdkWindow *window,
void gtk_rc_set_image_loader(GtkImageLoader loader);
+/* private functions/definitions */
+typedef enum {
+ GTK_RC_TOKEN_INVALID = G_TOKEN_LAST,
+ GTK_RC_TOKEN_INCLUDE,
+ GTK_RC_TOKEN_NORMAL,
+ GTK_RC_TOKEN_ACTIVE,
+ GTK_RC_TOKEN_PRELIGHT,
+ GTK_RC_TOKEN_SELECTED,
+ GTK_RC_TOKEN_INSENSITIVE,
+ GTK_RC_TOKEN_FG,
+ GTK_RC_TOKEN_BG,
+ GTK_RC_TOKEN_BASE,
+ GTK_RC_TOKEN_TEXT,
+ GTK_RC_TOKEN_FONT,
+ GTK_RC_TOKEN_FONTSET,
+ GTK_RC_TOKEN_BG_PIXMAP,
+ GTK_RC_TOKEN_PIXMAP_PATH,
+ GTK_RC_TOKEN_STYLE,
+ GTK_RC_TOKEN_BINDING,
+ GTK_RC_TOKEN_BIND,
+ GTK_RC_TOKEN_WIDGET,
+ GTK_RC_TOKEN_WIDGET_CLASS,
+ GTK_RC_TOKEN_CLASS,
+ GTK_RC_TOKEN_LOWEST,
+ GTK_RC_TOKEN_GTK,
+ GTK_RC_TOKEN_APPLICATION,
+ GTK_RC_TOKEN_RC,
+ GTK_RC_TOKEN_HIGHEST,
+ GTK_RC_TOKEN_LAST
+} GtkRcTokenType;
+
+guint gtk_rc_parse_color (GScanner *scanner,
+ GdkColor *color);
+guint gtk_rc_parse_state (GScanner *scanner,
+ GtkStateType *state);
+guint gtk_rc_parse_priority (GScanner *scanner,
+ GtkPathPriorityType *priority);
+
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/gtk/gtktypebuiltins.h b/gtk/gtktypebuiltins.h
index 7a52e4dbb..9decd303b 100644
--- a/gtk/gtktypebuiltins.h
+++ b/gtk/gtktypebuiltins.h
@@ -46,6 +46,7 @@ extern GtkType GTK_TYPE_ANCHOR_TYPE;
extern GtkType GTK_TYPE_PRIVATE_FLAGS;
extern GtkType GTK_TYPE_PROGRESS_BAR_STYLE;
extern GtkType GTK_TYPE_PROGRESS_BAR_ORIENTATION;
+extern GtkType GTK_TYPE_RC_TOKEN_TYPE;
extern GtkType GTK_TYPE_SPIN_BUTTON_UPDATE_POLICY;
extern GtkType GTK_TYPE_SPIN_TYPE;
extern GtkType GTK_TYPE_TOOLBAR_CHILD_TYPE;
@@ -105,4 +106,4 @@ extern GtkType GTK_TYPE_GDK_WINDOW;
extern GtkType GTK_TYPE_GDK_EVENT;
extern GtkType GTK_TYPE_GDK_COLOR;
-#define GTK_TYPE_NUM_BUILTINS (104)
+#define GTK_TYPE_NUM_BUILTINS (105)
diff --git a/gtk/gtktypebuiltins_evals.c b/gtk/gtktypebuiltins_evals.c
index c168816b0..08d5328d0 100644
--- a/gtk/gtktypebuiltins_evals.c
+++ b/gtk/gtktypebuiltins_evals.c
@@ -326,6 +326,36 @@ static GtkEnumValue _gtk_progress_bar_orientation_values[] = {
{ GTK_PROGRESS_TOP_TO_BOTTOM, "GTK_PROGRESS_TOP_TO_BOTTOM", "top-to-bottom" },
{ 0, NULL, NULL }
};
+static GtkEnumValue _gtk_rc_token_type_values[] = {
+ { GTK_RC_TOKEN_INVALID, "GTK_RC_TOKEN_INVALID", "invalid" },
+ { GTK_RC_TOKEN_INCLUDE, "GTK_RC_TOKEN_INCLUDE", "include" },
+ { GTK_RC_TOKEN_NORMAL, "GTK_RC_TOKEN_NORMAL", "normal" },
+ { GTK_RC_TOKEN_ACTIVE, "GTK_RC_TOKEN_ACTIVE", "active" },
+ { GTK_RC_TOKEN_PRELIGHT, "GTK_RC_TOKEN_PRELIGHT", "prelight" },
+ { GTK_RC_TOKEN_SELECTED, "GTK_RC_TOKEN_SELECTED", "selected" },
+ { GTK_RC_TOKEN_INSENSITIVE, "GTK_RC_TOKEN_INSENSITIVE", "insensitive" },
+ { GTK_RC_TOKEN_FG, "GTK_RC_TOKEN_FG", "fg" },
+ { GTK_RC_TOKEN_BG, "GTK_RC_TOKEN_BG", "bg" },
+ { GTK_RC_TOKEN_BASE, "GTK_RC_TOKEN_BASE", "base" },
+ { GTK_RC_TOKEN_TEXT, "GTK_RC_TOKEN_TEXT", "text" },
+ { GTK_RC_TOKEN_FONT, "GTK_RC_TOKEN_FONT", "font" },
+ { GTK_RC_TOKEN_FONTSET, "GTK_RC_TOKEN_FONTSET", "fontset" },
+ { GTK_RC_TOKEN_BG_PIXMAP, "GTK_RC_TOKEN_BG_PIXMAP", "bg-pixmap" },
+ { GTK_RC_TOKEN_PIXMAP_PATH, "GTK_RC_TOKEN_PIXMAP_PATH", "pixmap-path" },
+ { GTK_RC_TOKEN_STYLE, "GTK_RC_TOKEN_STYLE", "style" },
+ { GTK_RC_TOKEN_BINDING, "GTK_RC_TOKEN_BINDING", "binding" },
+ { GTK_RC_TOKEN_BIND, "GTK_RC_TOKEN_BIND", "bind" },
+ { GTK_RC_TOKEN_WIDGET, "GTK_RC_TOKEN_WIDGET", "widget" },
+ { GTK_RC_TOKEN_WIDGET_CLASS, "GTK_RC_TOKEN_WIDGET_CLASS", "widget-class" },
+ { GTK_RC_TOKEN_CLASS, "GTK_RC_TOKEN_CLASS", "class" },
+ { GTK_RC_TOKEN_LOWEST, "GTK_RC_TOKEN_LOWEST", "lowest" },
+ { GTK_RC_TOKEN_GTK, "GTK_RC_TOKEN_GTK", "gtk" },
+ { GTK_RC_TOKEN_APPLICATION, "GTK_RC_TOKEN_APPLICATION", "application" },
+ { GTK_RC_TOKEN_RC, "GTK_RC_TOKEN_RC", "rc" },
+ { GTK_RC_TOKEN_HIGHEST, "GTK_RC_TOKEN_HIGHEST", "highest" },
+ { GTK_RC_TOKEN_LAST, "GTK_RC_TOKEN_LAST", "last" },
+ { 0, NULL, NULL }
+};
static GtkEnumValue _gtk_spin_button_update_policy_values[] = {
{ GTK_UPDATE_ALWAYS, "GTK_UPDATE_ALWAYS", "always" },
{ GTK_UPDATE_IF_VALID, "GTK_UPDATE_IF_VALID", "if-valid" },
diff --git a/gtk/gtktypebuiltins_ids.c b/gtk/gtktypebuiltins_ids.c
index a1530e0fb..2d1ee74f2 100644
--- a/gtk/gtktypebuiltins_ids.c
+++ b/gtk/gtktypebuiltins_ids.c
@@ -92,6 +92,8 @@
GTK_TYPE_ENUM, _gtk_progress_bar_style_values },
{ "GtkProgressBarOrientation", &GTK_TYPE_PROGRESS_BAR_ORIENTATION,
GTK_TYPE_ENUM, _gtk_progress_bar_orientation_values },
+ { "GtkRcTokenType", &GTK_TYPE_RC_TOKEN_TYPE,
+ GTK_TYPE_ENUM, _gtk_rc_token_type_values },
{ "GtkSpinButtonUpdatePolicy", &GTK_TYPE_SPIN_BUTTON_UPDATE_POLICY,
GTK_TYPE_ENUM, _gtk_spin_button_update_policy_values },
{ "GtkSpinType", &GTK_TYPE_SPIN_TYPE,
diff --git a/gtk/gtktypebuiltins_vars.c b/gtk/gtktypebuiltins_vars.c
index 795e8a7e6..bf7ae60e0 100644
--- a/gtk/gtktypebuiltins_vars.c
+++ b/gtk/gtktypebuiltins_vars.c
@@ -46,6 +46,7 @@ GtkType GTK_TYPE_ANCHOR_TYPE = 0;
GtkType GTK_TYPE_PRIVATE_FLAGS = 0;
GtkType GTK_TYPE_PROGRESS_BAR_STYLE = 0;
GtkType GTK_TYPE_PROGRESS_BAR_ORIENTATION = 0;
+GtkType GTK_TYPE_RC_TOKEN_TYPE = 0;
GtkType GTK_TYPE_SPIN_BUTTON_UPDATE_POLICY = 0;
GtkType GTK_TYPE_SPIN_TYPE = 0;
GtkType GTK_TYPE_TOOLBAR_CHILD_TYPE = 0;
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 1aed7a544..647963995 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -712,19 +712,6 @@ gtk_widget_class_init (GtkWidgetClass *klass)
klass->other_event = NULL;
klass->debug_msg = gtk_widget_debug_msg;
-
- /* bindings test
- */
- {
- GtkBindingSet *binding_set;
-
- binding_set = gtk_binding_set_by_class (klass);
- gtk_binding_entry_add_signal (binding_set,
- '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
- "debug_msg",
- 1,
- GTK_TYPE_STRING, "GtkWidgetClass test");
- }
}
static void
diff --git a/gtk/testgtk.c b/gtk/testgtk.c
index 2efa514ed..008ed6ead 100644
--- a/gtk/testgtk.c
+++ b/gtk/testgtk.c
@@ -7477,6 +7477,8 @@ create_main_window (void)
int
main (int argc, char *argv[])
{
+ GtkBindingSet *binding_set;
+
srand (time (NULL));
gtk_set_locale ();
@@ -7487,6 +7489,15 @@ main (int argc, char *argv[])
gle_init (&argc, &argv);
#endif /* !HAVE_LIBGLE */
+ /* bindings test
+ */
+ binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
+ gtk_binding_entry_add_signal (binding_set,
+ '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
+ "debug_msg",
+ 1,
+ GTK_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
+
gtk_rc_parse ("testgtkrc");
create_main_window ();
diff --git a/gtk/testgtkrc b/gtk/testgtkrc
index eb8e558c6..779a090e2 100644
--- a/gtk/testgtkrc
+++ b/gtk/testgtkrc
@@ -100,3 +100,28 @@ widget_class "*GtkButton*" style "button"
widget_class "*Ruler" style "ruler"
widget_class "*GtkText" style "text"
widget "*GtkCurve" style "curve"
+
+binding "test1"
+{
+ bind "<ctrl>1" {
+ "debug-msg" ("hallo and")
+ "debug-msg" ("huhu")
+ }
+}
+
+binding "test2"
+{
+ bind "<ctrl>1" {
+ "debug-msg" ("jup!")
+ }
+}
+
+# possible priorities are (in ascending order):
+# lowest
+# gtk (used by gtk for internal class bindings)
+# application (for hard coded bindings on application basis)
+# rc (used implicitel by rc files)
+# highest
+class "GtkButton" binding "test1" # implicit : rc
+class "GtkButton" binding : highest "test2" # override "rc" priority
+
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 2efa514ed..008ed6ead 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -7477,6 +7477,8 @@ create_main_window (void)
int
main (int argc, char *argv[])
{
+ GtkBindingSet *binding_set;
+
srand (time (NULL));
gtk_set_locale ();
@@ -7487,6 +7489,15 @@ main (int argc, char *argv[])
gle_init (&argc, &argv);
#endif /* !HAVE_LIBGLE */
+ /* bindings test
+ */
+ binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
+ gtk_binding_entry_add_signal (binding_set,
+ '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
+ "debug_msg",
+ 1,
+ GTK_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
+
gtk_rc_parse ("testgtkrc");
create_main_window ();
diff --git a/tests/testgtkrc b/tests/testgtkrc
index eb8e558c6..779a090e2 100644
--- a/tests/testgtkrc
+++ b/tests/testgtkrc
@@ -100,3 +100,28 @@ widget_class "*GtkButton*" style "button"
widget_class "*Ruler" style "ruler"
widget_class "*GtkText" style "text"
widget "*GtkCurve" style "curve"
+
+binding "test1"
+{
+ bind "<ctrl>1" {
+ "debug-msg" ("hallo and")
+ "debug-msg" ("huhu")
+ }
+}
+
+binding "test2"
+{
+ bind "<ctrl>1" {
+ "debug-msg" ("jup!")
+ }
+}
+
+# possible priorities are (in ascending order):
+# lowest
+# gtk (used by gtk for internal class bindings)
+# application (for hard coded bindings on application basis)
+# rc (used implicitel by rc files)
+# highest
+class "GtkButton" binding "test1" # implicit : rc
+class "GtkButton" binding : highest "test2" # override "rc" priority
+