From 4b3172d047feed07cf7103c424acaff2362b6e66 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 12 Aug 2018 22:07:27 +0200 Subject: [PATCH] gtk: Remove bindings The whole binding functionality is now handled by shortcuts. --- docs/reference/gtk/gtk4-sections.txt | 20 - gtk/gtk.h | 1 - gtk/gtkbindings.c | 1582 -------------------- gtk/gtkbindings.h | 93 -- gtk/gtkbindingsprivate.h | 36 - gtk/gtkcssarrayvalue.c | 1 - gtk/gtkcssprovider.c | 108 -- gtk/gtkcssstylepropertyimpl.c | 80 - gtk/gtkcsstypesprivate.h | 1 - gtk/gtkshortcut.c | 226 ++- gtk/gtkshortcutcontroller.c | 4 - gtk/meson.build | 2 - po-properties/POTFILES.in | 1 - po/POTFILES.in | 1 - tests/testgtk.c | 10 - tests/testgtk.css | 8 - testsuite/css/parser/at-invalid-22.css | 1 - testsuite/css/parser/at-invalid-22.errors | 1 - testsuite/css/parser/at-invalid-22.ref.css | 0 testsuite/css/parser/at-invalid-23.css | 1 - testsuite/css/parser/at-invalid-23.errors | 2 - testsuite/css/parser/at-invalid-23.ref.css | 0 testsuite/css/parser/at-invalid-24.css | 1 - testsuite/css/parser/at-invalid-24.errors | 2 - testsuite/css/parser/at-invalid-24.ref.css | 0 testsuite/css/parser/at-invalid-25.css | 1 - testsuite/css/parser/at-invalid-25.errors | 2 - testsuite/css/parser/at-invalid-25.ref.css | 0 testsuite/css/parser/at-invalid-26.css | 1 - testsuite/css/parser/at-invalid-26.errors | 2 - testsuite/css/parser/at-invalid-26.ref.css | 0 testsuite/css/parser/at-invalid-27.css | 1 - testsuite/css/parser/at-invalid-27.errors | 2 - testsuite/css/parser/at-invalid-27.ref.css | 0 testsuite/css/parser/at-valid-19.css | 1 - testsuite/css/parser/at-valid-19.errors | 1 - testsuite/css/parser/at-valid-19.ref.css | 0 testsuite/css/parser/at-valid-20.css | 4 - testsuite/css/parser/at-valid-20.errors | 1 - testsuite/css/parser/at-valid-20.ref.css | 0 testsuite/css/parser/at-valid-21.css | 4 - testsuite/css/parser/at-valid-21.errors | 1 - testsuite/css/parser/at-valid-21.ref.css | 0 testsuite/css/parser/meson.build | 27 - 44 files changed, 220 insertions(+), 2010 deletions(-) delete mode 100644 gtk/gtkbindings.c delete mode 100644 gtk/gtkbindings.h delete mode 100644 gtk/gtkbindingsprivate.h delete mode 100644 testsuite/css/parser/at-invalid-22.css delete mode 100644 testsuite/css/parser/at-invalid-22.errors delete mode 100644 testsuite/css/parser/at-invalid-22.ref.css delete mode 100644 testsuite/css/parser/at-invalid-23.css delete mode 100644 testsuite/css/parser/at-invalid-23.errors delete mode 100644 testsuite/css/parser/at-invalid-23.ref.css delete mode 100644 testsuite/css/parser/at-invalid-24.css delete mode 100644 testsuite/css/parser/at-invalid-24.errors delete mode 100644 testsuite/css/parser/at-invalid-24.ref.css delete mode 100644 testsuite/css/parser/at-invalid-25.css delete mode 100644 testsuite/css/parser/at-invalid-25.errors delete mode 100644 testsuite/css/parser/at-invalid-25.ref.css delete mode 100644 testsuite/css/parser/at-invalid-26.css delete mode 100644 testsuite/css/parser/at-invalid-26.errors delete mode 100644 testsuite/css/parser/at-invalid-26.ref.css delete mode 100644 testsuite/css/parser/at-invalid-27.css delete mode 100644 testsuite/css/parser/at-invalid-27.errors delete mode 100644 testsuite/css/parser/at-invalid-27.ref.css delete mode 100644 testsuite/css/parser/at-valid-19.css delete mode 100644 testsuite/css/parser/at-valid-19.errors delete mode 100644 testsuite/css/parser/at-valid-19.ref.css delete mode 100644 testsuite/css/parser/at-valid-20.css delete mode 100644 testsuite/css/parser/at-valid-20.errors delete mode 100644 testsuite/css/parser/at-valid-20.ref.css delete mode 100644 testsuite/css/parser/at-valid-21.css delete mode 100644 testsuite/css/parser/at-valid-21.errors delete mode 100644 testsuite/css/parser/at-valid-21.ref.css diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index bb655f101c..287a6d1c68 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -5044,26 +5044,6 @@ gtk_drag_source_add_image_targets gtk_drag_source_add_uri_targets -
-gtkbindings -Bindings -GtkBindingSet -GtkBindingEntry -GtkBindingSignal -GtkBindingArg -gtk_binding_set_new -gtk_binding_set_by_class -gtk_binding_set_find -gtk_bindings_activate -gtk_bindings_activate_event -gtk_binding_set_activate -gtk_binding_entry_add_signal_variant -gtk_binding_entry_add_signal -gtk_binding_entry_add_signal_from_string -gtk_binding_entry_skip -gtk_binding_entry_remove -
-
gtkenums Standard Enumerations diff --git a/gtk/gtk.h b/gtk/gtk.h index c57411ffc7..f33f2fe586 100644 --- a/gtk/gtk.h +++ b/gtk/gtk.h @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include diff --git a/gtk/gtkbindings.c b/gtk/gtkbindings.c deleted file mode 100644 index fdd38062c5..0000000000 --- a/gtk/gtkbindings.c +++ /dev/null @@ -1,1582 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkBindingSet: Keybinding manager for GObjects. - * Copyright (C) 1998 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" -#include -#include - -#include "gtkbindingsprivate.h" -#include "gtkkeyhash.h" -#include "gtkstylecontext.h" -#include "gtkwidget.h" -#include "gtkintl.h" - -/** - * SECTION:gtkbindings - * @Title: Bindings - * @Short_description: Key bindings for individual widgets - * @See_also: Keyboard Accelerators, Mnemonics, #GtkCssProvider - * - * #GtkBindingSet provides a mechanism for configuring GTK+ key bindings - * through CSS files. This eases key binding adjustments for application - * developers as well as users and provides GTK+ users or administrators - * with high key binding configurability which requires no application - * or toolkit side changes. - * - * In order for bindings to work in a custom widget implementation, the - * widget’s #GtkWidget:can-focus and #GtkWidget:has-focus properties - * must both be true. For example, by calling gtk_widget_set_can_focus() - * in the widget’s initialisation function; and by calling - * gtk_widget_grab_focus() when the widget is clicked. - * - * # Installing a key binding - * - * A CSS file binding consists of a “binding-set” definition and a match - * statement to apply the binding set to specific widget types. Details - * on the matching mechanism are described under - * [Selectors][gtkcssprovider-selectors] - * in the #GtkCssProvider documentation. Inside the binding set - * definition, key combinations are bound to one or more specific - * signal emissions on the target widget. Key combinations are strings - * consisting of an optional #GdkModifierType name and - * [key names][gdk3-Keyboard-Handling] - * such as those defined in `gdk/gdkkeysyms.h` - * or returned from gdk_keyval_name(), they have to be parsable by - * gtk_accelerator_parse(). Specifications of signal emissions consist - * of a string identifying the signal name, and a list of signal specific - * arguments in parenthesis. - * - * For example for binding Control and the left or right cursor keys - * of a #GtkEntry widget to the #GtkEntry::move-cursor signal (so - * movement occurs in 3-character steps), the following binding can be - * used: - * - * |[ - * @binding-set MoveCursor3 - * { - * bind "Right" { "move-cursor" (visual-positions, 3, 0) }; - * bind "Left" { "move-cursor" (visual-positions, -3, 0) }; - * } - * - * entry - * { - * -gtk-key-bindings: MoveCursor3; - * } - * ]| - * - * # Unbinding existing key bindings - * - * GTK+ already defines a number of useful bindings for the widgets - * it provides. Because custom bindings set up in CSS files take - * precedence over the default bindings shipped with GTK+, overriding - * existing bindings as demonstrated in - * [Installing a key binding][gtk-bindings-install] - * works as expected. The same mechanism can not be used to “unbind” - * existing bindings, however. - * - * |[ - * @binding-set MoveCursor3 - * { - * bind "Right" { }; - * bind "Left" { }; - * } - * - * entry - * { - * -gtk-key-bindings: MoveCursor3; - * } - * ]| - * - * The above example will not have the desired effect of causing - * “Right” and “Left” key presses to be ignored by GTK+. - * Instead, it just causes any existing bindings from the bindings set - * “MoveCursor3” to be deleted, so when “Right” or - * “Left” are pressed, no binding for these keys is found in - * binding set “MoveCursor3”. GTK+ will thus continue to search for - * matching key bindings, and will eventually lookup and find the default - * GTK+ bindings for entries which implement word movement. To keep GTK+ - * from activating its default bindings, the “unbind” keyword can be used - * like this: - * - * |[ - * @binding-set MoveCursor3 - * { - * unbind "Right"; - * unbind "Left"; - * } - * - * entry - * { - * -gtk-key-bindings: MoveCursor3; - * } - * ]| - * - * Now, GTK+ will find a match when looking up “Right” and - * “Left” key presses before it resorts to its default bindings, - * and the match instructs it to abort (“unbind”) the search, so the key - * presses are not consumed by this widget. As usual, further processing - * of the key presses, e.g. by an entry’s parent widget, is now possible. - */ - -/* --- defines --- */ -#define BINDING_MOD_MASK() (gtk_accelerator_get_default_mod_mask () | GDK_RELEASE_MASK) - - -/* --- structures --- */ -typedef enum { - GTK_BINDING_TOKEN_BIND, - GTK_BINDING_TOKEN_UNBIND -} GtkBindingTokens; - -typedef struct _GtkBindingEntry GtkBindingEntry; -typedef struct _GtkBindingSignal GtkBindingSignal; - -/** - * GtkBindingSet: - * @set_name: unique name of this binding set - * @priority: unused - * @entries: the key binding entries in this binding set - * @current: implementation detail - * - * A binding set maintains a list of activatable key bindings. - * A single binding set can match multiple types of widgets. - * Similar to style contexts, can be matched by any information contained - * in a widgets #GtkWidgetPath. When a binding within a set is matched upon - * activation, an action signal is emitted on the target widget to carry out - * the actual activation. - */ -struct _GtkBindingSet -{ - gchar *set_name; - gint priority; - GtkBindingEntry *entries; - GtkBindingEntry *current; -}; - -/** - * GtkBindingEntry: - * @keyval: key value to match - * @modifiers: key modifiers to match - * @binding_set: binding set this entry belongs to - * @destroyed: implementation detail - * @in_emission: implementation detail - * @marks_unbound: implementation detail - * @set_next: linked list of entries maintained by binding set - * @hash_next: implementation detail - * @signals: action signals of this entry - * - * Each key binding element of a binding sets binding list is - * represented by a GtkBindingEntry. - */ -struct _GtkBindingEntry -{ - /* key portion */ - guint keyval; - GdkModifierType modifiers; - - GtkBindingSet *binding_set; - guint destroyed : 1; - guint in_emission : 1; - guint marks_unbound : 1; - GtkBindingEntry *set_next; - GtkBindingEntry *hash_next; - GtkBindingSignal *signals; -}; - -/** - * GtkBindingSignal: - * @next: implementation detail - * @signal_name: the action signal to be emitted - * @n_args: number of arguments specified for the signal - * @args: (array length=n_args): the arguments specified for the signal - * - * A GtkBindingSignal stores the necessary information to - * activate a widget in response to a key press via a signal - * emission. - */ -struct _GtkBindingSignal -{ - GtkBindingSignal *next; - gchar *signal_name; - GVariant *args; -}; - -/* --- variables --- */ -static GHashTable *binding_entry_hash_table = NULL; -static GSList *binding_key_hashes = NULL; -static GSList *binding_set_list = NULL; -static const gchar key_class_binding_set[] = "gtk-class-binding-set"; -static GQuark key_id_class_binding_set = 0; - - -/* --- functions --- */ - -static GtkBindingSignal* -binding_signal_new (const gchar *signal_name, - GVariant *args) -{ - GtkBindingSignal *signal; - - signal = g_slice_new0 (GtkBindingSignal); - signal->next = NULL; - signal->signal_name = (gchar *)g_intern_string (signal_name); - signal->args = g_variant_ref_sink (args); - - return signal; -} - -static void -binding_signal_free (GtkBindingSignal *sig) -{ - g_variant_unref (sig->args); - g_slice_free (GtkBindingSignal, sig); -} - -static guint -binding_entry_hash (gconstpointer key) -{ - register const GtkBindingEntry *e = key; - register guint h; - - h = e->keyval; - h ^= e->modifiers; - - return h; -} - -static gint -binding_entries_compare (gconstpointer a, - gconstpointer b) -{ - register const GtkBindingEntry *ea = a; - register const GtkBindingEntry *eb = b; - - return (ea->keyval == eb->keyval && ea->modifiers == eb->modifiers); -} - -static void -binding_key_hash_insert_entry (GtkKeyHash *key_hash, - GtkBindingEntry *entry) -{ - guint keyval = entry->keyval; - - /* We store lowercased accelerators. To deal with this, if - * was specified, uppercase. - */ - if (entry->modifiers & GDK_SHIFT_MASK) - { - if (keyval == GDK_KEY_Tab) - keyval = GDK_KEY_ISO_Left_Tab; - else - keyval = gdk_keyval_to_upper (keyval); - } - - _gtk_key_hash_add_entry (key_hash, keyval, entry->modifiers & ~GDK_RELEASE_MASK, entry); -} - -static void -binding_key_hash_destroy (gpointer data) -{ - GtkKeyHash *key_hash = data; - - binding_key_hashes = g_slist_remove (binding_key_hashes, key_hash); - _gtk_key_hash_free (key_hash); -} - -static void -insert_entries_into_key_hash (gpointer key, - gpointer value, - gpointer data) -{ - GtkKeyHash *key_hash = data; - GtkBindingEntry *entry = value; - - for (; entry; entry = entry->hash_next) - binding_key_hash_insert_entry (key_hash, entry); -} - -static GtkKeyHash * -binding_key_hash_for_keymap (GdkKeymap *keymap) -{ - static GQuark key_hash_quark = 0; - GtkKeyHash *key_hash; - - if (!key_hash_quark) - key_hash_quark = g_quark_from_static_string ("gtk-binding-key-hash"); - - key_hash = g_object_get_qdata (G_OBJECT (keymap), key_hash_quark); - - if (!key_hash) - { - key_hash = _gtk_key_hash_new (keymap, NULL); - g_object_set_qdata_full (G_OBJECT (keymap), key_hash_quark, key_hash, binding_key_hash_destroy); - - if (binding_entry_hash_table) - g_hash_table_foreach (binding_entry_hash_table, - insert_entries_into_key_hash, - key_hash); - - binding_key_hashes = g_slist_prepend (binding_key_hashes, key_hash); - } - - return key_hash; -} - - -static GtkBindingEntry* -binding_entry_new (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers) -{ - GSList *tmp_list; - GtkBindingEntry *entry; - - if (!binding_entry_hash_table) - binding_entry_hash_table = g_hash_table_new (binding_entry_hash, binding_entries_compare); - - entry = g_new (GtkBindingEntry, 1); - entry->keyval = keyval; - entry->modifiers = modifiers; - entry->binding_set = binding_set, - entry->destroyed = FALSE; - entry->in_emission = FALSE; - entry->marks_unbound = FALSE; - entry->signals = NULL; - - entry->set_next = binding_set->entries; - binding_set->entries = entry; - - entry->hash_next = g_hash_table_lookup (binding_entry_hash_table, entry); - if (entry->hash_next) - g_hash_table_remove (binding_entry_hash_table, entry->hash_next); - g_hash_table_insert (binding_entry_hash_table, entry, entry); - - for (tmp_list = binding_key_hashes; tmp_list; tmp_list = tmp_list->next) - { - GtkKeyHash *key_hash = tmp_list->data; - binding_key_hash_insert_entry (key_hash, entry); - } - - return entry; -} - -static void -binding_entry_free (GtkBindingEntry *entry) -{ - GtkBindingSignal *sig; - - g_assert (entry->set_next == NULL && - entry->hash_next == NULL && - entry->in_emission == FALSE && - entry->destroyed == TRUE); - - entry->destroyed = FALSE; - - sig = entry->signals; - while (sig) - { - GtkBindingSignal *prev; - - prev = sig; - sig = prev->next; - binding_signal_free (prev); - } - g_free (entry); -} - -static void -binding_entry_destroy (GtkBindingEntry *entry) -{ - GtkBindingEntry *o_entry; - register GtkBindingEntry *tmp; - GtkBindingEntry *begin; - register GtkBindingEntry *last; - GSList *tmp_list; - - /* unlink from binding set - */ - last = NULL; - tmp = entry->binding_set->entries; - while (tmp) - { - if (tmp == entry) - { - if (last) - last->set_next = entry->set_next; - else - entry->binding_set->entries = entry->set_next; - break; - } - last = tmp; - tmp = last->set_next; - } - entry->set_next = NULL; - - o_entry = g_hash_table_lookup (binding_entry_hash_table, entry); - begin = o_entry; - last = NULL; - tmp = begin; - while (tmp) - { - if (tmp == entry) - { - if (last) - last->hash_next = entry->hash_next; - else - begin = entry->hash_next; - break; - } - last = tmp; - tmp = last->hash_next; - } - entry->hash_next = NULL; - - if (!begin) - g_hash_table_remove (binding_entry_hash_table, entry); - else if (begin != o_entry) - { - g_hash_table_remove (binding_entry_hash_table, entry); - g_hash_table_insert (binding_entry_hash_table, begin, begin); - } - - for (tmp_list = binding_key_hashes; tmp_list; tmp_list = tmp_list->next) - { - GtkKeyHash *key_hash = tmp_list->data; - _gtk_key_hash_remove_entry (key_hash, entry); - } - - entry->destroyed = TRUE; - - if (!entry->in_emission) - binding_entry_free (entry); -} - -static GtkBindingEntry* -binding_ht_lookup_entry (GtkBindingSet *set, - guint keyval, - GdkModifierType modifiers) -{ - GtkBindingEntry lookup_entry = { 0 }; - GtkBindingEntry *entry; - - if (!binding_entry_hash_table) - return NULL; - - lookup_entry.keyval = keyval; - lookup_entry.modifiers = modifiers; - - entry = g_hash_table_lookup (binding_entry_hash_table, &lookup_entry); - for (; entry; entry = entry->hash_next) - if (entry->binding_set == set) - return entry; - - return NULL; -} - -static gboolean -binding_compose_params (GObject *object, - GVariantIter *args, - GSignalQuery *query, - GValue **params_p) -{ - GValue *params; - const GType *types; - guint i; - gboolean valid; - - params = g_new0 (GValue, query->n_params + 1); - *params_p = params; - - /* The instance we emit on is the first object in the array - */ - g_value_init (params, G_TYPE_OBJECT); - g_value_set_object (params, G_OBJECT (object)); - params++; - - types = query->param_types; - valid = TRUE; - for (i = 1; i < query->n_params + 1 && valid; i++) - { - GValue tmp_value = G_VALUE_INIT; - GVariant *tmp_variant; - - g_value_init (params, *types); - tmp_variant = g_variant_iter_next_value (args); - - switch ((guint) g_variant_classify (tmp_variant)) - { - case G_VARIANT_CLASS_BOOLEAN: - g_value_init (&tmp_value, G_TYPE_BOOLEAN); - g_value_set_boolean (&tmp_value, g_variant_get_boolean (tmp_variant)); - break; - case G_VARIANT_CLASS_DOUBLE: - g_value_init (&tmp_value, G_TYPE_DOUBLE); - g_value_set_double (&tmp_value, g_variant_get_double (tmp_variant)); - break; - case G_VARIANT_CLASS_INT32: - g_value_init (&tmp_value, G_TYPE_LONG); - g_value_set_long (&tmp_value, g_variant_get_int32 (tmp_variant)); - break; - case G_VARIANT_CLASS_UINT32: - g_value_init (&tmp_value, G_TYPE_LONG); - g_value_set_long (&tmp_value, g_variant_get_uint32 (tmp_variant)); - break; - case G_VARIANT_CLASS_INT64: - g_value_init (&tmp_value, G_TYPE_LONG); - g_value_set_long (&tmp_value, g_variant_get_int64 (tmp_variant)); - break; - case G_VARIANT_CLASS_STRING: - /* gtk_rc_parse_flags/enum() has fancier parsing for this; we can't call - * that since we don't have a GParamSpec, so just do something simple - */ - if (G_TYPE_FUNDAMENTAL (*types) == G_TYPE_ENUM) - { - GEnumClass *class = G_ENUM_CLASS (g_type_class_ref (*types)); - GEnumValue *enum_value; - const char *s = g_variant_get_string (tmp_variant, NULL); - - valid = FALSE; - - enum_value = g_enum_get_value_by_name (class, s); - if (!enum_value) - enum_value = g_enum_get_value_by_nick (class, s); - - if (enum_value) - { - g_value_init (&tmp_value, *types); - g_value_set_enum (&tmp_value, enum_value->value); - valid = TRUE; - } - - g_type_class_unref (class); - } - /* This is just a hack for compatibility with GTK+-1.2 where a string - * could be used for a single flag value / without the support for multiple - * values in gtk_rc_parse_flags(), this isn't very useful. - */ - else if (G_TYPE_FUNDAMENTAL (*types) == G_TYPE_FLAGS) - { - GFlagsClass *class = G_FLAGS_CLASS (g_type_class_ref (*types)); - GFlagsValue *flags_value; - const char *s = g_variant_get_string (tmp_variant, NULL); - - valid = FALSE; - - flags_value = g_flags_get_value_by_name (class, s); - if (!flags_value) - flags_value = g_flags_get_value_by_nick (class, s); - if (flags_value) - { - g_value_init (&tmp_value, *types); - g_value_set_flags (&tmp_value, flags_value->value); - valid = TRUE; - } - - g_type_class_unref (class); - } - else - { - g_value_init (&tmp_value, G_TYPE_STRING); - g_value_set_static_string (&tmp_value, g_variant_get_string (tmp_variant, NULL)); - } - break; - default: - valid = FALSE; - break; - } - - if (valid) - { - if (!g_value_transform (&tmp_value, params)) - valid = FALSE; - - g_value_unset (&tmp_value); - } - - g_variant_unref (tmp_variant); - types++; - params++; - } - - if (!valid) - { - guint j; - - for (j = 0; j < i; j++) - g_value_unset (&(*params_p)[j]); - - g_free (*params_p); - *params_p = NULL; - } - - return valid; -} - -gboolean -gtk_binding_emit_signal (GObject *object, - const char *signal, - GVariant *args, - gboolean *handled, - GError **error) -{ - GSignalQuery query; - guint signal_id; - GValue *params = NULL; - GValue return_val = G_VALUE_INIT; - GVariantIter args_iter; - gsize n_args; - guint i; - - *handled = FALSE; - - signal_id = g_signal_lookup (signal, G_OBJECT_TYPE (object)); - if (!signal_id) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Could not find signal \"%s\" in the '%s' class ancestry", - signal, - g_type_name (G_OBJECT_TYPE (object))); - return FALSE; - } - - g_signal_query (signal_id, &query); - if (args) - n_args = g_variant_iter_init (&args_iter, args); - else - n_args = 0; - if (query.n_params != n_args || - (query.return_type != G_TYPE_NONE && query.return_type != G_TYPE_BOOLEAN) || - !binding_compose_params (object, &args_iter, &query, ¶ms)) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "signature mismatch for signal \"%s\" in the '%s' class ancestry", - signal, - g_type_name (G_OBJECT_TYPE (object))); - return FALSE; - } - else if (!(query.signal_flags & G_SIGNAL_ACTION)) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "signal \"%s\" in the '%s' class ancestry cannot be used for action emissions", - signal, - g_type_name (G_OBJECT_TYPE (object))); - return FALSE; - } - - if (query.return_type == G_TYPE_BOOLEAN) - g_value_init (&return_val, G_TYPE_BOOLEAN); - - g_signal_emitv (params, signal_id, 0, &return_val); - - if (query.return_type == G_TYPE_BOOLEAN) - { - if (g_value_get_boolean (&return_val)) - *handled = TRUE; - g_value_unset (&return_val); - } - else - *handled = TRUE; - - if (params != NULL) - { - for (i = 0; i < query.n_params + 1; i++) - g_value_unset (¶ms[i]); - - g_free (params); - } - - return TRUE; -} - -static gboolean -gtk_binding_entry_activate (GtkBindingEntry *entry, - GObject *object) -{ - GtkBindingSignal *sig; - gboolean old_emission; - gboolean handled = FALSE; - - old_emission = entry->in_emission; - entry->in_emission = TRUE; - - g_object_ref (object); - - for (sig = entry->signals; sig; sig = sig->next) - { - GError *error = NULL; - gboolean signal_handled; - - if (gtk_binding_emit_signal (object, sig->signal_name, sig->args, &signal_handled, &error)) - { - handled |= signal_handled; - } - else - { - char *accelerator = gtk_accelerator_name (entry->keyval, entry->modifiers); - g_warning ("gtk_binding_entry_activate(): binding \"%s::%s\": %s", - entry->binding_set->set_name, - accelerator, - error->message); - g_clear_error (&error); - } - - if (entry->destroyed) - break; - } - - g_object_unref (object); - - entry->in_emission = old_emission; - if (entry->destroyed && !entry->in_emission) - binding_entry_free (entry); - - return handled; -} - -/** - * gtk_binding_set_new: (skip) - * @set_name: unique name of this binding set - * - * GTK+ maintains a global list of binding sets. Each binding set has - * a unique name which needs to be specified upon creation. - * - * Returns: (transfer none): new binding set - */ -GtkBindingSet* -gtk_binding_set_new (const gchar *set_name) -{ - GtkBindingSet *binding_set; - - g_return_val_if_fail (set_name != NULL, NULL); - - binding_set = g_new (GtkBindingSet, 1); - binding_set->set_name = (gchar *) g_intern_string (set_name); - binding_set->entries = NULL; - binding_set->current = NULL; - - binding_set_list = g_slist_prepend (binding_set_list, binding_set); - - return binding_set; -} - -/** - * gtk_binding_set_by_class: (skip) - * @object_class: a valid #GObject class - * - * This function returns the binding set named after the type name of - * the passed in class structure. New binding sets are created on - * demand by this function. - * - * Returns: (transfer none): the binding set corresponding to - * @object_class - */ -GtkBindingSet* -gtk_binding_set_by_class (gpointer object_class) -{ - GObjectClass *class = object_class; - GtkBindingSet* binding_set; - - g_return_val_if_fail (G_IS_OBJECT_CLASS (class), NULL); - - if (!key_id_class_binding_set) - key_id_class_binding_set = g_quark_from_static_string (key_class_binding_set); - - binding_set = g_dataset_id_get_data (class, key_id_class_binding_set); - - if (binding_set) - return binding_set; - - binding_set = gtk_binding_set_new (g_type_name (G_OBJECT_CLASS_TYPE (class))); - g_dataset_id_set_data (class, key_id_class_binding_set, binding_set); - - return binding_set; -} - -static GtkBindingSet* -gtk_binding_set_find_interned (const gchar *set_name) -{ - GSList *slist; - - for (slist = binding_set_list; slist; slist = slist->next) - { - GtkBindingSet *binding_set; - - binding_set = slist->data; - if (binding_set->set_name == set_name) - return binding_set; - } - - return NULL; -} - -/** - * gtk_binding_set_find: - * @set_name: unique binding set name - * - * Find a binding set by its globally unique name. - * - * The @set_name can either be a name used for gtk_binding_set_new() - * or the type name of a class used in gtk_binding_set_by_class(). - * - * Returns: (nullable) (transfer none): %NULL or the specified binding set - */ -GtkBindingSet* -gtk_binding_set_find (const gchar *set_name) -{ - g_return_val_if_fail (set_name != NULL, NULL); - - return gtk_binding_set_find_interned (g_intern_string (set_name)); -} - -/** - * gtk_binding_set_activate: - * @binding_set: a #GtkBindingSet set to activate - * @keyval: key value of the binding - * @modifiers: key modifier of the binding - * @object: object to activate when binding found - * - * Find a key binding matching @keyval and @modifiers within - * @binding_set and activate the binding on @object. - * - * Returns: %TRUE if a binding was found and activated - */ -gboolean -gtk_binding_set_activate (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers, - GObject *object) -{ - GtkBindingEntry *entry; - - g_return_val_if_fail (binding_set != NULL, FALSE); - g_return_val_if_fail (G_IS_OBJECT (object), FALSE); - - keyval = gdk_keyval_to_lower (keyval); - modifiers = modifiers & BINDING_MOD_MASK (); - - entry = binding_ht_lookup_entry (binding_set, keyval, modifiers); - if (entry) - return gtk_binding_entry_activate (entry, object); - - return FALSE; -} - -static void -gtk_binding_entry_clear_internal (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers) -{ - GtkBindingEntry *entry; - - keyval = gdk_keyval_to_lower (keyval); - modifiers = modifiers & BINDING_MOD_MASK (); - - entry = binding_ht_lookup_entry (binding_set, keyval, modifiers); - if (entry) - binding_entry_destroy (entry); - - entry = binding_entry_new (binding_set, keyval, modifiers); -} - -/** - * gtk_binding_entry_skip: - * @binding_set: a #GtkBindingSet to skip an entry of - * @keyval: key value of binding to skip - * @modifiers: key modifier of binding to skip - * - * Install a binding on @binding_set which causes key lookups - * to be aborted, to prevent bindings from lower priority sets - * to be activated. - */ -void -gtk_binding_entry_skip (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers) -{ - GtkBindingEntry *entry; - - g_return_if_fail (binding_set != NULL); - - keyval = gdk_keyval_to_lower (keyval); - modifiers = modifiers & BINDING_MOD_MASK (); - - entry = binding_ht_lookup_entry (binding_set, keyval, modifiers); - if (entry) - binding_entry_destroy (entry); - - entry = binding_entry_new (binding_set, keyval, modifiers); - entry->marks_unbound = TRUE; -} - -/** - * gtk_binding_entry_remove: - * @binding_set: a #GtkBindingSet to remove an entry of - * @keyval: key value of binding to remove - * @modifiers: key modifier of binding to remove - * - * Remove a binding previously installed via - * gtk_binding_entry_add_signal() on @binding_set. - */ -void -gtk_binding_entry_remove (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers) -{ - GtkBindingEntry *entry; - - g_return_if_fail (binding_set != NULL); - - keyval = gdk_keyval_to_lower (keyval); - modifiers = modifiers & BINDING_MOD_MASK (); - - entry = binding_ht_lookup_entry (binding_set, keyval, modifiers); - if (entry) - binding_entry_destroy (entry); -} - -/** - * gtk_binding_entry_add_signal_variant: - * @binding_set: a #GtkBindingSet to add a signal to - * @keyval: key value - * @modifiers: key modifier - * @signal_name: signal name to be bound - * @binding_args: a #GVariant containing a struct with the arguments to pass. - * - * Override or install a new key binding for @keyval with @modifiers on - * @binding_set. - */ -void -gtk_binding_entry_add_signal_variant (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers, - const gchar *signal_name, - GVariant *binding_args) -{ - GtkBindingEntry *entry; - GtkBindingSignal *signal, **signal_p; - - keyval = gdk_keyval_to_lower (keyval); - modifiers = modifiers & BINDING_MOD_MASK (); - - signal = binding_signal_new (signal_name, binding_args); - - entry = binding_ht_lookup_entry (binding_set, keyval, modifiers); - if (!entry) - { - gtk_binding_entry_clear_internal (binding_set, keyval, modifiers); - entry = binding_ht_lookup_entry (binding_set, keyval, modifiers); - } - signal_p = &entry->signals; - while (*signal_p) - signal_p = &(*signal_p)->next; - *signal_p = signal; -} - -/** - * gtk_binding_entry_add_signal: - * @binding_set: a #GtkBindingSet to install an entry for - * @keyval: key value of binding to install - * @modifiers: key modifier of binding to install - * @signal_name: signal to execute upon activation - * @n_args: number of arguments to @signal_name - * @...: arguments to @signal_name - * - * Override or install a new key binding for @keyval with @modifiers on - * @binding_set. When the binding is activated, @signal_name will be - * emitted on the target widget, with @n_args @Varargs used as - * arguments. - * - * Each argument to the signal must be passed as a pair of varargs: the - * #GType of the argument, followed by the argument value (which must - * be of the given type). There must be @n_args pairs in total. - * - * ## Adding a Key Binding - * - * |[ - * GtkBindingSet *binding_set; - * GdkModifierType modmask = GDK_CONTROL_MASK; - * int count = 1; - * gtk_binding_entry_add_signal (binding_set, - * GDK_KEY_space, - * modmask, - * "move-cursor", 2, - * GTK_TYPE_MOVEMENT_STEP, GTK_MOVEMENT_PAGES, - * G_TYPE_INT, count, - * G_TYPE_BOOLEAN, FALSE); - * ]| - */ -void -gtk_binding_entry_add_signal (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers, - const gchar *signal_name, - guint n_args, - ...) -{ - GVariantBuilder builder; - va_list args; - GType arg_type; - guint i; - - g_return_if_fail (binding_set != NULL); - g_return_if_fail (signal_name != NULL); - - va_start (args, n_args); - g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); - for (i = 0; i < n_args; i++) - { - arg_type = va_arg (args, GType); - switch (G_TYPE_FUNDAMENTAL (arg_type)) - { - case G_TYPE_CHAR: - case G_TYPE_UCHAR: - case G_TYPE_INT: - case G_TYPE_UINT: - case G_TYPE_BOOLEAN: - case G_TYPE_ENUM: - case G_TYPE_FLAGS: - g_variant_builder_add (&builder, "x", (gint64) va_arg (args, gint)); - break; - case G_TYPE_LONG: - case G_TYPE_ULONG: - g_variant_builder_add (&builder, "x", (gint64) va_arg (args, glong)); - break; - case G_TYPE_FLOAT: - case G_TYPE_DOUBLE: - g_variant_builder_add (&builder, "d", (gint64) va_arg (args, gdouble)); - break; - case G_TYPE_STRING: - { - char *s = va_arg (args, gchar*); - if (s != NULL) - { - g_variant_builder_add (&builder, "s", s); - } - else - { - g_warning ("gtk_binding_entry_add_signal(): type '%s' arg[%u] is 'NULL'", - g_type_name (arg_type), - i); - i += n_args + 1; - } - } - break; - default: - g_warning ("gtk_binding_entry_add_signal(): unsupported type '%s' for arg[%u]", - g_type_name (arg_type), i); - i += n_args + 1; - break; - } - } - va_end (args); - - if (i == n_args || i == 0) - gtk_binding_entry_add_signal_variant (binding_set, keyval, modifiers, signal_name, g_variant_builder_end (&builder)); - else - g_variant_builder_clear (&builder); -} - -static guint -gtk_binding_parse_signal (GScanner *scanner, - GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers) -{ - gchar *signal; - guint expected_token = 0; - gboolean done; - gboolean negate; - gboolean need_arg; - gboolean seen_comma; - GVariantBuilder builder; - - 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); - - g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); - negate = FALSE; - 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 ((guint) scanner->token) - { - case G_TOKEN_FLOAT: - if (need_arg) - { - if (negate) - g_variant_builder_add (&builder, "d", (double) scanner->value.v_float); - else - g_variant_builder_add (&builder, "d", (double) - scanner->value.v_float); - - need_arg = FALSE; - negate = FALSE; - } - else - done = TRUE; - - break; - case G_TOKEN_INT: - if (need_arg) - { - if (negate) - g_variant_builder_add (&builder, "x", (gint64) - scanner->value.v_int); - else - g_variant_builder_add (&builder, "x", (gint64) scanner->value.v_int); - - need_arg = FALSE; - negate = FALSE; - } - else - done = TRUE; - break; - case G_TOKEN_STRING: - if (need_arg && !negate) - { - need_arg = FALSE; - g_variant_builder_add (&builder, "s", scanner->value.v_string); - } - else - done = TRUE; - - break; - case G_TOKEN_IDENTIFIER: - if (need_arg && !negate) - { - need_arg = FALSE; - g_variant_builder_add (&builder, "s", scanner->value.v_string); - } - 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) - { - gtk_binding_entry_add_signal_variant (binding_set, - keyval, - modifiers, - signal, - g_variant_builder_end (&builder)); - expected_token = G_TOKEN_NONE; - } - - done = TRUE; - break; - default: - done = TRUE; - break; - } - } - while (!done); - - scanner->config->scan_symbols = TRUE; - - g_variant_builder_clear (&builder); - - g_free (signal); - - return expected_token; -} - -static inline guint -gtk_binding_parse_bind (GScanner *scanner, - GtkBindingSet *binding_set) -{ - guint keyval = 0; - GdkModifierType modifiers = 0; - gboolean unbind = FALSE; - - g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); - - g_scanner_get_next_token (scanner); - - if (scanner->token != G_TOKEN_SYMBOL) - return G_TOKEN_SYMBOL; - - if (scanner->value.v_symbol != GUINT_TO_POINTER (GTK_BINDING_TOKEN_BIND) && - scanner->value.v_symbol != GUINT_TO_POINTER (GTK_BINDING_TOKEN_UNBIND)) - return G_TOKEN_SYMBOL; - - unbind = (scanner->value.v_symbol == GUINT_TO_POINTER (GTK_BINDING_TOKEN_UNBIND)); - g_scanner_get_next_token (scanner); - - if (scanner->token != (guint) 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; - - if (unbind) - { - gtk_binding_entry_skip (binding_set, keyval, modifiers); - return G_TOKEN_NONE; - } - - g_scanner_get_next_token (scanner); - - if (scanner->token != '{') - return '{'; - - gtk_binding_entry_clear_internal (binding_set, keyval, modifiers); - g_scanner_peek_next_token (scanner); - - while (scanner->next_token != '}') - { - guint expected_token; - - if (scanner->next_token == G_TOKEN_STRING) - { - expected_token = gtk_binding_parse_signal (scanner, - binding_set, - keyval, - modifiers); - if (expected_token != G_TOKEN_NONE) - return expected_token; - } - else - { - g_scanner_get_next_token (scanner); - return '}'; - } - - g_scanner_peek_next_token (scanner); - } - - g_scanner_get_next_token (scanner); - - return G_TOKEN_NONE; -} - -static GScanner * -create_signal_scanner (void) -{ - GScanner *scanner; - - scanner = g_scanner_new (NULL); - scanner->config->cset_identifier_nth = (char *) G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "-_"; - - g_scanner_scope_add_symbol (scanner, 0, "bind", GUINT_TO_POINTER (GTK_BINDING_TOKEN_BIND)); - g_scanner_scope_add_symbol (scanner, 0, "unbind", GUINT_TO_POINTER (GTK_BINDING_TOKEN_UNBIND)); - - g_scanner_set_scope (scanner, 0); - - return scanner; -} - -/** - * gtk_binding_entry_add_signal_from_string: - * @binding_set: a #GtkBindingSet - * @signal_desc: a signal description - * - * Parses a signal description from @signal_desc and incorporates - * it into @binding_set. - * - * Signal descriptions may either bind a key combination to - * one or more signals: - * |[ - * bind "key" { - * "signalname" (param, ...) - * ... - * } - * ]| - * - * Or they may also unbind a key combination: - * |[ - * unbind "key" - * ]| - * - * Key combinations must be in a format that can be parsed by - * gtk_accelerator_parse(). - * - * Returns: %G_TOKEN_NONE if the signal was successfully parsed and added, - * the expected token otherwise - */ -GTokenType -gtk_binding_entry_add_signal_from_string (GtkBindingSet *binding_set, - const gchar *signal_desc) -{ - static GScanner *scanner = NULL; - GTokenType ret; - - g_return_val_if_fail (binding_set != NULL, G_TOKEN_NONE); - g_return_val_if_fail (signal_desc != NULL, G_TOKEN_NONE); - - if (G_UNLIKELY (!scanner)) - scanner = create_signal_scanner (); - - g_scanner_input_text (scanner, signal_desc, - (guint) strlen (signal_desc)); - - ret = gtk_binding_parse_bind (scanner, binding_set); - - /* Reset for next use */ - g_scanner_set_scope (scanner, 0); - - return ret; -} - -static gint -find_entry_with_binding (GtkBindingEntry *entry, - GtkBindingSet *binding_set) -{ - return (entry->binding_set == binding_set) ? 0 : 1; -} - -static gboolean -binding_activate (GtkBindingSet *binding_set, - GSList *entries, - GObject *object, - gboolean is_release, - gboolean *unbound) -{ - GtkBindingEntry *entry; - GSList *elem; - - elem = g_slist_find_custom (entries, binding_set, - (GCompareFunc) find_entry_with_binding); - - if (!elem) - return FALSE; - - entry = elem->data; - - if (is_release != ((entry->modifiers & GDK_RELEASE_MASK) != 0)) - return FALSE; - - if (entry->marks_unbound) - { - *unbound = TRUE; - return FALSE; - } - - if (gtk_binding_entry_activate (entry, object)) - return TRUE; - - return FALSE; -} - -static gboolean -gtk_bindings_activate_list (GObject *object, - GSList *entries, - gboolean is_release) -{ - GtkStyleContext *context; - GtkBindingSet *binding_set; - gboolean handled = FALSE; - gboolean unbound = FALSE; - GPtrArray *array; - - if (!entries) - return FALSE; - - context = gtk_widget_get_style_context (GTK_WIDGET (object)); - - gtk_style_context_get (context, - "-gtk-key-bindings", &array, - NULL); - if (array) - { - gint i; - - for (i = 0; i < array->len; i++) - { - binding_set = g_ptr_array_index (array, i); - handled = binding_activate (binding_set, entries, - object, is_release, - &unbound); - if (handled || unbound) - break; - } - - g_ptr_array_unref (array); - - if (unbound) - return FALSE; - } - - if (!handled) - { - GType class_type; - - class_type = G_TYPE_FROM_INSTANCE (object); - - while (class_type && !handled) - { - binding_set = gtk_binding_set_find_interned (g_type_name (class_type)); - class_type = g_type_parent (class_type); - - if (!binding_set) - continue; - - handled = binding_activate (binding_set, entries, - object, is_release, - &unbound); - if (unbound) - break; - } - - if (unbound) - return FALSE; - } - - return handled; -} - -/** - * gtk_bindings_activate: - * @object: object to activate when binding found - * @keyval: key value of the binding - * @modifiers: key modifier of the binding - * - * Find a key binding matching @keyval and @modifiers and activate the - * binding on @object. - * - * Returns: %TRUE if a binding was found and activated - */ -gboolean -gtk_bindings_activate (GObject *object, - guint keyval, - GdkModifierType modifiers) -{ - GSList *entries = NULL; - GdkDisplay *display; - GtkKeyHash *key_hash; - gboolean handled = FALSE; - gboolean is_release; - - if (!GTK_IS_WIDGET (object)) - return FALSE; - - is_release = (modifiers & GDK_RELEASE_MASK) != 0; - modifiers = modifiers & BINDING_MOD_MASK () & ~GDK_RELEASE_MASK; - - display = gtk_widget_get_display (GTK_WIDGET (object)); - key_hash = binding_key_hash_for_keymap (gdk_display_get_keymap (display)); - - entries = _gtk_key_hash_lookup_keyval (key_hash, keyval, modifiers); - - handled = gtk_bindings_activate_list (object, entries, is_release); - - g_slist_free (entries); - - return handled; -} - -/** - * gtk_bindings_activate_event: - * @object: a #GObject (generally must be a widget) - * @event: a #GdkEventKey - * - * Looks up key bindings for @object to find one matching - * @event, and if one was found, activate it. - * - * Returns: %TRUE if a matching key binding was found - */ -gboolean -gtk_bindings_activate_event (GObject *object, - GdkEventKey *event) -{ - GSList *entries = NULL; - GdkDisplay *display; - GtkKeyHash *key_hash; - gboolean handled = FALSE; - guint16 keycode; - GdkModifierType state; - guint group; - - if (!GTK_IS_WIDGET (object)) - return FALSE; - - display = gtk_widget_get_display (GTK_WIDGET (object)); - key_hash = binding_key_hash_for_keymap (gdk_display_get_keymap (display)); - - gdk_event_get_keycode ((GdkEvent *)event, &keycode); - gdk_event_get_state ((GdkEvent *)event, &state); - gdk_event_get_key_group ((GdkEvent *)event, &group); - - entries = _gtk_key_hash_lookup (key_hash, - keycode, - state, - BINDING_MOD_MASK () & ~GDK_RELEASE_MASK, - group); - - handled = gtk_bindings_activate_list (object, entries, - gdk_event_get_event_type ((GdkEvent *) event) == GDK_KEY_RELEASE); - - g_slist_free (entries); - - return handled; -} diff --git a/gtk/gtkbindings.h b/gtk/gtkbindings.h deleted file mode 100644 index 4b02b144c9..0000000000 --- a/gtk/gtkbindings.h +++ /dev/null @@ -1,93 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkBindingSet: Keybinding manager for GObjects. - * Copyright (C) 1998 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __GTK_BINDINGS_H__ -#define __GTK_BINDINGS_H__ - - -#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) -#error "Only can be included directly." -#endif - -#include -#include - -G_BEGIN_DECLS - -typedef struct _GtkBindingSet GtkBindingSet; - -GDK_AVAILABLE_IN_ALL -GtkBindingSet *gtk_binding_set_new (const gchar *set_name); -GDK_AVAILABLE_IN_ALL -GtkBindingSet *gtk_binding_set_by_class (gpointer object_class); -GDK_AVAILABLE_IN_ALL -GtkBindingSet *gtk_binding_set_find (const gchar *set_name); - -GDK_AVAILABLE_IN_ALL -gboolean gtk_bindings_activate (GObject *object, - guint keyval, - GdkModifierType modifiers); -GDK_AVAILABLE_IN_ALL -gboolean gtk_bindings_activate_event (GObject *object, - GdkEventKey *event); -GDK_AVAILABLE_IN_ALL -gboolean gtk_binding_set_activate (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers, - GObject *object); - -GDK_AVAILABLE_IN_ALL -void gtk_binding_entry_skip (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers); -GDK_AVAILABLE_IN_ALL -void gtk_binding_entry_add_signal_variant (GtkBindingSet*binding_set, - guint keyval, - GdkModifierType modifiers, - const gchar *signal_name, - GVariant *binding_args); -GDK_AVAILABLE_IN_ALL -void gtk_binding_entry_add_signal (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers, - const gchar *signal_name, - guint n_args, - ...); - -GDK_AVAILABLE_IN_ALL -GTokenType gtk_binding_entry_add_signal_from_string - (GtkBindingSet *binding_set, - const gchar *signal_desc); - -GDK_AVAILABLE_IN_ALL -void gtk_binding_entry_remove (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers); - -G_END_DECLS - -#endif /* __GTK_BINDINGS_H__ */ diff --git a/gtk/gtkbindingsprivate.h b/gtk/gtkbindingsprivate.h deleted file mode 100644 index 8fbccd2cdd..0000000000 --- a/gtk/gtkbindingsprivate.h +++ /dev/null @@ -1,36 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 2011 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -#ifndef __GTK_BINDINGS_PRIVATE_H__ -#define __GTK_BINDINGS_PRIVATE_H__ - -#include "gtkbindings.h" - -G_BEGIN_DECLS - -guint _gtk_binding_parse_binding (GScanner *scanner); -void _gtk_binding_reset_parsed (void); - -gboolean gtk_binding_emit_signal (GObject *object, - const char *signal, - GVariant *args, - gboolean *handled, - GError **error); - -G_END_DECLS - -#endif /* __GTK_BINDINGS_PRIVATE_H__ */ diff --git a/gtk/gtkcssarrayvalue.c b/gtk/gtkcssarrayvalue.c index d294d90892..ca65df9698 100644 --- a/gtk/gtkcssarrayvalue.c +++ b/gtk/gtkcssarrayvalue.c @@ -293,7 +293,6 @@ gtk_css_value_array_transition (GtkCssValue *start, case GTK_CSS_PROPERTY_TRANSITION_DURATION: case GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION: case GTK_CSS_PROPERTY_TRANSITION_DELAY: - case GTK_CSS_PROPERTY_GTK_KEY_BINDINGS: return NULL; } } diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 75609ed042..a933ae9fb1 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -39,7 +39,6 @@ #include "gtkstylepropertyprivate.h" #include "gtkstyleproviderprivate.h" #include "gtkwidgetpath.h" -#include "gtkbindings.h" #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtkintl.h" @@ -898,111 +897,6 @@ parse_color_definition (GtkCssScanner *scanner) return TRUE; } -static gboolean -parse_binding_set (GtkCssScanner *scanner) -{ - GtkBindingSet *binding_set; - char *name; - - gtk_css_scanner_push_section (scanner, GTK_CSS_SECTION_BINDING_SET); - - if (!_gtk_css_parser_try (scanner->parser, "@binding-set", TRUE)) - { - gtk_css_scanner_pop_section (scanner, GTK_CSS_SECTION_BINDING_SET); - return FALSE; - } - - name = _gtk_css_parser_try_ident (scanner->parser, TRUE); - if (name == NULL) - { - gtk_css_provider_error_literal (scanner->provider, - scanner, - GTK_CSS_PROVIDER_ERROR, - GTK_CSS_PROVIDER_ERROR_SYNTAX, - "Expected name for binding set"); - _gtk_css_parser_resync (scanner->parser, TRUE, 0); - goto skip_semicolon; - } - - binding_set = gtk_binding_set_find (name); - if (!binding_set) - binding_set = gtk_binding_set_new (name); - g_free (name); - - if (!_gtk_css_parser_try (scanner->parser, "{", TRUE)) - { - gtk_css_provider_error_literal (scanner->provider, - scanner, - GTK_CSS_PROVIDER_ERROR, - GTK_CSS_PROVIDER_ERROR_SYNTAX, - "Expected '{' for binding set"); - _gtk_css_parser_resync (scanner->parser, TRUE, 0); - goto skip_semicolon; - } - - while (!_gtk_css_parser_is_eof (scanner->parser) && - !_gtk_css_parser_begins_with (scanner->parser, '}')) - { - name = _gtk_css_parser_read_value (scanner->parser); - if (name == NULL) - { - _gtk_css_parser_resync (scanner->parser, TRUE, '}'); - continue; - } - - if (gtk_binding_entry_add_signal_from_string (binding_set, name) != G_TOKEN_NONE) - { - gtk_css_provider_error_literal (scanner->provider, - scanner, - GTK_CSS_PROVIDER_ERROR, - GTK_CSS_PROVIDER_ERROR_SYNTAX, - "Failed to parse binding set."); - } - - g_free (name); - - if (!_gtk_css_parser_try (scanner->parser, ";", TRUE)) - { - if (!_gtk_css_parser_begins_with (scanner->parser, '}') && - !_gtk_css_parser_is_eof (scanner->parser)) - { - gtk_css_provider_error_literal (scanner->provider, - scanner, - GTK_CSS_PROVIDER_ERROR, - GTK_CSS_PROVIDER_ERROR_SYNTAX, - "Expected semicolon"); - _gtk_css_parser_resync (scanner->parser, TRUE, '}'); - } - } - } - - if (!_gtk_css_parser_try (scanner->parser, "}", TRUE)) - { - gtk_css_provider_error_literal (scanner->provider, - scanner, - GTK_CSS_PROVIDER_ERROR, - GTK_CSS_PROVIDER_ERROR_SYNTAX, - "expected '}' after declarations"); - if (!_gtk_css_parser_is_eof (scanner->parser)) - _gtk_css_parser_resync (scanner->parser, FALSE, 0); - } - -skip_semicolon: - if (_gtk_css_parser_begins_with (scanner->parser, ';')) - { - gtk_css_provider_error_literal (scanner->provider, - scanner, - GTK_CSS_PROVIDER_ERROR, - GTK_CSS_PROVIDER_ERROR_DEPRECATED, - "Nonstandard semicolon at end of binding set"); - _gtk_css_parser_try (scanner->parser, ";", TRUE); - } - - gtk_css_scanner_pop_section (scanner, GTK_CSS_SECTION_BINDING_SET); - - return TRUE; -} - static gboolean parse_keyframes (GtkCssScanner *scanner) { @@ -1076,8 +970,6 @@ parse_at_keyword (GtkCssScanner *scanner) return; if (parse_color_definition (scanner)) return; - if (parse_binding_set (scanner)) - return; if (parse_keyframes (scanner)) return; diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index ac8cf75974..b2a347c78c 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -35,7 +35,6 @@ #include "fallback-c89.c" /* the actual parsers we have */ -#include "gtkbindings.h" #include "gtkcssarrayvalueprivate.h" #include "gtkcssbgsizevalueprivate.h" #include "gtkcssbordervalueprivate.h" @@ -419,75 +418,6 @@ icon_style_parse (GtkCssStyleProperty *property, return value; } -static GtkCssValue * -bindings_value_parse_one (GtkCssParser *parser) -{ - char *name; - - name = _gtk_css_parser_try_ident (parser, TRUE); - if (name == NULL) - { - _gtk_css_parser_error (parser, "Not a valid binding name"); - return NULL; - } - - if (g_ascii_strcasecmp (name, "none") == 0) - { - name = NULL; - } - else if (!gtk_binding_set_find (name)) - { - _gtk_css_parser_error (parser, "No binding set named '%s'", name); - g_free (name); - return NULL; - } - - return _gtk_css_string_value_new_take (name); -} - -static GtkCssValue * -bindings_value_parse (GtkCssStyleProperty *property, - GtkCssParser *parser) -{ - return _gtk_css_array_value_parse (parser, bindings_value_parse_one); -} - -static void -bindings_value_query (GtkCssStyleProperty *property, - const GtkCssValue *css_value, - GValue *value) -{ - GPtrArray *array; - guint i; - - g_value_init (value, G_TYPE_PTR_ARRAY); - - if (_gtk_css_array_value_get_n_values (css_value) == 0) - return; - - array = NULL; - - for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++) - { - const char *name; - GtkBindingSet *binding_set; - - name = _gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i)); - if (name == NULL) - continue; - - binding_set = gtk_binding_set_find (name); - if (binding_set == NULL) - continue; - - if (array == NULL) - array = g_ptr_array_new (); - g_ptr_array_add (array, binding_set); - } - - g_value_take_boxed (value, array); -} - static GtkCssValue * parse_letter_spacing (GtkCssStyleProperty *property, GtkCssParser *parser) @@ -1754,16 +1684,6 @@ _gtk_css_style_property_init_properties (void) NULL, gtk_css_filter_value_new_none ()); - /* Private property holding the binding sets */ - gtk_css_style_property_register ("-gtk-key-bindings", - GTK_CSS_PROPERTY_GTK_KEY_BINDINGS, - G_TYPE_PTR_ARRAY, - 0, - 0, - bindings_value_parse, - bindings_value_query, - _gtk_css_array_value_new (_gtk_css_string_value_new (NULL))); - gtk_css_style_property_register ("caret-color", GTK_CSS_PROPERTY_CARET_COLOR, GDK_TYPE_RGBA, diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index 218a15980c..2d8bba6a63 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -238,7 +238,6 @@ enum { /*< skip >*/ GTK_CSS_PROPERTY_ANIMATION_FILL_MODE, GTK_CSS_PROPERTY_OPACITY, GTK_CSS_PROPERTY_FILTER, - GTK_CSS_PROPERTY_GTK_KEY_BINDINGS, GTK_CSS_PROPERTY_CARET_COLOR, GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR, GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS, diff --git a/gtk/gtkshortcut.c b/gtk/gtkshortcut.c index 69e087603b..1fac8d489d 100644 --- a/gtk/gtkshortcut.c +++ b/gtk/gtkshortcut.c @@ -21,7 +21,6 @@ #include "gtkshortcut.h" -#include "gtkbindingsprivate.h" #include "gtkintl.h" #include "gtkshortcuttrigger.h" #include "gtkwidget.h" @@ -245,6 +244,221 @@ gtk_shortcut_trigger (GtkShortcut *self, return gtk_shortcut_trigger_trigger (self->trigger, event); } +static gboolean +binding_compose_params (GObject *object, + GVariantIter *args, + GSignalQuery *query, + GValue **params_p) +{ + GValue *params; + const GType *types; + guint i; + gboolean valid; + + params = g_new0 (GValue, query->n_params + 1); + *params_p = params; + + /* The instance we emit on is the first object in the array + */ + g_value_init (params, G_TYPE_OBJECT); + g_value_set_object (params, G_OBJECT (object)); + params++; + + types = query->param_types; + valid = TRUE; + for (i = 1; i < query->n_params + 1 && valid; i++) + { + GValue tmp_value = G_VALUE_INIT; + GVariant *tmp_variant; + + g_value_init (params, *types); + tmp_variant = g_variant_iter_next_value (args); + + switch ((guint) g_variant_classify (tmp_variant)) + { + case G_VARIANT_CLASS_BOOLEAN: + g_value_init (&tmp_value, G_TYPE_BOOLEAN); + g_value_set_boolean (&tmp_value, g_variant_get_boolean (tmp_variant)); + break; + case G_VARIANT_CLASS_DOUBLE: + g_value_init (&tmp_value, G_TYPE_DOUBLE); + g_value_set_double (&tmp_value, g_variant_get_double (tmp_variant)); + break; + case G_VARIANT_CLASS_INT32: + g_value_init (&tmp_value, G_TYPE_LONG); + g_value_set_long (&tmp_value, g_variant_get_int32 (tmp_variant)); + break; + case G_VARIANT_CLASS_UINT32: + g_value_init (&tmp_value, G_TYPE_LONG); + g_value_set_long (&tmp_value, g_variant_get_uint32 (tmp_variant)); + break; + case G_VARIANT_CLASS_INT64: + g_value_init (&tmp_value, G_TYPE_LONG); + g_value_set_long (&tmp_value, g_variant_get_int64 (tmp_variant)); + break; + case G_VARIANT_CLASS_STRING: + /* gtk_rc_parse_flags/enum() has fancier parsing for this; we can't call + * that since we don't have a GParamSpec, so just do something simple + */ + if (G_TYPE_FUNDAMENTAL (*types) == G_TYPE_ENUM) + { + GEnumClass *class = G_ENUM_CLASS (g_type_class_ref (*types)); + GEnumValue *enum_value; + const char *s = g_variant_get_string (tmp_variant, NULL); + + valid = FALSE; + + enum_value = g_enum_get_value_by_name (class, s); + if (!enum_value) + enum_value = g_enum_get_value_by_nick (class, s); + + if (enum_value) + { + g_value_init (&tmp_value, *types); + g_value_set_enum (&tmp_value, enum_value->value); + valid = TRUE; + } + + g_type_class_unref (class); + } + /* This is just a hack for compatibility with GTK+-1.2 where a string + * could be used for a single flag value / without the support for multiple + * values in gtk_rc_parse_flags(), this isn't very useful. + */ + else if (G_TYPE_FUNDAMENTAL (*types) == G_TYPE_FLAGS) + { + GFlagsClass *class = G_FLAGS_CLASS (g_type_class_ref (*types)); + GFlagsValue *flags_value; + const char *s = g_variant_get_string (tmp_variant, NULL); + + valid = FALSE; + + flags_value = g_flags_get_value_by_name (class, s); + if (!flags_value) + flags_value = g_flags_get_value_by_nick (class, s); + if (flags_value) + { + g_value_init (&tmp_value, *types); + g_value_set_flags (&tmp_value, flags_value->value); + valid = TRUE; + } + + g_type_class_unref (class); + } + else + { + g_value_init (&tmp_value, G_TYPE_STRING); + g_value_set_static_string (&tmp_value, g_variant_get_string (tmp_variant, NULL)); + } + break; + default: + valid = FALSE; + break; + } + + if (valid) + { + if (!g_value_transform (&tmp_value, params)) + valid = FALSE; + + g_value_unset (&tmp_value); + } + + g_variant_unref (tmp_variant); + types++; + params++; + } + + if (!valid) + { + guint j; + + for (j = 0; j < i; j++) + g_value_unset (&(*params_p)[j]); + + g_free (*params_p); + *params_p = NULL; + } + + return valid; +} + +static gboolean +gtk_shortcut_emit_signal (GObject *object, + const char *signal, + GVariant *args, + gboolean *handled, + GError **error) +{ + GSignalQuery query; + guint signal_id; + GValue *params = NULL; + GValue return_val = G_VALUE_INIT; + GVariantIter args_iter; + gsize n_args; + guint i; + + *handled = FALSE; + + signal_id = g_signal_lookup (signal, G_OBJECT_TYPE (object)); + if (!signal_id) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Could not find signal \"%s\" in the '%s' class ancestry", + signal, + g_type_name (G_OBJECT_TYPE (object))); + return FALSE; + } + + g_signal_query (signal_id, &query); + if (args) + n_args = g_variant_iter_init (&args_iter, args); + else + n_args = 0; + if (query.n_params != n_args || + (query.return_type != G_TYPE_NONE && query.return_type != G_TYPE_BOOLEAN) || + !binding_compose_params (object, &args_iter, &query, ¶ms)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "signature mismatch for signal \"%s\" in the '%s' class ancestry", + signal, + g_type_name (G_OBJECT_TYPE (object))); + return FALSE; + } + else if (!(query.signal_flags & G_SIGNAL_ACTION)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "signal \"%s\" in the '%s' class ancestry cannot be used for action emissions", + signal, + g_type_name (G_OBJECT_TYPE (object))); + return FALSE; + } + + if (query.return_type == G_TYPE_BOOLEAN) + g_value_init (&return_val, G_TYPE_BOOLEAN); + + g_signal_emitv (params, signal_id, 0, &return_val); + + if (query.return_type == G_TYPE_BOOLEAN) + { + if (g_value_get_boolean (&return_val)) + *handled = TRUE; + g_value_unset (&return_val); + } + else + *handled = TRUE; + + if (params != NULL) + { + for (i = 0; i < query.n_params + 1; i++) + g_value_unset (¶ms[i]); + + g_free (params); + } + + return TRUE; +} + gboolean gtk_shortcut_activate (GtkShortcut *self, GtkWidget *widget) @@ -261,11 +475,11 @@ gtk_shortcut_activate (GtkShortcut *self, GError *error = NULL; gboolean handled; - if (!gtk_binding_emit_signal (G_OBJECT (widget), - self->signal, - self->args, - &handled, - &error)) + if (!gtk_shortcut_emit_signal (G_OBJECT (widget), + self->signal, + self->args, + &handled, + &error)) { char *accelerator = gtk_shortcut_trigger_to_string (self->trigger); g_warning ("gtk_shortcut_activate(): \":%s\": %s", diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c index 44ab5019f0..0b8d1ee9ac 100644 --- a/gtk/gtkshortcutcontroller.c +++ b/gtk/gtkshortcutcontroller.c @@ -32,7 +32,6 @@ #include "gtkshortcutcontrollerprivate.h" #include "gtkeventcontrollerprivate.h" -#include "gtkbindings.h" #include "gtkshortcut.h" #include "gtkwidgetprivate.h" @@ -95,9 +94,6 @@ gtk_shortcut_controller_handle_event (GtkEventController *controller, { widget = gtk_event_controller_get_widget (controller); - if (gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *) event)) - return TRUE; - for (l = gtk_widget_class_get_shortcuts (GTK_WIDGET_GET_CLASS (widget)); l; l = l->next) { if (gtk_shortcut_controller_trigger_shortcut (self, l->data, event)) diff --git a/gtk/meson.build b/gtk/meson.build index d75e4487fb..088cd29375 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -168,7 +168,6 @@ gtk_public_sources = files([ 'gtkassistant.c', 'gtkbbox.c', 'gtkbin.c', - 'gtkbindings.c', 'gtkborder.c', 'gtkbox.c', 'gtkbuildable.c', @@ -415,7 +414,6 @@ gtk_public_headers = files([ 'gtkassistant.h', 'gtkbbox.h', 'gtkbin.h', - 'gtkbindings.h', 'gtkborder.h', 'gtkbox.h', 'gtkbuildable.h', diff --git a/po-properties/POTFILES.in b/po-properties/POTFILES.in index 88b09d6641..1af8eafb34 100644 --- a/po-properties/POTFILES.in +++ b/po-properties/POTFILES.in @@ -76,7 +76,6 @@ gtk/gtkaspectframe.c gtk/gtkassistant.c gtk/gtkbbox.c gtk/gtkbin.c -gtk/gtkbindings.c gtk/gtkbookmarksmanager.c gtk/gtkbox.c gtk/gtkbuildable.c diff --git a/po/POTFILES.in b/po/POTFILES.in index 42880d004f..a661219991 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -76,7 +76,6 @@ gtk/gtkaspectframe.c gtk/gtkassistant.c gtk/gtkbbox.c gtk/gtkbin.c -gtk/gtkbindings.c gtk/gtkbookmarksmanager.c gtk/gtkbox.c gtk/gtkbuildable.c diff --git a/tests/testgtk.c b/tests/testgtk.c index 141f1b7f4b..a4921e4393 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -7200,7 +7200,6 @@ main (int argc, char *argv[]) { GtkCssProvider *provider, *memory_provider; GdkDisplay *display; - GtkBindingSet *binding_set; int i; gboolean done_benchmarks = FALSE; @@ -7284,15 +7283,6 @@ main (int argc, char *argv[]) if (done_benchmarks) return 0; - /* bindings test - */ - binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET)); - gtk_binding_entry_add_signal (binding_set, - '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK, - "debug_msg", - 1, - G_TYPE_STRING, "GtkWidgetClass 9 test"); - memory_provider = gtk_css_provider_new (); gtk_css_provider_load_from_data (memory_provider, "#testgtk-version-label {\n" diff --git a/tests/testgtk.css b/tests/testgtk.css index 991e49b6a9..4bd3f366b9 100644 --- a/tests/testgtk.css +++ b/tests/testgtk.css @@ -1,11 +1,6 @@ /* testgtk2.css sets all the buttons in the main window to blue by default */ @import url("testgtk2.css"); -@binding-set entry-bindings { - bind "s" { "move-cursor" (visual-positions, 3, 0) }; - bind "a" { "move-cursor" (visual-positions, -3, 0) }; -} - * { font-family: Sans; font-size: 12px; @@ -24,6 +19,3 @@ label:hover { background-color: rgb (0%, 75%, 0); } -entry { - -gtk-key-bindings: entry-bindings; -} diff --git a/testsuite/css/parser/at-invalid-22.css b/testsuite/css/parser/at-invalid-22.css deleted file mode 100644 index c5cd8a3fcc..0000000000 --- a/testsuite/css/parser/at-invalid-22.css +++ /dev/null @@ -1 +0,0 @@ -@binding-set "foo"; diff --git a/testsuite/css/parser/at-invalid-22.errors b/testsuite/css/parser/at-invalid-22.errors deleted file mode 100644 index 8aa742077e..0000000000 --- a/testsuite/css/parser/at-invalid-22.errors +++ /dev/null @@ -1 +0,0 @@ -at-invalid-22.css:1: error: GTK_CSS_PROVIDER_ERROR_SYNTAX diff --git a/testsuite/css/parser/at-invalid-22.ref.css b/testsuite/css/parser/at-invalid-22.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-invalid-23.css b/testsuite/css/parser/at-invalid-23.css deleted file mode 100644 index 4ecc50c09a..0000000000 --- a/testsuite/css/parser/at-invalid-23.css +++ /dev/null @@ -1 +0,0 @@ -@binding-set foo { bind key { "action"() }; }; diff --git a/testsuite/css/parser/at-invalid-23.errors b/testsuite/css/parser/at-invalid-23.errors deleted file mode 100644 index a2dbe8dbb0..0000000000 --- a/testsuite/css/parser/at-invalid-23.errors +++ /dev/null @@ -1,2 +0,0 @@ -at-invalid-23.css:1: error: GTK_CSS_PROVIDER_ERROR_SYNTAX -at-invalid-23.css:1: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-invalid-23.ref.css b/testsuite/css/parser/at-invalid-23.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-invalid-24.css b/testsuite/css/parser/at-invalid-24.css deleted file mode 100644 index 4ecc50c09a..0000000000 --- a/testsuite/css/parser/at-invalid-24.css +++ /dev/null @@ -1 +0,0 @@ -@binding-set foo { bind key { "action"() }; }; diff --git a/testsuite/css/parser/at-invalid-24.errors b/testsuite/css/parser/at-invalid-24.errors deleted file mode 100644 index 717e6b1fd1..0000000000 --- a/testsuite/css/parser/at-invalid-24.errors +++ /dev/null @@ -1,2 +0,0 @@ -at-invalid-24.css:1: error: GTK_CSS_PROVIDER_ERROR_SYNTAX -at-invalid-24.css:1: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-invalid-24.ref.css b/testsuite/css/parser/at-invalid-24.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-invalid-25.css b/testsuite/css/parser/at-invalid-25.css deleted file mode 100644 index 94123fbe03..0000000000 --- a/testsuite/css/parser/at-invalid-25.css +++ /dev/null @@ -1 +0,0 @@ -@binding-set foo { bind "key" { action() }; }; diff --git a/testsuite/css/parser/at-invalid-25.errors b/testsuite/css/parser/at-invalid-25.errors deleted file mode 100644 index 3f1ad85d24..0000000000 --- a/testsuite/css/parser/at-invalid-25.errors +++ /dev/null @@ -1,2 +0,0 @@ -at-invalid-25.css:1: error: GTK_CSS_PROVIDER_ERROR_SYNTAX -at-invalid-25.css:1: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-invalid-25.ref.css b/testsuite/css/parser/at-invalid-25.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-invalid-26.css b/testsuite/css/parser/at-invalid-26.css deleted file mode 100644 index 0ea47d61b3..0000000000 --- a/testsuite/css/parser/at-invalid-26.css +++ /dev/null @@ -1 +0,0 @@ -@binding-set foo { bind "key"; }; diff --git a/testsuite/css/parser/at-invalid-26.errors b/testsuite/css/parser/at-invalid-26.errors deleted file mode 100644 index bbe976361d..0000000000 --- a/testsuite/css/parser/at-invalid-26.errors +++ /dev/null @@ -1,2 +0,0 @@ -at-invalid-26.css:1: error: GTK_CSS_PROVIDER_ERROR_SYNTAX -at-invalid-26.css:1: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-invalid-26.ref.css b/testsuite/css/parser/at-invalid-26.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-invalid-27.css b/testsuite/css/parser/at-invalid-27.css deleted file mode 100644 index b0c81e113e..0000000000 --- a/testsuite/css/parser/at-invalid-27.css +++ /dev/null @@ -1 +0,0 @@ -@binding-set foo { unbind "key" { "bla" () }; }; diff --git a/testsuite/css/parser/at-invalid-27.errors b/testsuite/css/parser/at-invalid-27.errors deleted file mode 100644 index e15ca4864c..0000000000 --- a/testsuite/css/parser/at-invalid-27.errors +++ /dev/null @@ -1,2 +0,0 @@ -at-invalid-27.css:1: error: GTK_CSS_PROVIDER_ERROR_SYNTAX -at-invalid-27.css:1: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-invalid-27.ref.css b/testsuite/css/parser/at-invalid-27.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-valid-19.css b/testsuite/css/parser/at-valid-19.css deleted file mode 100644 index 026aad235c..0000000000 --- a/testsuite/css/parser/at-valid-19.css +++ /dev/null @@ -1 +0,0 @@ -@binding-set gtk-emacs-menu { bind "n" { "move-current" (next) }; }; diff --git a/testsuite/css/parser/at-valid-19.errors b/testsuite/css/parser/at-valid-19.errors deleted file mode 100644 index 8c865f145e..0000000000 --- a/testsuite/css/parser/at-valid-19.errors +++ /dev/null @@ -1 +0,0 @@ -at-valid-19.css:1: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-valid-19.ref.css b/testsuite/css/parser/at-valid-19.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-valid-20.css b/testsuite/css/parser/at-valid-20.css deleted file mode 100644 index e2ac94d67f..0000000000 --- a/testsuite/css/parser/at-valid-20.css +++ /dev/null @@ -1,4 +0,0 @@ -@binding-set gtk-emacs-text-view { - bind "u" { "move-cursor" (paragraph-ends, -1, 0) - "delete-from-cursor" (paragraph-ends, 1) }; -}; diff --git a/testsuite/css/parser/at-valid-20.errors b/testsuite/css/parser/at-valid-20.errors deleted file mode 100644 index b404d39704..0000000000 --- a/testsuite/css/parser/at-valid-20.errors +++ /dev/null @@ -1 +0,0 @@ -at-valid-20.css:4: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-valid-20.ref.css b/testsuite/css/parser/at-valid-20.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/at-valid-21.css b/testsuite/css/parser/at-valid-21.css deleted file mode 100644 index d4933bbcc2..0000000000 --- a/testsuite/css/parser/at-valid-21.css +++ /dev/null @@ -1,4 +0,0 @@ -@binding-set test { - bind "space" { "set-anchor" () }; - unbind "v"; -}; diff --git a/testsuite/css/parser/at-valid-21.errors b/testsuite/css/parser/at-valid-21.errors deleted file mode 100644 index 1bd8d5b004..0000000000 --- a/testsuite/css/parser/at-valid-21.errors +++ /dev/null @@ -1 +0,0 @@ -at-valid-21.css:4: error: GTK_CSS_PROVIDER_ERROR_DEPRECATED diff --git a/testsuite/css/parser/at-valid-21.ref.css b/testsuite/css/parser/at-valid-21.ref.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/testsuite/css/parser/meson.build b/testsuite/css/parser/meson.build index 9be1fdf8e7..a5e7d91c4c 100644 --- a/testsuite/css/parser/meson.build +++ b/testsuite/css/parser/meson.build @@ -101,24 +101,6 @@ test_data = [ 'at-invalid-21.css', 'at-invalid-21.errors', 'at-invalid-21.ref.css', - 'at-invalid-22.css', - 'at-invalid-22.errors', - 'at-invalid-22.ref.css', - 'at-invalid-23.css', - 'at-invalid-23.errors', - 'at-invalid-23.ref.css', - 'at-invalid-24.css', - 'at-invalid-24.errors', - 'at-invalid-24.ref.css', - 'at-invalid-25.css', - 'at-invalid-25.errors', - 'at-invalid-25.ref.css', - 'at-invalid-26.css', - 'at-invalid-26.errors', - 'at-invalid-26.ref.css', - 'at-invalid-27.css', - 'at-invalid-27.errors', - 'at-invalid-27.ref.css', 'at-valid-01.css', 'at-valid-01.ref.css', 'at-valid-02.css', @@ -153,15 +135,6 @@ test_data = [ 'at-valid-17.css', 'at-valid-18.css', 'at-valid-18.ref.css', - 'at-valid-19.css', - 'at-valid-19.errors', - 'at-valid-19.ref.css', - 'at-valid-20.css', - 'at-valid-20.errors', - 'at-valid-20.ref.css', - 'at-valid-21.css', - 'at-valid-21.errors', - 'at-valid-21.ref.css', 'background-blend-mode.css', 'background-blend-mode.ref.css', 'background-clip.css',