Florian Müllner 1799758
From b4546ab43c2c7ef6fb6cb7e5db83dc3975b56e8e Mon Sep 17 00:00:00 2001
Florian Müllner 1799758
From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= <alberts.muktupavels@gmail.com>
Florian Müllner 1799758
Date: Mon, 27 Oct 2014 18:41:34 +0200
Florian Müllner 1799758
Subject: [PATCH 1/2] desktop-entries: support multiple desktops in
Florian Müllner 1799758
 XDG_CURRENT_DESKTOP
Florian Müllner 1799758
Florian Müllner 1799758
This is based on glib commit:
Florian Müllner 1799758
5a5e16e93c4f11e635918ecdb41681f63fd05a39
Florian Müllner 1799758
---
Florian Müllner 1799758
 libmenu/desktop-entries.c | 110 ++++++++++++++++++++++------------------------
Florian Müllner 1799758
 1 file changed, 52 insertions(+), 58 deletions(-)
Florian Müllner 1799758
Florian Müllner 1799758
diff --git a/libmenu/desktop-entries.c b/libmenu/desktop-entries.c
Florian Müllner 1799758
index 326f311..bd4f886 100644
Florian Müllner 1799758
--- a/libmenu/desktop-entries.c
Florian Müllner 1799758
+++ b/libmenu/desktop-entries.c
Florian Müllner 1799758
@@ -85,32 +85,27 @@ unix_basename_from_path (const char *path)
Florian Müllner 1799758
     return path;
Florian Müllner 1799758
 }
Florian Müllner 1799758
 
Florian Müllner 1799758
-static const char *
Florian Müllner 1799758
-get_current_desktop (void)
Florian Müllner 1799758
+static const gchar * const *
Florian Müllner 1799758
+get_current_desktops (void)
Florian Müllner 1799758
 {
Florian Müllner 1799758
-  static char *current_desktop = NULL;
Florian Müllner 1799758
+  static gchar **result;
Florian Müllner 1799758
 
Florian Müllner 1799758
-  /* Support XDG_CURRENT_DESKTOP environment variable; this can be used
Florian Müllner 1799758
-   * to abuse gnome-menus in non-GNOME desktops. */
Florian Müllner 1799758
-  if (!current_desktop)
Florian Müllner 1799758
+  if (g_once_init_enter (&result))
Florian Müllner 1799758
     {
Florian Müllner 1799758
-      const char *desktop;
Florian Müllner 1799758
+      const gchar *desktops;
Florian Müllner 1799758
+      gchar **tmp;
Florian Müllner 1799758
 
Florian Müllner 1799758
-      desktop = g_getenv ("XDG_CURRENT_DESKTOP");
Florian Müllner 1799758
+      desktops = g_getenv ("XDG_CURRENT_DESKTOP");
Florian Müllner 1799758
 
Florian Müllner 1799758
-      /* Note: if XDG_CURRENT_DESKTOP is set but empty, do as if it
Florian Müllner 1799758
-       * was not set */
Florian Müllner 1799758
-      if (!desktop || desktop[0] == '\0')
Florian Müllner 1799758
-        current_desktop = g_strdup ("GNOME");
Florian Müllner 1799758
-      else
Florian Müllner 1799758
-        current_desktop = g_strdup (desktop);
Florian Müllner 1799758
-    }
Florian Müllner 1799758
+      if (desktops)
Florian Müllner 1799758
+        desktops = "";
Florian Müllner 1799758
 
Florian Müllner 1799758
-  /* Using "*" means skipping desktop-related checks */
Florian Müllner 1799758
-  if (g_strcmp0 (current_desktop, "*") == 0)
Florian Müllner 1799758
-    return NULL;
Florian Müllner 1799758
+      tmp = g_strsplit (desktops, ":", 0);
Florian Müllner 1799758
+
Florian Müllner 1799758
+      g_once_init_leave (&result, tmp);
Florian Müllner 1799758
+    }
Florian Müllner 1799758
 
Florian Müllner 1799758
-  return current_desktop;
Florian Müllner 1799758
+  return  (const gchar **) result;
Florian Müllner 1799758
 }
Florian Müllner 1799758
 
Florian Müllner 1799758
 static GIcon *
