[gtk/wip/matthiasc/shortcut-4: 118/149] shortcuttrigger: Introduce partial matches
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/shortcut-4: 118/149] shortcuttrigger: Introduce partial matches
- Date: Wed, 25 Mar 2020 20:40:58 +0000 (UTC)
commit 36dc2f3e9487280f3df58c4912bd60240c59c150
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Mar 22 09:16:57 2020 -0400
shortcuttrigger: Introduce partial matches
Allow GtkShortcutTrigger to return partial matches.
Currently, no triggers produce such results, and
GtkShortcutController treats partial matches like
exact ones.
gtk/gtkshortcutcontroller.c | 2 +-
gtk/gtkshortcuttrigger.c | 47 +++++++++++++++++++++++----------------------
gtk/gtkshortcuttrigger.h | 21 +++++++++++++++++++-
testsuite/gtk/shortcuts.c | 14 +++++++-------
4 files changed, 52 insertions(+), 32 deletions(-)
---
diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c
index fedd5bfad8..b17b5f0d75 100644
--- a/gtk/gtkshortcutcontroller.c
+++ b/gtk/gtkshortcutcontroller.c
@@ -247,7 +247,7 @@ gtk_shortcut_controller_trigger_shortcut (GtkShortcutController *self,
{
GtkWidget *widget;
- if (!gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics))
+ if (gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics) ==
GTK_SHORTCUT_TRIGGER_MATCH_NONE)
return FALSE;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
diff --git a/gtk/gtkshortcuttrigger.c b/gtk/gtkshortcuttrigger.c
index 064dae4d3f..828a8486d2 100644
--- a/gtk/gtkshortcuttrigger.c
+++ b/gtk/gtkshortcuttrigger.c
@@ -59,7 +59,8 @@ struct _GtkShortcutTriggerClass
const char *type_name;
void (* finalize) (GtkShortcutTrigger *trigger);
- gboolean (* trigger) (GtkShortcutTrigger *trigger,
+ GtkShortcutTriggerMatch
+ (* trigger) (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics);
guint (* hash) (GtkShortcutTrigger *trigger);
@@ -166,17 +167,16 @@ gtk_shortcut_trigger_get_trigger_type (GtkShortcutTrigger *self)
* value of this property is determined by checking that the passed
* in @event is a Key event and has the right modifiers set.
*
- * Checks if the given @event triggers @self. If so,
- * returns %TRUE.
+ * Checks if the given @event triggers @self.
*
- * Returns: %TRUE if this event triggered the trigger
+ * Returns: Whether the event triggered the shortcut
**/
-gboolean
+GtkShortcutTriggerMatch
gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
GdkEvent *event,
gboolean enable_mnemonics)
{
- g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), FALSE);
+ g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), GTK_SHORTCUT_TRIGGER_MATCH_NONE);
return self->trigger_class->trigger (self, event, enable_mnemonics);
}
@@ -411,12 +411,12 @@ gtk_never_trigger_finalize (GtkShortcutTrigger *trigger)
g_assert_not_reached ();
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_never_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
{
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
}
static guint
@@ -493,7 +493,7 @@ gtk_keyval_trigger_finalize (GtkShortcutTrigger *trigger)
{
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_keyval_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
@@ -503,7 +503,7 @@ gtk_keyval_trigger_trigger (GtkShortcutTrigger *trigger,
guint keyval;
if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
/* XXX: This needs to deal with groups */
modifiers = gdk_event_get_modifier_state (event);
@@ -514,7 +514,10 @@ gtk_keyval_trigger_trigger (GtkShortcutTrigger *trigger,
else
keyval = gdk_keyval_to_lower (keyval);
- return keyval == self->keyval && modifiers == self->modifiers;
+ if (keyval != self->keyval || modifiers != self->modifiers)
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
+
+ return GTK_SHORTCUT_TRIGGER_MATCH_EXACT;
}
static guint
@@ -659,7 +662,7 @@ gtk_mnemonic_trigger_finalize (GtkShortcutTrigger *trigger)
{
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_mnemonic_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
@@ -668,10 +671,10 @@ gtk_mnemonic_trigger_trigger (GtkShortcutTrigger *trigger,
guint keyval;
if (!enable_mnemonics)
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
/* XXX: This needs to deal with groups */
keyval = gdk_key_event_get_keyval (event);
@@ -681,7 +684,10 @@ gtk_mnemonic_trigger_trigger (GtkShortcutTrigger *trigger,
else
keyval = gdk_keyval_to_lower (keyval);
- return keyval == self->keyval;
+ if (keyval != self->keyval)
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
+
+ return GTK_SHORTCUT_TRIGGER_MATCH_EXACT;
}
static guint
@@ -814,20 +820,15 @@ gtk_alternative_trigger_finalize (GtkShortcutTrigger *trigger)
gtk_shortcut_trigger_unref (self->second);
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_alternative_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
{
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
- if (gtk_shortcut_trigger_trigger (self->first, event, enable_mnemonics))
- return TRUE;
-
- if (gtk_shortcut_trigger_trigger (self->second, event, enable_mnemonics))
- return TRUE;
-
- return FALSE;
+ return MAX (gtk_shortcut_trigger_trigger (self->first, event, enable_mnemonics),
+ gtk_shortcut_trigger_trigger (self->second, event, enable_mnemonics));
}
static guint
diff --git a/gtk/gtkshortcuttrigger.h b/gtk/gtkshortcuttrigger.h
index b0ab8af862..627072ea53 100644
--- a/gtk/gtkshortcuttrigger.h
+++ b/gtk/gtkshortcuttrigger.h
@@ -51,6 +51,25 @@ typedef enum {
GTK_SHORTCUT_TRIGGER_ALTERNATIVE
} GtkShortcutTriggerType;
+/**
+ * GtkShortcutTriggerMatch:
+ * @GTK_SHORTCUT_TRIGGER_MATCH_NONE: The key event does not
+ * match the trigger
+ * @GTK_SHORTCUT_TRIGGER_MATCH_PARTIAL: The key event matches
+ * the trigger if keyboard state (specifically, the currently
+ * active group) is ignored
+ * @GTK_SHORTCUT_TRIGGER_MATCH_EXACT: The key event matches
+ * the trigger
+ *
+ * The possible return values from gtk_shortcut_trigger_trigger()
+ * describe if a key event triggers a shortcut.
+ */
+typedef enum {
+ GTK_SHORTCUT_TRIGGER_MATCH_NONE,
+ GTK_SHORTCUT_TRIGGER_MATCH_PARTIAL,
+ GTK_SHORTCUT_TRIGGER_MATCH_EXACT,
+} GtkShortcutTriggerMatch;
+
GDK_AVAILABLE_IN_ALL
GType gtk_shortcut_trigger_get_type (void) G_GNUC_CONST;
@@ -88,7 +107,7 @@ gint gtk_shortcut_trigger_compare (gconstpointer
gconstpointer trigger2);
GDK_AVAILABLE_IN_ALL
-gboolean gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
+GtkShortcutTriggerMatch gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
GdkEvent *event,
gboolean enable_mnemonics);
diff --git a/testsuite/gtk/shortcuts.c b/testsuite/gtk/shortcuts.c
index 757b2803e4..e06b1814e9 100644
--- a/testsuite/gtk/shortcuts.c
+++ b/testsuite/gtk/shortcuts.c
@@ -195,14 +195,14 @@ test_trigger_trigger (void)
guint keyval;
GdkModifierType state;
gboolean mnemonic;
- gboolean result[4];
+ GtkShortcutTriggerMatch result[4];
} tests[] = {
- { GDK_KEY_a, GDK_CONTROL_MASK, FALSE, { 0, 1, 0, 1 } },
- { GDK_KEY_a, GDK_CONTROL_MASK, TRUE, { 0, 1, 0, 1 } },
- { GDK_KEY_a, GDK_SHIFT_MASK, FALSE, { 0, 0, 0, 0 } },
- { GDK_KEY_a, GDK_SHIFT_MASK, TRUE, { 0, 0, 0, 0 } },
- { GDK_KEY_u, GDK_SHIFT_MASK, FALSE, { 0, 0, 0, 0 } },
- { GDK_KEY_u, GDK_SHIFT_MASK, TRUE, { 0, 0, 1, 1 } },
+ { GDK_KEY_a, GDK_CONTROL_MASK, FALSE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE,
GTK_SHORTCUT_TRIGGER_MATCH_EXACT, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT } },
+ { GDK_KEY_a, GDK_CONTROL_MASK, TRUE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE,
GTK_SHORTCUT_TRIGGER_MATCH_EXACT, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT } },
+ { GDK_KEY_a, GDK_SHIFT_MASK, FALSE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE,
GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE } },
+ { GDK_KEY_a, GDK_SHIFT_MASK, TRUE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE,
GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE } },
+ { GDK_KEY_u, GDK_SHIFT_MASK, FALSE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE,
GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE } },
+ { GDK_KEY_u, GDK_SHIFT_MASK, TRUE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE,
GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT, GTK_SHORTCUT_TRIGGER_MATCH_EXACT } },
};
int i;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]