summaryrefslogtreecommitdiff
path: root/gtk/gtkshortcutlabel.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-11-14 21:34:43 -0500
committerMatthias Clasen <mclasen@redhat.com>2015-11-14 21:34:43 -0500
commit705d371362c005a4ea699d0b617cdf9d8a336877 (patch)
treee3769d91c62a84cc10b87cd9898b4ddf1a56ee23 /gtk/gtkshortcutlabel.c
parentfe65c3ac4ce3aa403ee01622f6247874e6eb93ee (diff)
downloadgtk+-705d371362c005a4ea699d0b617cdf9d8a336877.tar.gz
help overlay: Allow key sequences
Extend the syntax to allow sequences of keys or key combinations, e.g. t+t or <ctl>c+<ctl>x. https://bugzilla.gnome.org/show_bug.cgi?id=758051
Diffstat (limited to 'gtk/gtkshortcutlabel.c')
-rw-r--r--gtk/gtkshortcutlabel.c94
1 files changed, 53 insertions, 41 deletions
diff --git a/gtk/gtkshortcutlabel.c b/gtk/gtkshortcutlabel.c
index 12f14678b7..24c4f1b5f3 100644
--- a/gtk/gtkshortcutlabel.c
+++ b/gtk/gtkshortcutlabel.c
@@ -190,15 +190,58 @@ display_shortcut (GtkContainer *self,
g_strfreev (keys);
}
-static void
-gtk_shortcut_label_rebuild (GtkShortcutLabel *self)
+static gboolean
+parse_sequence (GtkShortcutLabel *self,
+ const gchar *str)
{
- gchar **accels = NULL;
+ gchar **accels;
+ gint k;
GdkModifierType modifier = 0;
- GdkModifierType modifier2 = 0;
guint key = 0;
- guint key2 = 0;
- guint k;
+ gboolean retval = TRUE;
+
+ accels = g_strsplit (str, "+", 0);
+ for (k = 0; accels[k]; k++)
+ {
+ gtk_accelerator_parse (accels[k], &key, &modifier);
+ if (key == 0 && modifier == 0)
+ {
+ retval = FALSE;
+ break;
+ }
+ display_shortcut (GTK_CONTAINER (self), key, modifier);
+ }
+ g_strfreev (accels);
+
+ return retval;
+}
+
+static gboolean
+parse_range (GtkShortcutLabel *self,
+ const gchar *str)
+{
+ gchar *dots;
+
+ dots = strstr (str, "...");
+ if (!dots)
+ return parse_sequence (self, str);
+
+ dots[0] = '\0';
+ if (!parse_sequence (self, str))
+ return FALSE;
+
+ gtk_container_add (GTK_CONTAINER (self), dim_label ("⋯"));
+ if (!parse_sequence (self, dots + 3))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+gtk_shortcut_label_rebuild (GtkShortcutLabel *self)
+{
+ gchar **accels;
+ gint k;
gtk_container_foreach (GTK_CONTAINER (self), (GtkCallback)gtk_widget_destroy, NULL);
@@ -208,46 +251,15 @@ gtk_shortcut_label_rebuild (GtkShortcutLabel *self)
accels = g_strsplit (self->accelerator, " ", 0);
for (k = 0; accels[k]; k++)
{
- gchar *dots;
-
- dots = strstr (accels[k], "...");
- if (dots)
- {
- dots[0] = '\0';
- gtk_accelerator_parse (dots + 3, &key2, &modifier2);
- if ((key2 == 0) && (modifier2 == 0))
- {
- g_warning ("Failed to parse %s, part of accelerator '%s'", dots + 3, self->accelerator);
- goto out;
- }
- }
- else
- key2 = 0;
+ if (k > 0)
+ gtk_container_add (GTK_CONTAINER (self), dim_label ("/"));
- gtk_accelerator_parse (accels[k], &key, &modifier);
- if ((key == 0) && (modifier == 0))
+ if (!parse_range (self, accels[k]))
{
g_warning ("Failed to parse %s, part of accelerator '%s'", accels[k], self->accelerator);
- goto out;
+ break;
}
-
- if (k > 0)
- gtk_container_add (GTK_CONTAINER (self), dim_label ("/"));
-
- display_shortcut (GTK_CONTAINER (self), key, modifier);
-
- if (key2 == 0)
- continue;
-
- if (modifier2 == modifier)
- modifier2 = 0;
-
- gtk_container_add (GTK_CONTAINER (self), dim_label ("⋯"));
-
- display_shortcut (GTK_CONTAINER (self), key2, modifier2);
}
-
-out:
g_strfreev (accels);
}