[gnome-menus/wip/gobject-review] libmenu: Make gmenu_tree_directory_get_icon() return a GIcon
- From: Vincent Untz <vuntz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-menus/wip/gobject-review] libmenu: Make gmenu_tree_directory_get_icon() return a GIcon
- Date: Thu, 21 Jul 2011 13:57:49 +0000 (UTC)
commit bd6009634740dd5500d53e76e90529791e426d29
Author: Vincent Untz <vuntz gnome org>
Date: Thu Jul 21 15:48:35 2011 +0200
libmenu: Make gmenu_tree_directory_get_icon() return a GIcon
It's much better to use GIcon than icon name strings.
libmenu/desktop-entries.c | 50 ++++++++++++++++++++++++++++++++++++++------
libmenu/desktop-entries.h | 4 +--
libmenu/gmenu-tree.c | 10 ++++++++-
libmenu/gmenu-tree.h | 2 +-
4 files changed, 54 insertions(+), 12 deletions(-)
---
diff --git a/libmenu/desktop-entries.c b/libmenu/desktop-entries.c
index a441f65..eaf7f53 100644
--- a/libmenu/desktop-entries.c
+++ b/libmenu/desktop-entries.c
@@ -54,7 +54,7 @@ typedef struct
char *name;
char *generic_name;
char *comment;
- char *icon;
+ GIcon *icon;
guint nodisplay : 1;
guint hidden : 1;
@@ -87,6 +87,41 @@ unix_basename_from_path (const char *path)
return path;
}
+static GIcon *
+key_file_get_icon (GKeyFile *key_file)
+{
+ GIcon *icon = NULL;
+ gchar *icon_name;
+
+ icon_name = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY_GROUP,
+ "Icon", NULL, NULL);
+ if (!icon_name)
+ return NULL;
+
+ if (g_path_is_absolute (icon_name)) {
+ GFile *file;
+
+ file = g_file_new_for_path (icon_name);
+ icon = g_file_icon_new (file);
+ g_object_unref (file);
+ } else {
+ char *p;
+
+ /* Work around a common mistake in desktop files */
+ if ((p = strrchr (icon_name, '.')) != NULL &&
+ (strcmp (p, ".png") == 0 ||
+ strcmp (p, ".xpm") == 0 ||
+ strcmp (p, ".svg") == 0))
+ *p = 0;
+
+ icon = g_themed_icon_new (icon_name);
+ }
+
+ g_free (icon_name);
+
+ return icon;
+}
+
static gboolean
key_file_get_show_in_gnome (GKeyFile *key_file)
{
@@ -165,7 +200,7 @@ desktop_entry_load_directory (DesktopEntry *entry,
entry_directory->generic_name = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY_GROUP, "GenericName", NULL, NULL);
entry_directory->comment = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY_GROUP, "Comment", NULL, NULL);
- entry_directory->icon = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY_GROUP, "Icon", NULL, NULL);
+ entry_directory->icon = key_file_get_icon (key_file);
entry_directory->nodisplay = g_key_file_get_boolean (key_file,
DESKTOP_ENTRY_GROUP,
"NoDisplay",
@@ -315,7 +350,7 @@ desktop_entry_reload (DesktopEntry *entry)
g_free (entry_directory->comment);
entry_directory->comment = NULL;
- g_free (entry_directory->icon);
+ g_object_unref (entry_directory->icon);
entry_directory->icon = NULL;
}
else
@@ -390,7 +425,7 @@ desktop_entry_copy (DesktopEntry *entry)
retval_directory->name = g_strdup (entry_directory->name);
retval_directory->comment = g_strdup (entry_directory->comment);
- retval_directory->icon = g_strdup (entry_directory->icon);
+ retval_directory->icon = g_object_ref (entry_directory->icon);
retval_directory->nodisplay = entry_directory->nodisplay;
retval_directory->hidden = entry_directory->hidden;
retval_directory->showin = entry_directory->showin;
@@ -429,7 +464,7 @@ desktop_entry_unref (DesktopEntry *entry)
g_free (entry_directory->comment);
entry_directory->comment = NULL;
- g_free (entry_directory->icon);
+ g_object_unref (entry_directory->icon);
entry_directory->icon = NULL;
}
else
@@ -480,10 +515,11 @@ desktop_entry_get_comment (DesktopEntry *entry)
return ((DesktopEntryDirectory*)entry)->comment;
}
-const char *
+GIcon *
desktop_entry_get_icon (DesktopEntry *entry)
{
- g_return_val_if_fail (entry->type == DESKTOP_ENTRY_DIRECTORY, NULL);
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ return g_app_info_get_icon (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo));
return ((DesktopEntryDirectory*)entry)->icon;
}
diff --git a/libmenu/desktop-entries.h b/libmenu/desktop-entries.h
index 5ef9b63..07b7c85 100644
--- a/libmenu/desktop-entries.h
+++ b/libmenu/desktop-entries.h
@@ -46,13 +46,11 @@ const char *desktop_entry_get_basename (DesktopEntry *entry);
const char *desktop_entry_get_name (DesktopEntry *entry);
const char *desktop_entry_get_generic_name (DesktopEntry *entry);
const char *desktop_entry_get_comment (DesktopEntry *entry);
+GIcon *desktop_entry_get_icon (DesktopEntry *entry);
gboolean desktop_entry_get_hidden (DesktopEntry *entry);
gboolean desktop_entry_get_no_display (DesktopEntry *entry);
gboolean desktop_entry_get_show_in (DesktopEntry *entry);
-/* Only valid for DESKTOP_ENTRY_DIRECTORY */
-const char *desktop_entry_get_icon (DesktopEntry *entry);
-
/* Only valid for DESKTOP_ENTRY_DESKTOP */
GDesktopAppInfo *desktop_entry_get_app_info (DesktopEntry *entry);
gboolean desktop_entry_has_categories (DesktopEntry *entry);
diff --git a/libmenu/gmenu-tree.c b/libmenu/gmenu-tree.c
index a7f9cdb..1464aa3 100644
--- a/libmenu/gmenu-tree.c
+++ b/libmenu/gmenu-tree.c
@@ -959,7 +959,15 @@ gmenu_tree_directory_get_comment (GMenuTreeDirectory *directory)
return desktop_entry_get_comment (directory->directory_entry);
}
-const char *
+/**
+ * gmenu_tree_directory_get_icon:
+ * @directory: a #GMenuTreeDirectory
+ *
+ * Gets the icon for the directory.
+ *
+ * Returns: (transfer none): The #GIcon for this directory
+ */
+GIcon *
gmenu_tree_directory_get_icon (GMenuTreeDirectory *directory)
{
g_return_val_if_fail (directory != NULL, NULL);
diff --git a/libmenu/gmenu-tree.h b/libmenu/gmenu-tree.h
index 7fd740b..7ab872f 100644
--- a/libmenu/gmenu-tree.h
+++ b/libmenu/gmenu-tree.h
@@ -101,7 +101,7 @@ GMenuTreeDirectory *gmenu_tree_directory_get_parent (GMenuTreeDirectory *dire
const char *gmenu_tree_directory_get_name (GMenuTreeDirectory *directory);
const char *gmenu_tree_directory_get_generic_name (GMenuTreeDirectory *directory);
const char *gmenu_tree_directory_get_comment (GMenuTreeDirectory *directory);
-const char *gmenu_tree_directory_get_icon (GMenuTreeDirectory *directory);
+GIcon *gmenu_tree_directory_get_icon (GMenuTreeDirectory *directory);
const char *gmenu_tree_directory_get_desktop_file_path (GMenuTreeDirectory *directory);
const char *gmenu_tree_directory_get_menu_id (GMenuTreeDirectory *directory);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]