Florian Müllner 1799758
@@ -151,52 +146,58 @@ key_file_get_icon (GKeyFile *key_file)
Florian Müllner 1799758
 static gboolean
Florian Müllner 1799758
 key_file_get_show_in (GKeyFile *key_file)
Florian Müllner 1799758
 {
Florian Müllner 1799758
-  const gchar *current_desktop;
Florian Müllner 1799758
-  gchar **strv;
Florian Müllner 1799758
+  const gchar * const *current_desktops;
Florian Müllner 1799758
+  gchar **only_show_in;
Florian Müllner 1799758
+  gchar **not_show_in;
Florian Müllner 1799758
   gboolean show_in = TRUE;
Florian Müllner 1799758
-  int i;
Florian Müllner 1799758
-
Florian Müllner 1799758
-  current_desktop = get_current_desktop ();
Florian Müllner 1799758
-  if (!current_desktop)
Florian Müllner 1799758
-    return TRUE;
Florian Müllner 1799758
-
Florian Müllner 1799758
-  strv = g_key_file_get_string_list (key_file,
Florian Müllner 1799758
-                                     DESKTOP_ENTRY_GROUP,
Florian Müllner 1799758
-                                     "OnlyShowIn",
Florian Müllner 1799758
-                                     NULL,
Florian Müllner 1799758
-                                     NULL);
Florian Müllner 1799758
-  if (strv)
Florian Müllner 1799758
+  gint i;
Florian Müllner 1799758
+
Florian Müllner 1799758
+  current_desktops = get_current_desktops ();
Florian Müllner 1799758
+  only_show_in = g_key_file_get_string_list (key_file,
Florian Müllner 1799758
+                                             DESKTOP_ENTRY_GROUP,
Florian Müllner 1799758
+                                             "OnlyShowIn",
Florian Müllner 1799758
+                                             NULL,
Florian Müllner 1799758
+                                             NULL);
Florian Müllner 1799758
+  not_show_in = g_key_file_get_string_list (key_file,
Florian Müllner 1799758
+                                            DESKTOP_ENTRY_GROUP,
Florian Müllner 1799758
+                                            "NotShowIn",
Florian Müllner 1799758
+                                            NULL,
Florian Müllner 1799758
+                                            NULL);
Florian Müllner 1799758
+
Florian Müllner 1799758
+  for (i = 0; current_desktops[i]; i++)
Florian Müllner 1799758
     {
Florian Müllner 1799758
-      show_in = FALSE;
Florian Müllner 1799758
-      for (i = 0; strv[i]; i++)
Florian Müllner 1799758
+      gint j;
Florian Müllner 1799758
+
Florian Müllner 1799758
+      if (only_show_in)
Florian Müllner 1799758
         {
Florian Müllner 1799758
-          if (!strcmp (strv[i], current_desktop))
Florian Müllner 1799758
+          show_in = FALSE;
Florian Müllner 1799758
+          for (j = 0; only_show_in[j]; j++)
Florian Müllner 1799758
             {
Florian Müllner 1799758
-              show_in = TRUE;
Florian Müllner 1799758
-              break;
Florian Müllner 1799758
+              if (g_str_equal (only_show_in[j], current_desktops[i]))
Florian Müllner 1799758
+                {
Florian Müllner 1799758
+                  show_in = TRUE;
Florian Müllner 1799758
+                  goto out;
Florian Müllner 1799758
+                }
Florian Müllner 1799758
             }
Florian Müllner 1799758
         }
Florian Müllner 1799758
-    }
Florian Müllner 1799758
-  else
Florian Müllner 1799758
-    {
Florian Müllner 1799758
-      strv = g_key_file_get_string_list (key_file,
Florian Müllner 1799758
-                                         DESKTOP_ENTRY_GROUP,
Florian Müllner 1799758
-                                         "NotShowIn",
Florian Müllner 1799758
-                                         NULL,
Florian Müllner 1799758
-                                         NULL);
Florian Müllner 1799758
-      if (strv)
Florian Müllner 1799758
+
Florian Müllner 1799758
+      if (not_show_in)
Florian Müllner 1799758
         {
Florian Müllner 1799758
           show_in = TRUE;
Florian Müllner 1799758
-          for (i = 0; strv[i]; i++)
Florian Müllner 1799758
+          for (j = 0; not_show_in[j]; j++)
Florian Müllner 1799758
             {
Florian Müllner 1799758
-              if (!strcmp (strv[i], current_desktop))
Florian Müllner 1799758
+              if (g_str_equal (not_show_in[j], current_desktops[i]))
Florian Müllner 1799758
                 {
Florian Müllner 1799758
                   show_in = FALSE;
Florian Müllner 1799758
+                  goto out;
Florian Müllner 1799758
                 }
Florian Müllner 1799758
             }
Florian Müllner 1799758
         }
Florian Müllner 1799758
     }
Florian Müllner 1799758
-  g_strfreev (strv);
Florian Müllner 1799758
+
Florian Müllner 1799758
+out:
Florian Müllner 1799758
+  g_strfreev (only_show_in);
Florian Müllner 1799758
+  g_strfreev (not_show_in);
Florian Müllner 1799758
 
Florian Müllner 1799758
   return show_in;
Florian Müllner 1799758
 }
