shortcutcontroller: Use a list model for shortcuts

This commit is contained in:
Matthias Clasen 2020-03-25 17:28:01 -04:00
parent 4c5d8547be
commit 5763514ab8
2 changed files with 19 additions and 30 deletions

View File

@ -34,6 +34,7 @@
#include "gtkshortcutcontrollerprivate.h"
#include "gtkflattenlistmodel.h"
#include "gtkeventcontrollerprivate.h"
#include "gtkintl.h"
#include "gtkshortcut.h"
@ -53,7 +54,6 @@ struct _GtkShortcutController
GdkModifierType mnemonics_modifiers;
guint custom_shortcuts : 1;
guint run_managed : 1;
};
struct _GtkShortcutControllerClass
@ -212,15 +212,27 @@ gtk_shortcut_controller_finalize (GObject *object)
static gboolean
gtk_shortcut_controller_trigger_shortcut (GtkShortcutController *self,
GtkShortcut *shortcut,
guint position,
GdkEvent *event,
gboolean enable_mnemonics)
{
GtkWidget *widget;
if (!gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics))
return FALSE;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
if (!self->custom_shortcuts &&
GTK_IS_FLATTEN_LIST_MODEL (self->shortcuts))
{
GListModel *model = gtk_flatten_list_model_get_model_for_item (GTK_FLATTEN_LIST_MODEL (self->shortcuts), position);
if (GTK_IS_SHORTCUT_CONTROLLER (model))
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (model));
}
return gtk_shortcut_action_activate (gtk_shortcut_get_action (shortcut),
GTK_SHORTCUT_ACTION_EXCLUSIVE, /* FIXME */
gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self)),
widget,
gtk_shortcut_get_arguments (shortcut));
}
@ -232,34 +244,21 @@ gtk_shortcut_controller_run_controllers (GtkEventController *controller,
gboolean enable_mnemonics)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
GtkWidget *widget;
const GSList *l;
guint i;
for (i = 0; i < g_list_model_get_n_items (self->shortcuts); i++)
{
GtkShortcut *shortcut = g_list_model_get_item (self->shortcuts, i);
g_object_unref (shortcut);
if (gtk_shortcut_controller_trigger_shortcut (self,
g_list_model_get_item (self->shortcuts, i),
shortcut,
i,
event,
enable_mnemonics))
return TRUE;
}
if (self->run_managed)
{
GtkPropagationPhase current_phase = gtk_event_controller_get_propagation_phase (controller);
widget = gtk_event_controller_get_widget (controller);
for (l = g_object_get_data (G_OBJECT (widget), "gtk-shortcut-controllers"); l; l = l->next)
{
if (gtk_event_controller_get_propagation_phase (l->data) != current_phase)
continue;
if (gtk_shortcut_controller_run_controllers (l->data, event, x, y, enable_mnemonics))
return TRUE;
}
}
return FALSE;
}
@ -483,13 +482,6 @@ gtk_shortcut_controller_new_for_model (GListModel *model)
NULL);
}
void
gtk_shortcut_controller_set_run_managed (GtkShortcutController *controller,
gboolean run_managed)
{
controller->run_managed = run_managed;
}
/**
* gtk_shortcut_controller_add_shortcut:
* @self: the controller

View File

@ -22,9 +22,6 @@
#include "gtkshortcutcontroller.h"
void gtk_shortcut_controller_set_run_managed (GtkShortcutController *controller,
gboolean run_managed);
void gtk_shortcut_controller_root (GtkShortcutController *controller);
void gtk_shortcut_controller_unroot (GtkShortcutController *controller);