From ad26f4c75d996b3c79acc947a348248cbb30ec93 Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 5 Sep 2018 14:51:18 +0200 Subject: [PATCH] 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. --- gio/gicon.c | 18 +++++++++++++----- gio/tests/g-icon.c | 12 +++++++++++- 2 files changed, 24 insertions(+), 6 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; + char **names = NULL; + gboolean use_default_fallbacks = FALSE; - names = g_themed_icon_get_names (G_THEMED_ICON (icon)); + 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));