Florian Müllner 1799758
@@ -579,14 +580,7 @@ gboolean
Florian Müllner 1799758
 desktop_entry_get_show_in (DesktopEntry *entry)
Florian Müllner 1799758
 {
Florian Müllner 1799758
   if (entry->type == DESKTOP_ENTRY_DESKTOP)
Florian Müllner 1799758
-    {
Florian Müllner 1799758
-      const char *current_desktop = get_current_desktop ();
Florian Müllner 1799758
-
Florian Müllner 1799758
-      if (current_desktop == NULL)
Florian Müllner 1799758
-        return TRUE;
Florian Müllner 1799758
-      else
Florian Müllner 1799758
-        return g_desktop_app_info_get_show_in (((DesktopEntryDesktop*)entry)->appinfo, current_desktop);
Florian Müllner 1799758
-    }
Florian Müllner 1799758
+    return g_desktop_app_info_get_show_in (((DesktopEntryDesktop*)entry)->appinfo, NULL);
Florian Müllner 1799758
   return ((DesktopEntryDirectory*)entry)->showin;
Florian Müllner 1799758
 }
Florian Müllner 1799758
 
Florian Müllner 1799758
-- 
Florian Müllner 1799758
2.4.3
Florian Müllner 1799758
Florian Müllner 1799758
Florian Müllner 1799758
From 4befe76fbdb76aa6a986297ef71d1601b2ced42e Mon Sep 17 00:00:00 2001
Florian Müllner 1799758
From: Josselin Mouette <joss@debian.org>
Florian Müllner 1799758
Date: Sun, 14 Dec 2014 20:36:36 +0100
Florian Müllner 1799758
Subject: [PATCH 2/2] desktop-entries: fix trivial bug in handling of multiple
Florian Müllner 1799758
 desktops in XDG_CURRENT_DESKTOP.
Florian Müllner 1799758
Florian Müllner 1799758
https://bugzilla.gnome.org/show_bug.cgi?id=741505
Florian Müllner 1799758
---
Florian Müllner 1799758
 libmenu/desktop-entries.c | 2 +-
Florian Müllner 1799758
 1 file changed, 1 insertion(+), 1 deletion(-)
Florian Müllner 1799758
Florian Müllner 1799758
diff --git a/libmenu/desktop-entries.c b/libmenu/desktop-entries.c
Florian Müllner 1799758
index bd4f886..a463d79 100644
Florian Müllner 1799758
--- a/libmenu/desktop-entries.c
Florian Müllner 1799758
+++ b/libmenu/desktop-entries.c
Florian Müllner 1799758
@@ -97,7 +97,7 @@ get_current_desktops (void)
Florian Müllner 1799758
 
Florian Müllner 1799758
       desktops = g_getenv ("XDG_CURRENT_DESKTOP");
Florian Müllner 1799758
 
Florian Müllner 1799758
-      if (desktops)
Florian Müllner 1799758
+      if (!desktops)
Florian Müllner 1799758
         desktops = "";
Florian Müllner 1799758
 
Florian Müllner 1799758
       tmp = g_strsplit (desktops, ":", 0);
Florian Müllner 1799758
-- 
Florian Müllner 1799758
2.4.3
Florian Müllner 1799758