| From b4546ab43c2c7ef6fb6cb7e5db83dc3975b56e8e Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= <alberts.muktupavels@gmail.com> |
| 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 |
| |