Add parsing for GtkAlternativeTrigger
authorEmmanuele Bassi <ebassi@gnome.org>
Thu, 26 Mar 2020 16:58:55 +0000 (16:58 +0000)
committerEmmanuele Bassi <ebassi@gnome.org>
Fri, 27 Mar 2020 14:35:00 +0000 (14:35 +0000)
Alternative triggers are separate by a pipe character.

gtk/gtkshortcuttrigger.c
testsuite/gtk/shortcuts.c

index 6840ef10d2ee7f1ccc88b5642f748871c9052e19..0fdc5edb17d728051e5da1b8ef699b430844c424 100644 (file)
@@ -120,6 +120,8 @@ 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) (transfer full): a new #GtkShortcutTrigger
  *   or %NULL on error
@@ -129,9 +131,44 @@ gtk_shortcut_trigger_parse_string (const char *string)
 {
   GdkModifierType modifiers;
   guint keyval;
+  const char *sep;
 
   g_return_val_if_fail (string != NULL, NULL);
 
+  if ((sep = strchr (string, '|')) != NULL)
+    {
+      char *frag_a = g_strndup (string, sep - string);
+      const char *frag_b = sep + 1;
+      GtkShortcutTrigger *t1, *t2;
+
+      /* empty first slot */
+      if (*frag_a == '\0')
+        return NULL;
+
+      /* empty second slot */
+      if (*frag_b == '\0')
+        return NULL;
+
+      t1 = gtk_shortcut_trigger_parse_string (frag_a);
+      if (t1 == NULL)
+        {
+          g_free (frag_a);
+          return NULL;
+        }
+
+      t2 = gtk_shortcut_trigger_parse_string (frag_b);
+      if (t2 == NULL)
+        {
+          g_object_unref (t1);
+          g_free (frag_a);
+          return NULL;
+        }
+
+      g_free (frag_a);
+
+      return gtk_alternative_trigger_new (t1, t2);
+    }
+
   if (g_str_equal (string, "never"))
     return g_object_ref (gtk_never_trigger_get ());
 
@@ -398,7 +435,7 @@ static void
 gtk_never_trigger_print (GtkShortcutTrigger *trigger,
                          GString            *string)
 {
-  g_string_append (string, "<never>");
+  g_string_append (string, "never");
 }
 
 static gboolean
@@ -1091,7 +1128,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);
 }
 
index 1236baeff0a188e32885b859a719767cabfeb770..fca321a49fde5d6c15bfbfcf8cbde8613dc018da 100644 (file)
@@ -157,6 +157,7 @@ test_trigger_parse (void)
   {
     TRIGGER_KEYVAL,
     TRIGGER_MNEMONIC,
+    TRIGGER_ALT,
     TRIGGER_NEVER,
     TRIGGER_INVALID
   };
@@ -178,6 +179,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;
@@ -200,6 +202,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;