diff options
author | Jehan <jehan@girinstud.io> | 2018-09-05 14:51:18 +0200 |
---|---|---|
committer | Jehan <jehan@girinstud.io> | 2018-09-13 13:16:40 +0200 |
commit | 8519368c0eb26ce353e5e1ffd4d23fe8353848dc (patch) | |
tree | 6ea965b9ad9850c435c11a3f26bfcfc34204d6bb | |
parent | d2f412590e088ada916aef18dcf051916b140c6e (diff) | |
download | glib-8519368c0eb26ce353e5e1ffd4d23fe8353848dc.tar.gz |
Fix g_icon_to_string() regression (doc inconsistency).
g_icon_new_for_string() docs states that it should return a single name
when created with a single name. I add a second condition to this case:
the themed icon must not include default fallbacks (i.e. it must not
have been created with `g_themed_icon_new_with_default_fallbacks()`).
Otherwise the return value of `g_icon_new_for_string()` would not
recreate the same icon list when passed to `g_icon_new_for_string()`
(which would be another documentation inconsistency).
g_icon_new_for_string() is now back to old behavior for this specific
case.
I also revert the unit test for this case, and add a new unit test when
using g_themed_icon_new_with_default_fallbacks() with a single name as
well.
Closes #1513.
-rw-r--r-- | gio/gicon.c | 20 | ||||
-rw-r--r-- | gio/tests/g-icon.c | 12 |
2 files changed, 25 insertions, 7 deletions
diff --git a/gio/gicon.c b/gio/gicon.c index 5f943f559..4f73d7568 100644 --- a/gio/gicon.c +++ b/gio/gicon.c @@ -199,8 +199,8 @@ g_icon_to_string_tokenized (GIcon *icon, GString *s) * native, the returned string is the result of g_file_get_uri() * (such as `sftp://path/to/my%20icon.png`). * - * - If @icon is a #GThemedIcon with exactly one name, the encoding is - * simply the name (such as `network-server`). + * - If @icon is a #GThemedIcon with exactly one name and no fallbacks, + * the encoding is simply the name (such as `network-server`). * * Virtual: to_tokens * Returns: (nullable): An allocated NUL-terminated UTF8 string or @@ -237,15 +237,23 @@ g_icon_to_string (GIcon *icon) } else if (G_IS_THEMED_ICON (icon)) { - const char * const *names; - - names = g_themed_icon_get_names (G_THEMED_ICON (icon)); + char **names = NULL; + gboolean use_default_fallbacks = FALSE; + + g_object_get (G_OBJECT (icon), + "names", &names, + "use-default-fallbacks", &use_default_fallbacks, + NULL); + /* Themed icon initialized with a single name and no fallbacks. */ if (names != NULL && names[0] != NULL && names[0][0] != '.' && /* Allowing icons starting with dot would break G_ICON_SERIALIZATION_MAGIC0 */ g_utf8_validate (names[0], -1, NULL) && /* Only return utf8 strings */ - names[1] == NULL) + names[1] == NULL && + ! use_default_fallbacks) ret = g_strdup (names[0]); + + g_strfreev (names); } if (ret == NULL) diff --git a/gio/tests/g-icon.c b/gio/tests/g-icon.c index 7f87e4952..13985d6a1 100644 --- a/gio/tests/g-icon.c +++ b/gio/tests/g-icon.c @@ -119,7 +119,17 @@ test_g_icon_to_string (void) icon = g_themed_icon_new ("network-server"); data = g_icon_to_string (icon); - g_assert_cmpstr (data, ==, ". GThemedIcon network-server network-server-symbolic"); + g_assert_cmpstr (data, ==, "network-server"); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + + icon = g_themed_icon_new_with_default_fallbacks ("network-server"); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, ". GThemedIcon network-server network network-server-symbolic network-symbolic"); icon2 = g_icon_new_for_string (data, &error); g_assert_no_error (error); g_assert (g_icon_equal (icon, icon2)); |