From b4546ab43c2c7ef6fb6cb7e5db83dc3975b56e8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Mon, 27 Oct 2014 18:41:34 +0200 Subject: desktop-entries: support multiple desktops in XDG_CURRENT_DESKTOP This is based on glib commit: 5a5e16e93c4f11e635918ecdb41681f63fd05a39 --- libmenu/desktop-entries.c | 110 ++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 58 deletions(-) diff --git a/libmenu/desktop-entries.c b/libmenu/desktop-entries.c index 326f311..bd4f886 100644 --- a/libmenu/desktop-entries.c +++ b/libmenu/desktop-entries.c @@ -85,32 +85,27 @@ unix_basename_from_path (const char *path) return path; } -static const char * -get_current_desktop (void) +static const gchar * const * +get_current_desktops (void) { - static char *current_desktop = NULL; + static gchar **result; - /* Support XDG_CURRENT_DESKTOP environment variable; this can be used - * to abuse gnome-menus in non-GNOME desktops. */ - if (!current_desktop) + if (g_once_init_enter (&result)) { - const char *desktop; + const gchar *desktops; + gchar **tmp; - desktop = g_getenv ("XDG_CURRENT_DESKTOP"); + desktops = 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 ("GNOME"); - else - current_desktop = g_strdup (desktop); - } + if (desktops) + desktops = ""; - /* Using "*" means skipping desktop-related checks */ - if (g_strcmp0 (current_desktop, "*") == 0) - return NULL; + tmp = g_strsplit (desktops, ":", 0); + + g_once_init_leave (&result, tmp); + } - return current_desktop; + return (const gchar **) result; } static GIcon * @@ -151,52 +146,58 @@ key_file_get_icon (GKeyFile *key_file) static gboolean key_file_get_show_in (GKeyFile *key_file) { - const gchar *current_desktop; - gchar **strv; + const gchar * const *current_desktops; + gchar **only_show_in; + gchar **not_show_in; 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, - "OnlyShowIn", - NULL, - NULL); - if (strv) + gint i; + + current_desktops = get_current_desktops (); + only_show_in = g_key_file_get_string_list (key_file, + DESKTOP_ENTRY_GROUP, + "OnlyShowIn", + NULL, + NULL); + not_show_in = g_key_file_get_string_list (key_file, + DESKTOP_ENTRY_GROUP, + "NotShowIn", + NULL, + NULL); + + for (i = 0; current_desktops[i]; i++) { - show_in = FALSE; - for (i = 0; strv[i]; i++) + gint j; + + if (only_show_in) { - if (!strcmp (strv[i], current_desktop)) + show_in = FALSE; + for (j = 0; only_show_in[j]; j++) { - show_in = TRUE; - break; + if (g_str_equal (only_show_in[j], current_desktops[i])) + { + show_in = TRUE; + goto out; + } } } - } - else - { - strv = g_key_file_get_string_list (key_file, - DESKTOP_ENTRY_GROUP, - "NotShowIn", - NULL, - NULL); - if (strv) + + if (not_show_in) { show_in = TRUE; - for (i = 0; strv[i]; i++) + for (j = 0; not_show_in[j]; j++) { - if (!strcmp (strv[i], current_desktop)) + if (g_str_equal (not_show_in[j], current_desktops[i])) { show_in = FALSE; + goto out; } } } } - g_strfreev (strv); + +out: + g_strfreev (only_show_in); + g_strfreev (not_show_in); return show_in; } @@ -579,14 +580,7 @@ gboolean desktop_entry_get_show_in (DesktopEntry *entry) { if (entry->type == DESKTOP_ENTRY_DESKTOP) - { - const char *current_desktop = get_current_desktop (); - - if (current_desktop == NULL) - return TRUE; - else - return g_desktop_app_info_get_show_in (((DesktopEntryDesktop*)entry)->appinfo, current_desktop); - } + return g_desktop_app_info_get_show_in (((DesktopEntryDesktop*)entry)->appinfo, NULL); return ((DesktopEntryDirectory*)entry)->showin; } -- cgit v0.11.2