Updating branch refs/heads/master to 084d79c43fa7bbb5c284808927a99808d85dc925 (commit) from a8c6cd3340203a7229746116e294bbf3a0dc713b (commit)
commit 084d79c43fa7bbb5c284808927a99808d85dc925 Author: Jérôme Guelfucci <jero...@xfce.org> Date: Sun Dec 30 10:21:29 2012 +0100 Primary and Control now conflict. When we grab a shortcut with the Primary modifier, we also look for conflicts with the Control equivalent as they are the same. That way we can handle shortcuts from old configurations which were grabbed with an older version of GTK+. libxfce4kbd-private/xfce-shortcuts-provider.c | 52 ++++++++++++++++++++++++- 1 files changed, 51 insertions(+), 1 deletions(-) diff --git a/libxfce4kbd-private/xfce-shortcuts-provider.c b/libxfce4kbd-private/xfce-shortcuts-provider.c index 3fbf746..6ee4d7f 100644 --- a/libxfce4kbd-private/xfce-shortcuts-provider.c +++ b/libxfce4kbd-private/xfce-shortcuts-provider.c @@ -575,9 +575,9 @@ gboolean xfce_shortcuts_provider_has_shortcut (XfceShortcutsProvider *provider, const gchar *shortcut) { + gboolean has_property; gchar *base_property; gchar *property; - gboolean has_property; g_return_val_if_fail (XFCE_IS_SHORTCUTS_PROVIDER (provider), FALSE); g_return_val_if_fail (XFCONF_IS_CHANNEL (provider->priv->channel), FALSE); @@ -591,6 +591,56 @@ xfce_shortcuts_provider_has_shortcut (XfceShortcutsProvider *provider, has_property = xfconf_channel_has_property (provider->priv->channel, property); g_free (property); + if (!has_property && g_strrstr (shortcut, "<Primary>")) + { + /* We want to match a shortcut with <Primary>. Older versions of + * GTK+ used <Control> and this might be stored in Xfconf. We need + * to check for this too. */ + + const gchar *primary; + const gchar *p, *s; + GString *replaced; + gchar *with_control_shortcut; + + replaced = g_string_sized_new (strlen (shortcut)); + primary = "Primary"; + + /* Replace Primary in the string by Control using the same logic + * as exo_str_replace. */ + + while (*shortcut != '\0') + { + if (G_UNLIKELY (*shortcut == *primary)) + { + /* compare the pattern to the current string */ + for (p = primary + 1, s = shortcut + 1; *p == *s; ++s, ++p) + if (*p == '\0' || *s == '\0') + break; + + /* check if the pattern fully matched */ + if (G_LIKELY (*p == '\0')) + { + g_string_append (replaced, "Control"); + shortcut = s; + continue; + } + } + + g_string_append_c (replaced, *shortcut++); + } + + with_control_shortcut = g_string_free (replaced, FALSE); + + DBG ("Looking for old GTK+ shortcut %s", with_control_shortcut); + + property = + g_strconcat (base_property, "/", with_control_shortcut, NULL); + has_property = xfconf_channel_has_property (provider->priv->channel, property); + g_free (property); + + g_free (with_control_shortcut); + } + return has_property; } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits