diff options
author | Matthias Clasen <mclasen@redhat.com> | 2015-11-14 21:34:43 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2015-11-14 21:34:43 -0500 |
commit | 705d371362c005a4ea699d0b617cdf9d8a336877 (patch) | |
tree | e3769d91c62a84cc10b87cd9898b4ddf1a56ee23 /gtk/gtkshortcutlabel.c | |
parent | fe65c3ac4ce3aa403ee01622f6247874e6eb93ee (diff) | |
download | gtk+-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.c | 94 |
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); } |