Merge lp:~3v1n0/bamf/no-display-desktop-files-lower-priority into lp:bamf/0.4

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Marco Trevisan (Treviño)
Approved revision: 538
Merged at revision: 527
Proposed branch: lp:~3v1n0/bamf/no-display-desktop-files-lower-priority
Merge into: lp:bamf/0.4
Prerequisite: lp:~3v1n0/bamf/class-to-index-file
Diff against target: 320 lines (+145/-7)
7 files modified
src/bamf-matcher-private.h (+1/-0)
src/bamf-matcher.c (+68/-7)
tests/bamfdaemon/data/no-display/test-bamf-app.desktop (+8/-0)
tests/bamfdaemon/data/test-bamf-app-display.desktop (+7/-0)
tests/bamfdaemon/data/test-bamf-app-no-display.desktop (+8/-0)
tests/bamfdaemon/test-bamf.c (+1/-0)
tests/bamfdaemon/test-matcher.c (+52/-0)
To merge this branch: bzr merge lp:~3v1n0/bamf/no-display-desktop-files-lower-priority
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Brandon Schaefer (community) Approve
Review via email: mp+156039@code.launchpad.net

Commit message

BamfMatcher: make sure that all the no-display desktop files have lower priority

Description of the change

When a .desktop file with NoDisplay=true is passed to BAMF, we make sure that we add it always at the end of our lists so that it won't be used for matching unless it's the only one we have or it has a StartupWMClass value that forces it.

Tests updated.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

Im still getting this crash:

http://paste.ubuntu.com/5655931/

review: Needs Fixing
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

