diff options
-rw-r--r-- | ChangeLog | 27 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 27 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 27 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 27 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 27 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 27 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 27 | ||||
-rw-r--r-- | gtk/gtk.defs | 31 | ||||
-rw-r--r-- | gtk/gtkbindings.c | 287 | ||||
-rw-r--r-- | gtk/gtkbindings.h | 1 | ||||
-rw-r--r-- | gtk/gtkrc.c | 309 | ||||
-rw-r--r-- | gtk/gtkrc.h | 44 | ||||
-rw-r--r-- | gtk/gtktypebuiltins.h | 3 | ||||
-rw-r--r-- | gtk/gtktypebuiltins_evals.c | 30 | ||||
-rw-r--r-- | gtk/gtktypebuiltins_ids.c | 2 | ||||
-rw-r--r-- | gtk/gtktypebuiltins_vars.c | 1 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 13 | ||||
-rw-r--r-- | gtk/testgtk.c | 11 | ||||
-rw-r--r-- | gtk/testgtkrc | 25 | ||||
-rw-r--r-- | tests/testgtk.c | 11 | ||||
-rw-r--r-- | tests/testgtkrc | 25 |
21 files changed, 835 insertions, 147 deletions
@@ -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", >K_TYPE_PROGRESS_BAR_ORIENTATION, GTK_TYPE_ENUM, _gtk_progress_bar_orientation_values }, + { "GtkRcTokenType", >K_TYPE_RC_TOKEN_TYPE, + GTK_TYPE_ENUM, _gtk_rc_token_type_values }, { "GtkSpinButtonUpdatePolicy", >K_TYPE_SPIN_BUTTON_UPDATE_POLICY, GTK_TYPE_ENUM, _gtk_spin_button_update_policy_values }, { "GtkSpinType", >K_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 + |