[gtk/wip/matthiasc/shortcut-4: 118/139] shortcutcontroller: Only activate shortcuts of visible widgets
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/shortcut-4: 118/139] shortcutcontroller: Only activate shortcuts of visible widgets
- Date: Thu, 26 Mar 2020 02:46:46 +0000 (UTC)
commit 0586481e6fa04f1237db5f87bf7017d220b6c691
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Mar 22 20:58:35 2020 -0400
shortcutcontroller: Only activate shortcuts of visible widgets
Our shortcuts are like mnemonics in this respect - they only
activate when the widget is viewable.
gtk/gtkshortcutcontroller.c | 41 +++++++++++++++++++++++++++++------------
1 file changed, 29 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c
index 8d2c5f1f35..aaab3d6419 100644
--- a/gtk/gtkshortcutcontroller.c
+++ b/gtk/gtkshortcutcontroller.c
@@ -43,6 +43,7 @@
#include "gtkshortcuttrigger.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
+#include "gtknative.h"
#include <gdk/gdk.h>
@@ -242,6 +243,7 @@ gtk_shortcut_controller_finalize (GObject *object)
typedef struct {
GtkShortcut *shortcut;
+ GtkWidget *widget;
guint index;
} ShortcutData;
@@ -273,6 +275,8 @@ gtk_shortcut_controller_run_controllers (GtkEventController *controller,
GtkShortcut *shortcut;
ShortcutData *data;
guint index;
+ GtkWidget *widget;
+ GtkNative *native;
index = (self->last_activated + 1 + i) % g_list_model_get_n_items (self->shortcuts);
shortcut = g_list_model_get_item (self->shortcuts, index);
@@ -301,9 +305,28 @@ gtk_shortcut_controller_run_controllers (GtkEventController *controller,
g_assert_not_reached ();
}
+ 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), index);
+ if (GTK_IS_SHORTCUT_CONTROLLER (model))
+ widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (model));
+ }
+
+ native = gtk_widget_get_native (widget);
+ if (!gtk_widget_is_sensitive (widget) ||
+ !gtk_widget_get_mapped (widget) ||
+ !gdk_surface_is_viewable (gtk_native_get_surface (native)))
+ {
+ g_object_unref (shortcut);
+ continue;
+ }
+
data = g_new0 (ShortcutData, 1);
data->shortcut = shortcut;
data->index = index;
+ data->widget = widget;
shortcuts = g_slist_append (shortcuts, data);
}
@@ -311,20 +334,10 @@ gtk_shortcut_controller_run_controllers (GtkEventController *controller,
for (l = shortcuts; l; l = l->next)
{
ShortcutData *data = l->data;
- GtkWidget *widget;
-
- 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), data->index);
- if (GTK_IS_SHORTCUT_CONTROLLER (model))
- widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (model));
- }
if (gtk_shortcut_action_activate (gtk_shortcut_get_action (data->shortcut),
shortcuts->next == NULL ? GTK_SHORTCUT_ACTION_EXCLUSIVE : 0,
- widget,
+ data->widget,
gtk_shortcut_get_arguments (data->shortcut)))
{
self->last_activated = data->index;
@@ -345,12 +358,16 @@ gtk_shortcut_controller_handle_event (GtkEventController *controller,
double y)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
+ GdkEventType event_type = gdk_event_get_event_type (event);
gboolean enable_mnemonics;
if (self->scope != GTK_SHORTCUT_SCOPE_LOCAL)
return FALSE;
- if (gdk_event_get_event_type (event) == GDK_KEY_PRESS)
+ if (event_type != GDK_KEY_PRESS && event_type != GDK_KEY_RELEASE)
+ return FALSE;
+
+ if (event_type == GDK_KEY_PRESS)
{
GdkModifierType modifiers;
modifiers = gdk_event_get_modifier_state (event);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]