[gtk/trigger-parser: 3/3] Add parsing for GtkAlternativeTrigger
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/trigger-parser: 3/3] Add parsing for GtkAlternativeTrigger
- Date: Thu, 26 Mar 2020 17:02:06 +0000 (UTC)
commit 749ca379a6484c19861a4da2320b7db320ef751f
Author: Emmanuele Bassi <ebassi gnome org>
Date: Thu Mar 26 16:58:55 2020 +0000
Add parsing for GtkAlternativeTrigger
Alternative triggers are separate by a pipe character.
gtk/gtkshortcuttrigger.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
testsuite/gtk/shortcuts.c | 5 +++++
2 files changed, 47 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkshortcuttrigger.c b/gtk/gtkshortcuttrigger.c
index ffa59b124f..e4e824fc41 100644
--- a/gtk/gtkshortcuttrigger.c
+++ b/gtk/gtkshortcuttrigger.c
@@ -120,8 +120,11 @@ gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
* - `never`, for #GtkNeverTrigger
* - a string parsed by gtk_accelerator_parse(), for a #GtkKeyvalTrigger
* - underscore, followed by a single character, for #GtkMnemonicTrigger
+ * - two valid trigger strings, separated by a `|` character, for a
+ * #GtkAlternativeTrigger
*
- * Returns: (nullable): a new #GtkShortcutTrigger or %NULL on error
+ * Returns: (nullable) (transfer full): a new #GtkShortcutTrigger
+ * or %NULL on error
*/
GtkShortcutTrigger *
gtk_shortcut_trigger_parse_string (const char *string)
@@ -131,8 +134,44 @@ gtk_shortcut_trigger_parse_string (const char *string)
g_return_val_if_fail (string != NULL, NULL);
+ if (strchr (string, '|') != NULL)
+ {
+ const char *sep = strchr (string, '|');
+ char *frag_a = g_strndup (string, sep - string - 1);
+ char *frag_b = g_strdup (sep + 1);
+ GtkShortcutTrigger *t1, *t2;
+
+ if (frag_b == NULL)
+ {
+ g_free (frag_a);
+ return NULL;
+ }
+
+ t1 = gtk_shortcut_trigger_parse_string (frag_a);
+ if (t1 == NULL)
+ {
+ g_free (frag_a);
+ g_free (frag_b);
+ return NULL;
+ }
+
+ t2 = gtk_shortcut_trigger_parse_string (frag_b);
+ if (t2 == NULL)
+ {
+ g_object_unref (t1);
+ g_free (frag_a);
+ g_free (frag_b);
+ return NULL;
+ }
+
+ g_free (frag_a);
+ g_free (frag_b);
+
+ return gtk_alternative_trigger_new (t1, t2);
+ }
+
if (g_str_equal (string, "never"))
- return gtk_never_trigger_get ();
+ return g_object_ref (gtk_never_trigger_get ());
if (string[0] == '_')
{
@@ -1090,7 +1129,7 @@ gtk_alternative_trigger_print (GtkShortcutTrigger *trigger,
GtkAlternativeTrigger *self = GTK_ALTERNATIVE_TRIGGER (trigger);
gtk_shortcut_trigger_print (self->first, string);
- g_string_append (string, ", ");
+ g_string_append (string, "|");
gtk_shortcut_trigger_print (self->second, string);
}
diff --git a/testsuite/gtk/shortcuts.c b/testsuite/gtk/shortcuts.c
index 1c496a2947..e3bd5cafbf 100644
--- a/testsuite/gtk/shortcuts.c
+++ b/testsuite/gtk/shortcuts.c
@@ -156,6 +156,7 @@ test_trigger_parse (void)
enum {
TRIGGER_KEYVAL,
TRIGGER_MNEMONIC,
+ TRIGGER_ALT,
TRIGGER_NEVER,
TRIGGER_INVALID
};
@@ -177,6 +178,7 @@ test_trigger_parse (void)
{ "_s", 0, GDK_KEY_s, TRIGGER_MNEMONIC },
{ "foo", 0, 0, TRIGGER_INVALID },
{ "<Nyaa>B", 0, 0, TRIGGER_INVALID },
+ { "<Control>U|<Shift><Control>U", GDK_CONTROL_MASK, 'u', TRIGGER_ALT }
};
GtkShortcutTrigger *trigger;
int i;
@@ -199,6 +201,9 @@ test_trigger_parse (void)
==,
tests[i].keyval);
break;
+ case TRIGGER_ALT:
+ g_assert_true (GTK_IS_ALTERNATIVE_TRIGGER (trigger));
+ break;
case TRIGGER_NEVER:
g_assert_true (GTK_IS_NEVER_TRIGGER (trigger));
break;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]