summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2018-08-20 04:18:28 +0200
committerMatthias Clasen <mclasen@redhat.com>2020-03-18 23:00:51 -0400
commit3b595f57200d038905a1ff161a66e8507e4d4257 (patch)
tree6af4f4e8ccbfd776c4c811c7810a10a4388c1fc4
parentd14807b93db5498136658571820bc94e1ed240d4 (diff)
downloadgtk+-3b595f57200d038905a1ff161a66e8507e4d4257.tar.gz
widget: Keep keybindings as a GListStore
This way, we can use shortcut_controller_new_for_model() and avoid all the special casing about run_class.
-rw-r--r--gtk/gtkshortcutcontroller.c19
-rw-r--r--gtk/gtkshortcutcontrollerprivate.h2
-rw-r--r--gtk/gtkwidget.c40
-rw-r--r--gtk/gtkwidgetprivate.h2
4 files changed, 27 insertions, 36 deletions
diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c
index d5d47b239d..f2afe0354c 100644
--- a/gtk/gtkshortcutcontroller.c
+++ b/gtk/gtkshortcutcontroller.c
@@ -53,7 +53,6 @@ struct _GtkShortcutController
GdkModifierType mnemonics_modifiers;
guint custom_shortcuts : 1;
- guint run_class : 1;
guint run_managed : 1;
};
@@ -246,17 +245,6 @@ gtk_shortcut_controller_run_controllers (GtkEventController *controller,
return TRUE;
}
- if (self->run_class)
- {
- widget = gtk_event_controller_get_widget (controller);
-
- 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, enable_mnemonics))
- return TRUE;
- }
- }
-
if (self->run_managed)
{
GtkPropagationPhase current_phase = gtk_event_controller_get_propagation_phase (controller);
@@ -496,13 +484,6 @@ gtk_shortcut_controller_new_for_model (GListModel *model)
}
void
-gtk_shortcut_controller_set_run_class (GtkShortcutController *controller,
- gboolean run_class)
-{
- controller->run_class = run_class;
-}
-
-void
gtk_shortcut_controller_set_run_managed (GtkShortcutController *controller,
gboolean run_managed)
{
diff --git a/gtk/gtkshortcutcontrollerprivate.h b/gtk/gtkshortcutcontrollerprivate.h
index 42594ea6eb..a7086cd678 100644
--- a/gtk/gtkshortcutcontrollerprivate.h
+++ b/gtk/gtkshortcutcontrollerprivate.h
@@ -22,8 +22,6 @@
#include "gtkshortcutcontroller.h"
-void gtk_shortcut_controller_set_run_class (GtkShortcutController *controller,
- gboolean run_class);
void gtk_shortcut_controller_set_run_managed (GtkShortcutController *controller,
gboolean run_managed);
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 21a71a99a1..71d31fda46 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -495,7 +495,7 @@ typedef struct {
struct _GtkWidgetClassPrivate
{
GtkWidgetTemplate *template;
- GSList *shortcuts;
+ GListStore *shortcuts;
GType accessible_type;
AtkRole accessible_role;
GQuark css_name;
@@ -786,9 +786,29 @@ static void
gtk_widget_base_class_init (gpointer g_class)
{
GtkWidgetClass *klass = g_class;
+ GtkWidgetClassPrivate *priv;
+
+ priv = klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
+
+ priv->template = NULL;
+
+ if (priv->shortcuts == NULL)
+ {
+ priv->shortcuts = g_list_store_new (GTK_TYPE_SHORTCUT);
+ }
+ else
+ {
+ GListModel *parent_shortcuts = G_LIST_MODEL (priv->shortcuts);
+ guint i;
- klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
- klass->priv->template = NULL;
+ priv->shortcuts = g_list_store_new (GTK_TYPE_SHORTCUT);
+ for (i = 0; i < g_list_model_get_n_items (parent_shortcuts); i++)
+ {
+ GtkShortcut *shortcut = g_list_model_get_item (parent_shortcuts, i);
+ g_list_store_append (priv->shortcuts, shortcut);
+ g_object_unref (shortcut);
+ }
+ }
}
static void
@@ -1738,8 +1758,9 @@ gtk_widget_class_init (GtkWidgetClass *klass)
static void
gtk_widget_base_class_finalize (GtkWidgetClass *klass)
{
+
template_data_free (klass->priv->template);
- g_slist_free_full (klass->priv->shortcuts, g_object_unref);
+ g_object_unref (klass->priv->shortcuts);
}
static void
@@ -2455,8 +2476,7 @@ 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));
- controller = gtk_shortcut_controller_new ();
- gtk_shortcut_controller_set_run_class (GTK_SHORTCUT_CONTROLLER (controller), TRUE);
+ controller = gtk_shortcut_controller_new_for_model (G_LIST_MODEL (GTK_WIDGET_CLASS (g_class)->priv->shortcuts));
gtk_widget_add_controller (widget, controller);
}
@@ -4522,13 +4542,7 @@ gtk_widget_class_add_shortcut (GtkWidgetClass *widget_class,
priv = widget_class->priv;
- priv->shortcuts = g_slist_prepend (priv->shortcuts, g_object_ref (shortcut));
-}
-
-const GSList *
-gtk_widget_class_get_shortcuts (GtkWidgetClass *widget_class)
-{
- return widget_class->priv->shortcuts;
+ g_list_store_append (priv->shortcuts, shortcut);
}
static gboolean
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 6ddbac0c89..8e9fa6b61f 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -230,8 +230,6 @@ void _gtk_widget_add_attached_window (GtkWidget *widget,
void _gtk_widget_remove_attached_window (GtkWidget *widget,
GtkWindow *window);
-const GSList * gtk_widget_class_get_shortcuts (GtkWidgetClass *widget_class);
-
AtkObject * _gtk_widget_peek_accessible (GtkWidget *widget);
void _gtk_widget_set_has_default (GtkWidget *widget,