summaryrefslogtreecommitdiff
blob: 8ec7006fce5ba91a454250f6ba70034973d361c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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