summaryrefslogtreecommitdiff
path: root/libmenu/desktop-entries.c
diff options
context:
space:
mode:
authoryetist <[email protected]>2018-05-02 22:46:52 +0800
committerraveit65 <[email protected]>2018-05-27 13:44:45 +0200
commit524d3e4fc324c2cbc2454e8b1fcddc6622dc4714 (patch)
treefa5f5de98d02e6b28b5b12c2267ec2f58ce67c34 /libmenu/desktop-entries.c
parentb642c7cdb1ff1ff418c62f0169e568a87f4cc4e5 (diff)
downloadmate-menus-524d3e4fc324c2cbc2454e8b1fcddc6622dc4714.tar.bz2
mate-menus-524d3e4fc324c2cbc2454e8b1fcddc6622dc4714.tar.xz
backport from gnome-menus
Diffstat (limited to 'libmenu/desktop-entries.c')
-rw-r--r--libmenu/desktop-entries.c691
1 files changed, 380 insertions, 311 deletions
diff --git a/libmenu/desktop-entries.c b/libmenu/desktop-entries.c
index c9fcc0f..4793bdd 100644
--- a/libmenu/desktop-entries.c
+++ b/libmenu/desktop-entries.c
@@ -20,39 +20,49 @@
#include <config.h>
#include "desktop-entries.h"
+#include <gio/gdesktopappinfo.h>
#include <string.h>
#include "menu-util.h"
#define DESKTOP_ENTRY_GROUP "Desktop Entry"
-#define KDE_DESKTOP_ENTRY_GROUP "KDE Desktop Entry"
-enum {
- DESKTOP_ENTRY_NO_DISPLAY = 1 << 0,
- DESKTOP_ENTRY_HIDDEN = 1 << 1,
- DESKTOP_ENTRY_SHOW_IN_MATE = 1 << 2,
- DESKTOP_ENTRY_TRYEXEC_FAILED = 1 << 3
+struct DesktopEntry
+{
+ guint refcount;
+
+ char *path;
+ const char *basename;
+
+ guint type : 2;
+ guint reserved : 30;
};
-struct DesktopEntry {
- char* path;
- char* basename;
+typedef struct
+{
+ DesktopEntry base;
+
+ GDesktopAppInfo *appinfo;
+ GQuark *categories;
+} DesktopEntryDesktop;
- GQuark* categories;
+typedef struct
+{
+ DesktopEntry base;
- char* name;
- char* generic_name;
+ char *name;
+ char *generic_name;
+ char *comment;
+ GIcon *icon;
char* full_name;
- char* comment;
- char* icon;
char* exec;
- gboolean terminal;
- guint type: 2;
- guint flags: 4;
- guint refcount: 24;
-};
+ guint nodisplay : 1;
+ guint hidden : 1;
+ guint showin : 1;
+ guint terminal:1;
+} DesktopEntryDirectory;
struct DesktopEntrySet {
int refcount;
@@ -63,54 +73,110 @@ struct DesktopEntrySet {
* Desktop entries
*/
-static guint get_flags_from_key_file(DesktopEntry* entry, GKeyFile* key_file, const char* desktop_entry_group)
-{
- GError *error;
- char **strv;
- gboolean no_display;
- gboolean hidden;
- gboolean show_in_mate;
- gboolean tryexec_failed;
- char *tryexec;
- guint flags;
- int i;
-
- error = NULL;
- no_display = g_key_file_get_boolean (key_file,
- desktop_entry_group,
- "NoDisplay",
- &error);
- if (error)
- {
- no_display = FALSE;
- g_error_free (error);
- }
+/**
+ * unix_basename_from_path:
+ * @path: Path string
+ *
+ * Returns: A constant pointer into the basename of @path
+ */
+static const char *
+unix_basename_from_path (const char *path)
+{
+ const char *basename = g_strrstr (path, "/");
+ if (basename)
+ return basename + 1;
+ else
+ return path;
+}
+
+static const char *
+get_current_desktop (void)
+{
+ static char *current_desktop = NULL;
- error = NULL;
- hidden = g_key_file_get_boolean (key_file,
- desktop_entry_group,
- "Hidden",
- &error);
- if (error)
+ /* Support XDG_CURRENT_DESKTOP environment variable; this can be used
+ * to abuse mate-menus in non-MATE desktops. */
+ if (!current_desktop)
{
- hidden = FALSE;
- g_error_free (error);
+ const char *desktop;
+
+ desktop = g_getenv ("XDG_CURRENT_DESKTOP");
+
+ /* Note: if XDG_CURRENT_DESKTOP is set but empty, do as if it
+ * was not set */
+ if (!desktop || desktop[0] == '\0')
+ current_desktop = g_strdup ("MATE");
+ else
+ current_desktop = g_strdup (desktop);
}
- show_in_mate = TRUE;
+ /* Using "*" means skipping desktop-related checks */
+ if (g_strcmp0 (current_desktop, "*") == 0)
+ return NULL;
+
+ return current_desktop;
+}
+
+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 (GKeyFile *key_file)
+{
+ const gchar *current_desktop;
+ gchar **strv;
+ gboolean show_in = TRUE;
+ int i;
+
+ current_desktop = get_current_desktop ();
+ if (!current_desktop)
+ return TRUE;
+
strv = g_key_file_get_string_list (key_file,
- desktop_entry_group,
+ DESKTOP_ENTRY_GROUP,
"OnlyShowIn",
NULL,
NULL);
if (strv)
{
- show_in_mate = FALSE;
+ show_in = FALSE;
for (i = 0; strv[i]; i++)
{
- if (!strcmp (strv[i], "MATE"))
+ if (!strcmp (strv[i], current_desktop))
{
- show_in_mate = TRUE;
+ show_in = TRUE;
break;
}
}
@@ -118,198 +184,141 @@ static guint get_flags_from_key_file(DesktopEntry* entry, GKeyFile* key_file, co
else
{
strv = g_key_file_get_string_list (key_file,
- desktop_entry_group,
+ DESKTOP_ENTRY_GROUP,
"NotShowIn",
NULL,
NULL);
if (strv)
{
- show_in_mate = TRUE;
+ show_in = TRUE;
for (i = 0; strv[i]; i++)
{
- if (!strcmp (strv[i], "MATE"))
+ if (!strcmp (strv[i], current_desktop))
{
- show_in_mate = FALSE;
+ show_in = FALSE;
}
}
}
}
g_strfreev (strv);
- tryexec_failed = FALSE;
- tryexec = g_key_file_get_string (key_file,
- desktop_entry_group,
- "TryExec",
- NULL);
- if (tryexec)
- {
- char *path;
-
- path = g_find_program_in_path (g_strstrip (tryexec));
-
- tryexec_failed = (path == NULL);
-
- g_free (path);
- g_free (tryexec);
- }
-
- flags = 0;
- if (no_display)
- flags |= DESKTOP_ENTRY_NO_DISPLAY;
- if (hidden)
- flags |= DESKTOP_ENTRY_HIDDEN;
- if (show_in_mate)
- flags |= DESKTOP_ENTRY_SHOW_IN_MATE;
- if (tryexec_failed)
- flags |= DESKTOP_ENTRY_TRYEXEC_FAILED;
-
- return flags;
+ return show_in;
}
-static GQuark* get_categories_from_key_file (DesktopEntry* entry, GKeyFile* key_file, const char* desktop_entry_group)
+static gboolean
+desktop_entry_load_directory (DesktopEntry *entry,
+ GKeyFile *key_file,
+ GError **error)
{
- GQuark *retval;
- char **strv;
- gsize len;
- int i;
+ DesktopEntryDirectory *entry_directory = (DesktopEntryDirectory*)entry;
+ char *type_str;
- strv = g_key_file_get_string_list (key_file,
- desktop_entry_group,
- "Categories",
- &len,
- NULL);
- if (!strv)
- return NULL;
+ type_str = g_key_file_get_string (key_file, DESKTOP_ENTRY_GROUP, "Type", error);
+ if (!type_str)
+ return FALSE;
- retval = g_new0 (GQuark, len + 1);
+ if (strcmp (type_str, "Directory") != 0)
+ {
+ g_set_error (error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ "\"%s\" does not contain the correct \"Type\" value\n", entry->path);
+ g_free (type_str);
+ return FALSE;
+ }
- for (i = 0; strv[i]; i++)
- retval[i] = g_quark_from_string (strv[i]);
+ g_free (type_str);
- g_strfreev (strv);
+ entry_directory->name = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY_GROUP, "Name", NULL, error);
+ if (entry_directory->name == NULL)
+ return FALSE;
- return retval;
+ 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 = key_file_get_icon (key_file);
+ entry_directory->nodisplay = g_key_file_get_boolean (key_file,
+ DESKTOP_ENTRY_GROUP,
+ "NoDisplay",
+ NULL);
+ entry_directory->hidden = g_key_file_get_boolean (key_file,
+ DESKTOP_ENTRY_GROUP,
+ "Hidden",
+ NULL);
+ entry_directory->showin = key_file_get_show_in (key_file);
+
+ return TRUE;
}
-static DesktopEntry* desktop_entry_load(DesktopEntry* entry)
+static gboolean
+desktop_entry_load (DesktopEntry *entry)
{
- DesktopEntry *retval = NULL;
- GKeyFile *key_file;
- GError *error;
- const char *desktop_entry_group;
- char *name_str;
- char *type_str;
-
- key_file = g_key_file_new ();
-
- error = NULL;
- if (!g_key_file_load_from_file (key_file, entry->path, 0, &error))
- {
- menu_verbose ("Failed to load \"%s\": %s\n",
- entry->path, error->message);
- g_error_free (error);
- goto out;
- }
-
- if (g_key_file_has_group (key_file, DESKTOP_ENTRY_GROUP))
- {
- desktop_entry_group = DESKTOP_ENTRY_GROUP;
- }
- else
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
{
- menu_verbose ("\"%s\" contains no \"" DESKTOP_ENTRY_GROUP "\" group\n",
- entry->path);
+ DesktopEntryDesktop *entry_desktop = (DesktopEntryDesktop*)entry;
+ const char *categories_str;
- if (g_key_file_has_group (key_file, KDE_DESKTOP_ENTRY_GROUP))
- {
- desktop_entry_group = KDE_DESKTOP_ENTRY_GROUP;
- menu_verbose ("\"%s\" contains deprecated \"" KDE_DESKTOP_ENTRY_GROUP "\" group\n",
- entry->path);
- }
- else
+ entry_desktop->appinfo = g_desktop_app_info_new_from_filename (entry->path);
+ if (!entry_desktop->appinfo ||
+ !g_app_info_get_name (G_APP_INFO (entry_desktop->appinfo)) ||
+ !g_app_info_get_executable (G_APP_INFO (entry_desktop->appinfo)))
{
- goto out;
+ menu_verbose ("Failed to load \"%s\"\n", entry->path);
+ return FALSE;
}
- }
- if (!g_key_file_has_key (key_file, desktop_entry_group, "Name", NULL))
- {
- menu_verbose ("\"%s\" contains no \"Name\" key\n", entry->path);
- goto out;
- }
+ categories_str = g_desktop_app_info_get_categories (entry_desktop->appinfo);
+ if (categories_str)
+ {
+ char **categories;
+ int i;
- name_str = g_key_file_get_locale_string (key_file, desktop_entry_group, "Name", NULL, NULL);
- if (!name_str)
- {
- menu_verbose ("\"%s\" contains an invalid \"Name\" key\n", entry->path);
- goto out;
- }
+ categories = g_strsplit (categories_str, ";", -1);
+ entry_desktop->categories = g_new0 (GQuark, g_strv_length (categories) + 1);
- g_free (name_str);
+ for (i = 0; categories[i]; i++)
+ entry_desktop->categories[i] = g_quark_from_string (categories[i]);
- type_str = g_key_file_get_string (key_file, desktop_entry_group, "Type", NULL);
- if (!type_str)
- {
- menu_verbose ("\"%s\" contains no \"Type\" key\n", entry->path);
- goto out;
- }
+ g_strfreev (categories);
+ }
- if ((entry->type == DESKTOP_ENTRY_DESKTOP && strcmp (type_str, "Application") != 0) ||
- (entry->type == DESKTOP_ENTRY_DIRECTORY && strcmp (type_str, "Directory") != 0))
- {
- menu_verbose ("\"%s\" does not contain the correct \"Type\" value\n", entry->path);
- g_free (type_str);
- goto out;
+ return TRUE;
}
-
- g_free (type_str);
-
- if (entry->type == DESKTOP_ENTRY_DESKTOP &&
- !g_key_file_has_key (key_file, desktop_entry_group, "Exec", NULL))
+ else if (entry->type == DESKTOP_ENTRY_DIRECTORY)
{
- menu_verbose ("\"%s\" does not contain an \"Exec\" key\n", entry->path);
- goto out;
- }
-
- retval = entry;
+ GKeyFile *key_file = NULL;
+ GError *error = NULL;
+ gboolean retval = FALSE;
-#define GET_LOCALE_STRING(n) g_key_file_get_locale_string (key_file, desktop_entry_group, (n), NULL, NULL)
+ key_file = g_key_file_new ();
- retval->name = GET_LOCALE_STRING ("Name");
- retval->generic_name = GET_LOCALE_STRING ("GenericName");
- retval->full_name = GET_LOCALE_STRING ("X-MATE-FullName");
- retval->comment = GET_LOCALE_STRING ("Comment");
- retval->icon = GET_LOCALE_STRING ("Icon");
- retval->flags = get_flags_from_key_file (retval, key_file, desktop_entry_group);
- retval->categories = get_categories_from_key_file (retval, key_file, desktop_entry_group);
+ if (!g_key_file_load_from_file (key_file, entry->path, 0, &error))
+ goto out;
- if (entry->type == DESKTOP_ENTRY_DESKTOP)
- {
- retval->exec = g_key_file_get_string (key_file, desktop_entry_group, "Exec", NULL);
- retval->terminal = g_key_file_get_boolean (key_file, desktop_entry_group, "Terminal", NULL);
- }
+ if (!desktop_entry_load_directory (entry, key_file, &error))
+ goto out;
-#undef GET_LOCALE_STRING
+ retval = TRUE;
- menu_verbose ("Desktop entry \"%s\" (%s, %s, %s, %s, %s) flags: NoDisplay=%s, Hidden=%s, ShowInMATE=%s, TryExecFailed=%s\n",
- retval->basename,
- retval->name,
- retval->generic_name ? retval->generic_name : "(null)",
- retval->full_name ? retval->full_name : "(null)",
- retval->comment ? retval->comment : "(null)",
- retval->icon ? retval->icon : "(null)",
- retval->flags & DESKTOP_ENTRY_NO_DISPLAY ? "(true)" : "(false)",
- retval->flags & DESKTOP_ENTRY_HIDDEN ? "(true)" : "(false)",
- retval->flags & DESKTOP_ENTRY_SHOW_IN_MATE ? "(true)" : "(false)",
- retval->flags & DESKTOP_ENTRY_TRYEXEC_FAILED ? "(true)" : "(false)");
+ out:
+ g_key_file_free (key_file);
- out:
- g_key_file_free (key_file);
+ if (!retval)
+ {
+ if (error)
+ {
+ menu_verbose ("Failed to load \"%s\": %s\n", entry->path, error->message);
+ g_error_free (error);
+ }
+ else
+ menu_verbose ("Failed to load \"%s\"\n", entry->path);
+ }
- if (!retval)
- desktop_entry_unref (entry);
+ return retval;
+ }
+ else
+ g_assert_not_reached ();
- return retval;
+ return FALSE;
}
DesktopEntry* desktop_entry_new(const char* path)
@@ -322,10 +331,12 @@ DesktopEntry* desktop_entry_new(const char* path)
if (g_str_has_suffix (path, ".desktop"))
{
type = DESKTOP_ENTRY_DESKTOP;
+ retval = (DesktopEntry*)g_new0 (DesktopEntryDesktop, 1);
}
else if (g_str_has_suffix (path, ".directory"))
{
type = DESKTOP_ENTRY_DIRECTORY;
+ retval = (DesktopEntry*)g_new0 (DesktopEntryDirectory, 1);
}
else
{
@@ -334,14 +345,18 @@ DesktopEntry* desktop_entry_new(const char* path)
return NULL;
}
- retval = g_new0 (DesktopEntry, 1);
-
retval->refcount = 1;
retval->type = type;
- retval->basename = g_path_get_basename (path);
retval->path = g_strdup (path);
+ retval->basename = unix_basename_from_path (retval->path);
+
+ if (!desktop_entry_load (retval))
+ {
+ desktop_entry_unref (retval);
+ return NULL;
+ }
- return desktop_entry_load (retval);
+ return retval;
}
DesktopEntry* desktop_entry_reload(DesktopEntry* entry)
@@ -350,31 +365,39 @@ DesktopEntry* desktop_entry_reload(DesktopEntry* entry)
menu_verbose ("Re-loading desktop entry \"%s\"\n", entry->path);
- g_free (entry->categories);
- entry->categories = NULL;
-
- g_free (entry->name);
- entry->name = NULL;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ {
+ DesktopEntryDesktop *entry_desktop = (DesktopEntryDesktop *) entry;
- g_free (entry->generic_name);
- entry->generic_name = NULL;
+ g_object_unref (entry_desktop->appinfo);
+ entry_desktop->appinfo = NULL;
- g_free (entry->full_name);
- entry->full_name = NULL;
+ g_free (entry_desktop->categories);
+ entry_desktop->categories = NULL;
+ }
+ else if (entry->type == DESKTOP_ENTRY_DIRECTORY)
+ {
+ DesktopEntryDirectory *entry_directory = (DesktopEntryDirectory*) entry;
- g_free (entry->comment);
- entry->comment = NULL;
+ g_free (entry_directory->name);
+ entry_directory->name = NULL;
- g_free (entry->icon);
- entry->icon = NULL;
+ g_free (entry_directory->comment);
+ entry_directory->comment = NULL;
- g_free (entry->exec);
- entry->exec = NULL;
+ g_object_unref (entry_directory->icon);
+ entry_directory->icon = NULL;
+ }
+ else
+ g_assert_not_reached ();
- entry->terminal = 0;
- entry->flags = 0;
+ if (!desktop_entry_load (entry))
+ {
+ desktop_entry_unref (entry);
+ return NULL;
+ }
- return desktop_entry_load (entry);
+ return entry;
}
DesktopEntry* desktop_entry_ref(DesktopEntry* entry)
@@ -390,39 +413,55 @@ DesktopEntry* desktop_entry_ref(DesktopEntry* entry)
DesktopEntry* desktop_entry_copy(DesktopEntry* entry)
{
DesktopEntry *retval;
- int i;
menu_verbose ("Copying desktop entry \"%s\"\n",
entry->basename);
- retval = g_new0 (DesktopEntry, 1);
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ retval = (DesktopEntry*)g_new0 (DesktopEntryDesktop, 1);
+ else if (entry->type == DESKTOP_ENTRY_DIRECTORY)
+ retval = (DesktopEntry*)g_new0 (DesktopEntryDirectory, 1);
+ else
+ g_assert_not_reached ();
retval->refcount = 1;
retval->type = entry->type;
- retval->basename = g_strdup (entry->basename);
retval->path = g_strdup (entry->path);
- retval->name = g_strdup (entry->name);
- retval->generic_name = g_strdup (entry->generic_name);
- retval->full_name = g_strdup (entry->full_name);
- retval->comment = g_strdup (entry->comment);
- retval->icon = g_strdup (entry->icon);
- retval->exec = g_strdup (entry->exec);
- retval->terminal = entry->terminal;
- retval->flags = entry->flags;
-
- i = 0;
- if (entry->categories != NULL)
+ retval->basename = unix_basename_from_path (retval->path);
+
+ if (retval->type == DESKTOP_ENTRY_DESKTOP)
{
- for (; entry->categories[i]; i++);
- }
+ DesktopEntryDesktop *desktop_entry = (DesktopEntryDesktop*) entry;
+ DesktopEntryDesktop *retval_desktop_entry = (DesktopEntryDesktop*) retval;
+ int i;
+
+ retval_desktop_entry->appinfo = g_object_ref (desktop_entry->appinfo);
+
+ if (desktop_entry->categories != NULL)
+ {
+ i = 0;
+ for (; desktop_entry->categories[i]; i++);
- retval->categories = g_new0 (GQuark, i + 1);
+ retval_desktop_entry->categories = g_new0 (GQuark, i + 1);
- i = 0;
- if (entry->categories != NULL)
+ i = 0;
+ for (; desktop_entry->categories[i]; i++)
+ retval_desktop_entry->categories[i] = desktop_entry->categories[i];
+ }
+ else
+ retval_desktop_entry->categories = NULL;
+ }
+ else if (entry->type == DESKTOP_ENTRY_DIRECTORY)
{
- for (; entry->categories[i]; i++)
- retval->categories[i] = entry->categories[i];
+ DesktopEntryDirectory *entry_directory = (DesktopEntryDirectory*)entry;
+ DesktopEntryDirectory *retval_directory = (DesktopEntryDirectory*)retval;
+
+ retval_directory->name = g_strdup (entry_directory->name);
+ retval_directory->comment = g_strdup (entry_directory->comment);
+ 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;
}
return retval;
@@ -434,37 +473,39 @@ void desktop_entry_unref(DesktopEntry* entry)
g_return_if_fail (entry->refcount > 0);
entry->refcount -= 1;
- if (entry->refcount == 0)
- {
- g_free (entry->categories);
- entry->categories = NULL;
+ if (entry->refcount != 0)
+ return;
- g_free (entry->name);
- entry->name = NULL;
+ g_free (entry->path);
+ entry->path = NULL;
- g_free (entry->generic_name);
- entry->generic_name = NULL;
-
- g_free (entry->full_name);
- entry->full_name = NULL;
-
- g_free (entry->comment);
- entry->comment = NULL;
-
- g_free (entry->icon);
- entry->icon = NULL;
-
- g_free (entry->exec);
- entry->exec = NULL;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ {
+ DesktopEntryDesktop *desktop_entry = (DesktopEntryDesktop*) entry;
+ g_free (desktop_entry->categories);
+ if (desktop_entry->appinfo)
+ g_object_unref (desktop_entry->appinfo);
+ }
+ else if (entry->type == DESKTOP_ENTRY_DIRECTORY)
+ {
+ DesktopEntryDirectory *entry_directory = (DesktopEntryDirectory*) entry;
- g_free (entry->basename);
- entry->basename = NULL;
+ g_free (entry_directory->name);
+ entry_directory->name = NULL;
- g_free (entry->path);
- entry->path = NULL;
+ g_free (entry_directory->comment);
+ entry_directory->comment = NULL;
- g_free (entry);
+ if (entry_directory->icon != NULL)
+ {
+ g_object_unref (entry_directory->icon);
+ entry_directory->icon = NULL;
+ }
}
+ else
+ g_assert_not_reached ();
+
+ g_free (entry);
}
DesktopEntryType desktop_entry_get_type(DesktopEntry* entry)
@@ -485,78 +526,99 @@ desktop_entry_get_basename (DesktopEntry *entry)
const char* desktop_entry_get_name(DesktopEntry* entry)
{
- return entry->name;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ return g_app_info_get_name (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo));
+ return ((DesktopEntryDirectory*)entry)->name;
}
const char* desktop_entry_get_generic_name(DesktopEntry* entry)
{
- return entry->generic_name;
-}
-
-const char* desktop_entry_get_full_name(DesktopEntry* entry)
-{
- return entry->full_name;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ return g_desktop_app_info_get_generic_name (((DesktopEntryDesktop*)entry)->appinfo);
+ return ((DesktopEntryDirectory*)entry)->generic_name;
}
const char* desktop_entry_get_comment(DesktopEntry* entry)
{
- return entry->comment;
-}
-
-const char* desktop_entry_get_icon(DesktopEntry* entry)
-{
- return entry->icon;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ return g_app_info_get_description (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo));
+ return ((DesktopEntryDirectory*)entry)->comment;
}
-const char* desktop_entry_get_exec(DesktopEntry* entry)
+GIcon *
+desktop_entry_get_icon (DesktopEntry *entry)
{
- return entry->exec;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ return g_app_info_get_icon (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo));
+ return ((DesktopEntryDirectory*)entry)->icon;
}
-gboolean desktop_entry_get_launch_in_terminal(DesktopEntry* entry)
+gboolean desktop_entry_get_no_display (DesktopEntry *entry)
{
- return entry->terminal;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ return g_desktop_app_info_get_nodisplay (((DesktopEntryDesktop*)entry)->appinfo);
+ return ((DesktopEntryDirectory*)entry)->nodisplay;
}
gboolean desktop_entry_get_hidden(DesktopEntry* entry)
{
- return (entry->flags & DESKTOP_ENTRY_HIDDEN) != 0;
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ return g_desktop_app_info_get_is_hidden (((DesktopEntryDesktop*)entry)->appinfo);
+ return ((DesktopEntryDirectory*)entry)->hidden;
}
-gboolean desktop_entry_get_no_display(DesktopEntry* entry)
+gboolean
+desktop_entry_get_show_in (DesktopEntry *entry)
{
- return (entry->flags & DESKTOP_ENTRY_NO_DISPLAY) != 0;
-}
+ if (entry->type == DESKTOP_ENTRY_DESKTOP)
+ {
+ const char *current_desktop = get_current_desktop ();
-gboolean desktop_entry_get_show_in_mate(DesktopEntry* entry)
-{
- return (entry->flags & DESKTOP_ENTRY_SHOW_IN_MATE) != 0;
+ if (current_desktop == NULL)
+ return TRUE;
+ else
+ return g_desktop_app_info_get_show_in (((DesktopEntryDesktop*)entry)->appinfo, current_desktop);
+ }
+ return ((DesktopEntryDirectory*)entry)->showin;
}
-gboolean desktop_entry_get_tryexec_failed(DesktopEntry* entry)
+GDesktopAppInfo *
+desktop_entry_get_app_info (DesktopEntry *entry)
{
- return (entry->flags & DESKTOP_ENTRY_TRYEXEC_FAILED) != 0;
+ g_return_val_if_fail (entry->type == DESKTOP_ENTRY_DESKTOP, NULL);
+ return ((DesktopEntryDesktop*)entry)->appinfo;
}
gboolean desktop_entry_has_categories(DesktopEntry* entry)
{
- return (entry->categories != NULL && entry->categories[0] != 0);
+ DesktopEntryDesktop *desktop_entry;
+ if (entry->type != DESKTOP_ENTRY_DESKTOP)
+ return FALSE;
+
+ desktop_entry = (DesktopEntryDesktop*) entry;
+ return (desktop_entry->categories != NULL && desktop_entry->categories[0] != 0);
}
gboolean desktop_entry_has_category(DesktopEntry* entry, const char* category)
{
GQuark quark;
int i;
+ DesktopEntryDesktop *desktop_entry;
+
+ if (entry->type != DESKTOP_ENTRY_DESKTOP)
+ return FALSE;
+
+ desktop_entry = (DesktopEntryDesktop*) entry;
- if (entry->categories == NULL)
+ if (desktop_entry->categories == NULL)
return FALSE;
if (!(quark = g_quark_try_string (category)))
return FALSE;
- for (i = 0; entry->categories[i]; i++)
+ for (i = 0; desktop_entry->categories[i]; i++)
{
- if (quark == entry->categories[i])
+ if (quark == desktop_entry->categories[i])
return TRUE;
}
@@ -567,29 +629,36 @@ void desktop_entry_add_legacy_category(DesktopEntry* entry)
{
GQuark *categories;
int i;
+ DesktopEntryDesktop *desktop_entry;
+
+ g_return_if_fail (entry->type == DESKTOP_ENTRY_DESKTOP);
+
+ desktop_entry = (DesktopEntryDesktop*) entry;
menu_verbose ("Adding Legacy category to \"%s\"\n",
entry->basename);
- i = 0;
- if (entry->categories != NULL)
+ if (desktop_entry->categories != NULL)
{
- for (; entry->categories[i]; i++);
- }
+ i = 0;
+ for (; desktop_entry->categories[i]; i++);
- categories = g_new0 (GQuark, i + 2);
+ categories = g_new0 (GQuark, i + 2);
- i = 0;
- if (entry->categories != NULL)
+ i = 0;
+ for (; desktop_entry->categories[i]; i++)
+ categories[i] = desktop_entry->categories[i];
+ }
+ else
{
- for (; entry->categories[i]; i++)
- categories[i] = entry->categories[i];
+ categories = g_new0 (GQuark, 2);
+ i = 0;
}
categories[i] = g_quark_from_string ("Legacy");
- g_free (entry->categories);
- entry->categories = categories;
+ g_free (desktop_entry->categories);
+ desktop_entry->categories = categories;
}
/*