mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-10-03 04:09:20 +02:00
GIcon: pure re-factor of _from_string()
Split out the 'simple string format' cases of URIs, file paths and themed icons to a separate function. This function will be shared by g_icon_deserialize(). https://bugzilla.gnome.org/show_bug.cgi?id=688820
This commit is contained in:
77
gio/gicon.c
77
gio/gicon.c
@@ -381,6 +381,33 @@ ensure_builtin_icon_types (void)
|
|||||||
g_type_ensure (G_TYPE_EMBLEM);
|
g_type_ensure (G_TYPE_EMBLEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* handles the 'simple' cases: GFileIcon and GThemedIcon */
|
||||||
|
static GIcon *
|
||||||
|
g_icon_new_for_string_simple (const gchar *str)
|
||||||
|
{
|
||||||
|
gchar *scheme;
|
||||||
|
GIcon *icon;
|
||||||
|
|
||||||
|
if (str[0] == '.')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* handle special GFileIcon and GThemedIcon cases */
|
||||||
|
scheme = g_uri_parse_scheme (str);
|
||||||
|
if (scheme != NULL || str[0] == '/' || str[0] == G_DIR_SEPARATOR)
|
||||||
|
{
|
||||||
|
GFile *location;
|
||||||
|
location = g_file_new_for_commandline_arg (str);
|
||||||
|
icon = g_file_icon_new (location);
|
||||||
|
g_object_unref (location);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
icon = g_themed_icon_new (str);
|
||||||
|
|
||||||
|
g_free (scheme);
|
||||||
|
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_icon_new_for_string:
|
* g_icon_new_for_string:
|
||||||
* @str: A string obtained via g_icon_to_string().
|
* @str: A string obtained via g_icon_to_string().
|
||||||
@@ -402,48 +429,30 @@ GIcon *
|
|||||||
g_icon_new_for_string (const gchar *str,
|
g_icon_new_for_string (const gchar *str,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
GIcon *icon;
|
GIcon *icon = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (str != NULL, NULL);
|
g_return_val_if_fail (str != NULL, NULL);
|
||||||
|
|
||||||
|
icon = g_icon_new_for_string_simple (str);
|
||||||
|
if (icon)
|
||||||
|
return icon;
|
||||||
|
|
||||||
ensure_builtin_icon_types ();
|
ensure_builtin_icon_types ();
|
||||||
|
|
||||||
icon = NULL;
|
if (g_str_has_prefix (str, G_ICON_SERIALIZATION_MAGIC0))
|
||||||
|
|
||||||
if (*str == '.')
|
|
||||||
{
|
{
|
||||||
if (g_str_has_prefix (str, G_ICON_SERIALIZATION_MAGIC0))
|
gchar **tokens;
|
||||||
{
|
|
||||||
gchar **tokens;
|
/* handle tokenized encoding */
|
||||||
|
tokens = g_strsplit (str + sizeof (G_ICON_SERIALIZATION_MAGIC0) - 1, " ", 0);
|
||||||
/* handle tokenized encoding */
|
icon = g_icon_new_from_tokens (tokens, error);
|
||||||
tokens = g_strsplit (str + sizeof (G_ICON_SERIALIZATION_MAGIC0) - 1, " ", 0);
|
g_strfreev (tokens);
|
||||||
icon = g_icon_new_from_tokens (tokens, error);
|
|
||||||
g_strfreev (tokens);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
g_set_error_literal (error,
|
|
||||||
G_IO_ERROR,
|
|
||||||
G_IO_ERROR_INVALID_ARGUMENT,
|
|
||||||
_("Can't handle the supplied version of the icon encoding"));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
g_set_error_literal (error,
|
||||||
gchar *scheme;
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_INVALID_ARGUMENT,
|
||||||
/* handle special GFileIcon and GThemedIcon cases */
|
_("Can't handle the supplied version of the icon encoding"));
|
||||||
scheme = g_uri_parse_scheme (str);
|
|
||||||
if (scheme != NULL || str[0] == '/' || str[0] == G_DIR_SEPARATOR)
|
|
||||||
{
|
|
||||||
GFile *location;
|
|
||||||
location = g_file_new_for_commandline_arg (str);
|
|
||||||
icon = g_file_icon_new (location);
|
|
||||||
g_object_unref (location);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
icon = g_themed_icon_new (str);
|
|
||||||
g_free (scheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user