-
-static guint
-gtk_binding_parse_signal (GScanner *scanner,
- GtkBindingSet *binding_set,
- guint keyval,
- GdkModifierType 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 = G_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 = G_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 = G_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 (G_TYPE_FUNDAMENTAL (arg->arg_type) == G_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;
- GdkModifierType 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);
- binding_set->parsed = 1;
- }
- 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;
-}
-
-static void
-free_pattern_specs (GSList *pattern_specs)
-{
- GSList *slist;
-
- for (slist = pattern_specs; slist; slist = slist->next)
- {
- PatternSpec *pspec;
-
- pspec = slist->data;
-
- g_pattern_spec_free (pspec->pspec);
- g_free (pspec);
- }
-
- g_slist_free (pattern_specs);
-}
-
-static void
-binding_set_delete (GtkBindingSet *binding_set)
-{
- GtkBindingEntry *entry, *next;
-
- entry = binding_set->entries;
- while (entry)
- {
- next = entry->set_next;
- binding_entry_destroy (entry);
- entry = next;
- }
-
- free_pattern_specs (binding_set->widget_path_pspecs);
- free_pattern_specs (binding_set->widget_class_pspecs);
- free_pattern_specs (binding_set->class_branch_pspecs);
-
- g_free (binding_set);
-}
-
-/**
- * _gtk_binding_reset_parsed:
- *
- * Removing all binding sets that were added by
- * gtk_binding_parse_binding()
- **/
-void
-_gtk_binding_reset_parsed (void)
-{
- GSList *slist, *next;
-
- slist = binding_set_list;
- while (slist)
- {
- GtkBindingSet *binding_set;
-
- binding_set = slist->data;
- next = slist->next;
-
- if (binding_set->parsed)
- {
- binding_set_list = g_slist_delete_link (binding_set_list, slist);
- binding_set_delete (binding_set);
- }
-
- slist = next;
- }
-}
-
-guint
-_gtk_binding_signal_new (const gchar *signal_name,
- GType itype,
- GSignalFlags signal_flags,
- GCallback handler,
- GSignalAccumulator accumulator,
- gpointer accu_data,
- GSignalCMarshaller c_marshaller,
- GType return_type,
- guint n_params,
- ...)
-{
- va_list args;
- guint signal_id;
-
- g_return_val_if_fail (signal_name != NULL, 0);
-
- va_start (args, n_params);
-
- signal_id = g_signal_new_valist (signal_name, itype, signal_flags,
- g_cclosure_new (handler, NULL, NULL),
- accumulator, accu_data, c_marshaller,
- return_type, n_params, args);
-
- va_end (args);
-
- return signal_id;
-}
-
-#define __GTK_BINDINGS_C__
-#include "gtkaliasdef.c"