[glib/glib-2-58: 1/2] Fix g_icon_to_string() regression (doc inconsistency).



commit ad26f4c75d996b3c79acc947a348248cbb30ec93
Author: Jehan <jehan girinstud io>
Date:   Wed Sep 5 14:51:18 2018 +0200

    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        | 20 ++++++++++++++------
 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));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]