Sweeet! Looks good to me :)

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/bamf-matcher-private.h'
2--- src/bamf-matcher-private.h 2013-01-29 16:06:42 +0000
3+++ src/bamf-matcher-private.h 2013-03-28 22:20:27 +0000
4@@ -43,6 +43,7 @@
5 GList * views;
6 GList * monitors;
7 GList * favorites;
8+ GList * no_display_desktop;
9 BamfView * active_app;
10 BamfView * active_win;
11 guint dispatch_changes_id;
12
13=== modified file 'src/bamf-matcher.c'
14--- src/bamf-matcher.c 2013-03-28 19:59:24 +0000
15+++ src/bamf-matcher.c 2013-03-28 22:20:27 +0000
16@@ -714,15 +714,52 @@
17 return FALSE;
18 }
19
20+static gboolean
21+is_no_display_desktop (BamfMatcher *self, const gchar *desktop_path)
22+{
23+ g_return_val_if_fail (BAMF_IS_MATCHER (self), FALSE);
24+
25+ if (!desktop_path || desktop_path[0] == '\0')
26+ return FALSE;
27+
28+ GList *list = self->priv->no_display_desktop;
29+
30+ return g_list_find_custom (list, desktop_path, (GCompareFunc) g_strcmp0) != NULL;
31+}
32+
33+static GList *
34+get_last_no_display_desktop_in_list (BamfMatcher *self, GList *desktop_list)
35+{
36+ GList *last, *l;
37+
38+ g_return_val_if_fail (BAMF_IS_MATCHER (self), NULL);
39+
40+ last = NULL;
41+
42+ for (l = desktop_list; l; l = l->next)
43+ {
44+ char *desktop_path = l->data;
45+
46+ if (is_no_display_desktop (self, desktop_path))
47+ {
48+ last = l;
49+ break;
50+ }
51+ }
52+
53+ return last;
54+}
55+
56 static void
57 insert_data_into_tables (BamfMatcher *self,
58 const char *data,
59 const char *exec,
60 const char *desktop_id,
61+ gboolean no_display,
62 GHashTable *desktop_file_table,
63 GHashTable *desktop_id_table)
64 {
65- GList *file_list, *id_list;
66+ GList *file_list, *id_list, *last, *l;
67 char *datadup;
68
69 g_return_if_fail (exec);
70@@ -739,11 +776,15 @@
71
72 datadup = g_strdup (data);
73
74+ if (no_display)
75+ {
76+ self->priv->no_display_desktop = g_list_prepend (self->priv->no_display_desktop, datadup);
77+ }
78+
79 /* order so that items whose desktop_id == exec string are first in the list */
80
81 if (g_strcmp0 (exec, desktop_id) == 0 || is_desktop_folder_item (datadup, -1))
82 {
83- GList *l, *last;
84 last = NULL;
85
86 for (l = file_list; l; l = l->next)
87@@ -768,7 +809,7 @@
88 continue;
89 }
90
91- if (strncmp (desktop_id, dname_start, len) != 0 &&
92+ if ((strncmp (desktop_id, dname_start, len) != 0 || is_no_display_desktop (self, dpath)) &&
93 !is_desktop_folder_item (dpath, (dname_start - dpath - 1)))
94 {
95 last = l;
96@@ -780,10 +821,20 @@
97 }
98 else
99 {
100- file_list = g_list_append (file_list, datadup);
101+ last = NULL;
102+
103+ if (!no_display)
104+ last = get_last_no_display_desktop_in_list (self, file_list);
105+
106+ file_list = g_list_insert_before (file_list, last, datadup);
107 }
108
109- id_list = g_list_append (id_list, datadup);
110+ last = NULL;
111+
112+ if (!no_display)
113+ last = get_last_no_display_desktop_in_list (self, id_list);
114+
115+ id_list = g_list_insert_before (id_list, last, datadup);
116
117 g_hash_table_insert (desktop_file_table, g_strdup (exec), file_list);
118 g_hash_table_insert (desktop_id_table, g_strdup (desktop_id), id_list);
119@@ -823,6 +874,7 @@
120 GHashTable *desktop_class_table)
121 {
122 GDesktopAppInfo *desktop_file;
123+ gboolean no_display;
124 const char *current_desktop;
125 char *exec;
126 char *path;
127@@ -874,8 +926,9 @@
128 g_free (path);
129
130 desktop_id = g_string_truncate (desktop_id, desktop_id->len - 8); /* remove last 8 characters for .desktop */
131+ no_display = g_desktop_app_info_get_nodisplay (desktop_file);
132
133- insert_data_into_tables (self, file, exec, desktop_id->str, desktop_file_table, desktop_id_table);
134+ insert_data_into_tables (self, file, exec, desktop_id->str, no_display, desktop_file_table, desktop_id_table);
135 insert_desktop_file_class_into_table (self, file, desktop_class_table);
136
137 g_free (exec);
138@@ -970,6 +1023,7 @@
139 const char *class;
140 const char *show_in;
141 GString *desktop_id;
142+ gboolean no_display;
143
144 /* Order is: 0 Desktop-Id, 1 Exec, 2 class, 3 ShowIn, 4 NoDisplay */
145 gchar **parts = g_strsplit (line, "\t", 5);
146@@ -1011,7 +1065,13 @@
147 desktop_id = g_string_new (parts[0]);
148 g_string_truncate (desktop_id, desktop_id->len - 8);
149
150- insert_data_into_tables (self, filename, exec, desktop_id->str, desktop_file_table, desktop_id_table);
151+ no_display = FALSE;
152+ if (parts[4] && g_ascii_strcasecmp (parts[4], "true") == 0)
153+ {
154+ no_display = TRUE;
155+ }
156+
157+ insert_data_into_tables (self, filename, exec, desktop_id->str, no_display, desktop_file_table, desktop_id_table);
158
159 class = parts[2];
160 if (class && class[0] != '\0')
161@@ -3027,6 +3087,7 @@
162 g_hash_table_destroy (priv->desktop_file_table);
163 g_hash_table_destroy (priv->desktop_class_table);
164 g_hash_table_destroy (priv->registered_pids);
165+ g_list_free (priv->no_display_desktop);
166
167 if (priv->opened_closed_paths_table)
168 {
169
170=== added directory 'tests/bamfdaemon/data/no-display'
171=== added file 'tests/bamfdaemon/data/no-display/test-bamf-app.desktop'
172--- tests/bamfdaemon/data/no-display/test-bamf-app.desktop 1970-01-01 00:00:00 +0000
173+++ tests/bamfdaemon/data/no-display/test-bamf-app.desktop 2013-03-28 22:20:27 +0000
174@@ -0,0 +1,8 @@
175+[Desktop Entry]
176+Version=1.0
177+Name=TestBamfApp
178+Type=Application
179+Exec=test-bamf-app
180+Icon=bamf
181+NoDisplay=true
182+StartupWMClass=test_bamf_app
183
184=== added file 'tests/bamfdaemon/data/test-bamf-app-display.desktop'
185--- tests/bamfdaemon/data/test-bamf-app-display.desktop 1970-01-01 00:00:00 +0000
186+++ tests/bamfdaemon/data/test-bamf-app-display.desktop 2013-03-28 22:20:27 +0000
187@@ -0,0 +1,7 @@
188+[Desktop Entry]
189+Version=1.0
190+Name=TestBamfApp
191+Type=Application
192+Exec=test-bamf-app
193+Icon=bamf
194+StartupWMClass=test_bamf_app
195
196=== added file 'tests/bamfdaemon/data/test-bamf-app-no-display.desktop'
197--- tests/bamfdaemon/data/test-bamf-app-no-display.desktop 1970-01-01 00:00:00 +0000
198+++ tests/bamfdaemon/data/test-bamf-app-no-display.desktop 2013-03-28 22:20:27 +0000
199@@ -0,0 +1,8 @@
200+[Desktop Entry]
201+Version=1.0
202+Name=TestBamfApp
203+Type=Application
204+Exec=test-bamf-app
205+Icon=bamf
206+NoDisplay=true
207+StartupWMClass=test_bamf_app
208
209=== modified file 'tests/bamfdaemon/test-bamf.c'
210--- tests/bamfdaemon/test-bamf.c 2013-03-28 21:16:29 +0000
211+++ tests/bamfdaemon/test-bamf.c 2013-03-28 22:20:27 +0000
212@@ -65,6 +65,7 @@
213 gtk_init (&argc, &argv);
214 g_test_init (&argc, &argv, NULL);
215 glibtop_init ();
216+
217 g_setenv("BAMF_TEST_MODE", "TRUE", TRUE);
218
219 loop = g_main_loop_new (NULL, FALSE);
220
221=== modified file 'tests/bamfdaemon/test-matcher.c'
222--- tests/bamfdaemon/test-matcher.c 2013-03-28 18:58:28 +0000
223+++ tests/bamfdaemon/test-matcher.c 2013-03-28 22:20:27 +0000
224@@ -28,6 +28,8 @@
225
226 static void test_allocation (void);
227 static void test_load_desktop_file (void);
228+static void test_load_desktop_file_no_display_has_lower_prio_same_id (void);
229+static void test_load_desktop_file_no_display_has_lower_prio_different_id (void);
230 static void test_open_windows (void);
231 static void test_match_desktopless_application (void);
232 static void test_match_desktop_application (void);
233@@ -53,6 +55,8 @@
234
235 g_test_add_func (DOMAIN"/Allocation", test_allocation);
236 g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file);
237+ g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/SameID", test_load_desktop_file_no_display_has_lower_prio_same_id);
238+ g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/DifferentID", test_load_desktop_file_no_display_has_lower_prio_different_id);
239 g_test_add_func (DOMAIN"/OpenWindows", test_open_windows);
240 g_test_add_func (DOMAIN"/Matching/Application/DesktopLess", test_match_desktopless_application);
241 g_test_add_func (DOMAIN"/Matching/Application/Desktop", test_match_desktop_application);
242@@ -88,6 +92,7 @@
243 g_hash_table_destroy (matcher->priv->desktop_file_table);
244 g_hash_table_destroy (matcher->priv->desktop_id_table);
245 g_hash_table_destroy (matcher->priv->desktop_class_table);
246+ g_list_free (matcher->priv->no_display_desktop);
247
248 matcher->priv->desktop_file_table =
249 g_hash_table_new_full ((GHashFunc) g_str_hash,
250@@ -106,6 +111,8 @@
251 (GEqualFunc) g_str_equal,
252 (GDestroyNotify) g_free,
253 (GDestroyNotify) g_free);
254+
255+ matcher->priv->no_display_desktop = NULL;
256 }
257
258 static BamfWindow *
259@@ -173,9 +180,11 @@
260 bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
261
262 GList *l = g_hash_table_lookup (priv->desktop_file_table, "test-bamf-app");
263+ g_assert (l);
264 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
265
266 l = g_hash_table_lookup (priv->desktop_id_table, "test-bamf-app");
267+ g_assert (l);
268 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
269
270 const char *desktop = g_hash_table_lookup (priv->desktop_class_table, TEST_BAMF_APP_DESKTOP);
271@@ -183,6 +192,49 @@
272 }
273
274 static void
275+test_load_desktop_file_no_display_has_lower_prio_same_id (void)
276+{
277+ BamfMatcher *matcher = bamf_matcher_get_default ();
278+ BamfMatcherPrivate *priv = matcher->priv;
279+
280+ cleanup_matcher_tables (matcher);
281+ bamf_matcher_load_desktop_file (matcher, DATA_DIR"/no-display/test-bamf-app.desktop");
282+ bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
283+
284+ GList *l = g_hash_table_lookup (priv->desktop_file_table, "test-bamf-app");
285+ g_assert (l);
286+ g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
287+
288+ g_assert (l->next);
289+ g_assert_cmpstr (l->next->data, ==, DATA_DIR"/no-display/test-bamf-app.desktop");
290+
291+ l = g_hash_table_lookup (priv->desktop_id_table, "test-bamf-app");
292+ g_assert (l);
293+ g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
294+
295+ g_assert (l->next);
296+ g_assert_cmpstr (l->next->data, ==, DATA_DIR"/no-display/test-bamf-app.desktop");
297+}
298+
299+static void
300+test_load_desktop_file_no_display_has_lower_prio_different_id (void)
301+{
302+ BamfMatcher *matcher = bamf_matcher_get_default ();
303+ BamfMatcherPrivate *priv = matcher->priv;
304+
305+ cleanup_matcher_tables (matcher);
306+ bamf_matcher_load_desktop_file (matcher, DATA_DIR"/test-bamf-app-no-display.desktop");
307+ bamf_matcher_load_desktop_file (matcher, DATA_DIR"/test-bamf-app-display.desktop");
308+
309+ GList *l = g_hash_table_lookup (priv->desktop_file_table, "test-bamf-app");
310+ g_assert (l);
311+ g_assert_cmpstr (l->data, ==, DATA_DIR"/test-bamf-app-display.desktop");
312+
313+ g_assert (l->next);
314+ g_assert_cmpstr (l->next->data, ==, DATA_DIR"/test-bamf-app-no-display.desktop");
315+}
316+
317+static void
318 test_open_windows (void)
319 {
320 BamfMatcher *matcher;

Subscribers

People subscribed via source and target branches