diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c index 7dee9871cc..e26da3fb62 100644 --- a/gtk/gtkshortcutcontroller.c +++ b/gtk/gtkshortcutcontroller.c @@ -29,7 +29,7 @@ #include "config.h" -#include "gtkshortcutcontroller.h" +#include "gtkshortcutcontrollerprivate.h" #include "gtkeventcontrollerprivate.h" #include "gtkbindings.h" @@ -41,6 +41,8 @@ struct _GtkShortcutController { GtkEventController parent_instance; + + guint run_class : 1; }; struct _GtkShortcutControllerClass @@ -79,13 +81,17 @@ gtk_shortcut_controller_handle_event (GtkEventController *controller, const GSList *l; 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 (self->run_class) { - if (gtk_shortcut_controller_trigger_shortcut (self, l->data, event)) + 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)) + return TRUE; + } } return FALSE; @@ -112,3 +118,10 @@ gtk_shortcut_controller_new (void) return g_object_new (GTK_TYPE_SHORTCUT_CONTROLLER, NULL); } + +void +gtk_shortcut_controller_set_run_class (GtkShortcutController *controller, + gboolean run_class) +{ + controller->run_class = run_class; +} diff --git a/gtk/gtkshortcutcontrollerprivate.h b/gtk/gtkshortcutcontrollerprivate.h new file mode 100644 index 0000000000..945e526e66 --- /dev/null +++ b/gtk/gtkshortcutcontrollerprivate.h @@ -0,0 +1,28 @@ +/* + * Copyright © 2018 Benjamin Otte + * + * 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.1 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 . + * + * Authors: Benjamin Otte + */ + +#ifndef __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__ +#define __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__ + +#include "gtkshortcutcontroller.h" + +void gtk_shortcut_controller_set_run_class (GtkShortcutController *controller, + gboolean run_class); + +#endif /* __GTK_SHORTCUT_CONTROLLER_H__ */ diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 87ba880adf..e22bfe3670 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -61,7 +61,7 @@ #include "gtkselection.h" #include "gtksettingsprivate.h" #include "gtkshortcut.h" -#include "gtkshortcutcontroller.h" +#include "gtkshortcutcontrollerprivate.h" #include "gtkshortcuttrigger.h" #include "gtksizegroup-private.h" #include "gtksnapshotprivate.h" @@ -2766,6 +2766,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) { GtkWidget *widget = GTK_WIDGET (instance); GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); + GtkEventController *controller; GType layout_manager_type; widget->priv = priv; @@ -2840,7 +2841,9 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) if (layout_manager_type != G_TYPE_INVALID) gtk_widget_set_layout_manager (widget, g_object_new (layout_manager_type, NULL)); - gtk_widget_add_controller (widget, gtk_shortcut_controller_new ()); + controller = gtk_shortcut_controller_new (); + gtk_shortcut_controller_set_run_class (GTK_SHORTCUT_CONTROLLER (controller), TRUE); + gtk_widget_add_controller (widget, controller); } /**