[glib] Add api to get the generic icon name for a mime type
- From: William Jon McCann <mccann src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Add api to get the generic icon name for a mime type
- Date: Thu, 13 Sep 2012 16:50:53 +0000 (UTC)
commit cc3238a9c9f11740cf78f2e7914c93eb8dc7c0e1
Author: William Jon McCann <jmccann redhat com>
Date: Mon Sep 10 15:16:58 2012 -0400
Add api to get the generic icon name for a mime type
https://bugzilla.gnome.org/show_bug.cgi?id=683744
docs/reference/gio/gio-sections.txt | 1 +
gio/gcontenttype.c | 71 +++++++++++++++++++++++++---------
gio/gcontenttype.h | 3 +
gio/gio.symbols | 1 +
4 files changed, 57 insertions(+), 19 deletions(-)
---
diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt
index ee72a68..04637d0 100644
--- a/docs/reference/gio/gio-sections.txt
+++ b/docs/reference/gio/gio-sections.txt
@@ -1292,6 +1292,7 @@ g_content_type_get_description
g_content_type_get_mime_type
g_content_type_get_icon
g_content_type_get_symbolic_icon
+g_content_type_get_generic_icon_name
g_content_type_can_be_executable
g_content_type_from_mime_type
g_content_type_guess
diff --git a/gio/gcontenttype.c b/gio/gcontenttype.c
index 3ada6f0..2de6957 100644
--- a/gio/gcontenttype.c
+++ b/gio/gcontenttype.c
@@ -399,63 +399,50 @@ g_content_type_get_icon_internal (const gchar *type,
gboolean symbolic)
{
char *mimetype_icon;
- char *generic_mimetype_icon;
+ char *generic_mimetype_icon = NULL;
char *q;
char *xdg_mimetype_icon;
char *legacy_mimetype_icon;
char *xdg_mimetype_generic_icon;
char *icon_names[5];
int n = 0;
- const char *p;
GIcon *themed_icon;
const char *file_template;
- const char *generic_suffix;
g_return_val_if_fail (type != NULL, NULL);
if (symbolic)
{
file_template = "%s-symbolic";
- generic_suffix = "-x-generic-symbolic";
}
else
{
file_template = "%s";
- generic_suffix = "-x-generic";
}
G_LOCK (gio_xdgmime);
xdg_mimetype_icon = g_strdup_printf (file_template, xdg_mime_get_icon (type));
- xdg_mimetype_generic_icon = g_strdup_printf (file_template, xdg_mime_get_generic_icon (type));
G_UNLOCK (gio_xdgmime);
+ xdg_mimetype_generic_icon = g_content_type_get_generic_icon_name (type);
mimetype_icon = g_strdup_printf (file_template, type);
+ if (xdg_mimetype_generic_icon)
+ generic_mimetype_icon = g_strdup_printf (file_template, xdg_mimetype_generic_icon);
while ((q = strchr (mimetype_icon, '/')) != NULL)
*q = '-';
- p = strchr (type, '/');
- if (p == NULL)
- p = type + strlen (type);
-
/* Not all icons have migrated to the new icon theme spec, look for old names too */
legacy_mimetype_icon = g_strconcat ("gnome-mime-", mimetype_icon, NULL);
- generic_mimetype_icon = g_malloc (p - type + strlen (generic_suffix) + 1);
- memcpy (generic_mimetype_icon, type, p - type);
- memcpy (generic_mimetype_icon + (p - type), generic_suffix, strlen (generic_suffix));
- generic_mimetype_icon[(p - type) + strlen (generic_suffix)] = 0;
-
if (xdg_mimetype_icon)
icon_names[n++] = xdg_mimetype_icon;
icon_names[n++] = mimetype_icon;
icon_names[n++] = legacy_mimetype_icon;
- if (xdg_mimetype_generic_icon)
- icon_names[n++] = xdg_mimetype_generic_icon;
-
- icon_names[n++] = generic_mimetype_icon;
+ if (generic_mimetype_icon)
+ icon_names[n++] = generic_mimetype_icon;
themed_icon = g_themed_icon_new_from_names (icon_names, n);
@@ -501,6 +488,52 @@ g_content_type_get_symbolic_icon (const gchar *type)
}
/**
+ * g_content_type_get_generic_icon_name:
+ * @type: a content type string
+ *
+ * Gets the generic icon name for a content type.
+ *
+ * See the <ulink url="http://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec">shared-mime-info</ulink>
+ * specification for more on the generic icon name.
+ *
+ * Returns: (allow-none): the registered generic icon name for the given @type,
+ * or %NULL if unknown. Free with g_free()
+ *
+ * Since: 2.34
+ */
+gchar *
+g_content_type_get_generic_icon_name (const gchar *type)
+{
+ const gchar *xdg_icon_name;
+ gchar *icon_name;
+
+ G_LOCK (gio_xdgmime);
+ xdg_icon_name = xdg_mime_get_generic_icon (type);
+ G_UNLOCK (gio_xdgmime);
+
+ if (!xdg_icon_name)
+ {
+ const char *p;
+ const char *suffix = "-x-generic";
+
+ p = strchr (type, '/');
+ if (p == NULL)
+ p = type + strlen (type);
+
+ icon_name = g_malloc (p - type + strlen (suffix) + 1);
+ memcpy (icon_name, type, p - type);
+ memcpy (icon_name + (p - type), suffix, strlen (suffix));
+ icon_name[(p - type) + strlen (suffix)] = 0;
+ }
+ else
+ {
+ icon_name = g_strdup (xdg_icon_name);
+ }
+
+ return icon_name;
+}
+
+/**
* g_content_type_can_be_executable:
* @type: a content type string
*
diff --git a/gio/gcontenttype.h b/gio/gcontenttype.h
index 5e3d3ce..fb4b861 100644
--- a/gio/gcontenttype.h
+++ b/gio/gcontenttype.h
@@ -40,6 +40,9 @@ gchar * g_content_type_get_description (const gchar *type);
gchar * g_content_type_get_mime_type (const gchar *type);
GIcon * g_content_type_get_icon (const gchar *type);
GIcon * g_content_type_get_symbolic_icon (const gchar *type);
+GLIB_AVAILABLE_IN_2_34
+gchar * g_content_type_get_generic_icon_name (const gchar *type);
+
gboolean g_content_type_can_be_executable (const gchar *type);
gchar * g_content_type_from_mime_type (const gchar *mime_type);
diff --git a/gio/gio.symbols b/gio/gio.symbols
index 9b90a36..536f0d1 100644
--- a/gio/gio.symbols
+++ b/gio/gio.symbols
@@ -162,6 +162,7 @@ g_content_type_get_description
g_content_type_get_mime_type
g_content_type_get_icon
g_content_type_get_symbolic_icon
+g_content_type_get_generic_icon_name
g_content_type_can_be_executable
g_content_type_from_mime_type
g_content_type_guess
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]