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
=== modified file 'src/bamf-matcher-private.h'
--- src/bamf-matcher-private.h 2013-01-29 16:06:42 +0000
+++ src/bamf-matcher-private.h 2013-03-28 22:20:27 +0000
@@ -43,6 +43,7 @@
43 GList * views;43 GList * views;
44 GList * monitors;44 GList * monitors;
45 GList * favorites;45 GList * favorites;
46 GList * no_display_desktop;
46 BamfView * active_app;47 BamfView * active_app;
47 BamfView * active_win;48 BamfView * active_win;
48 guint dispatch_changes_id;49 guint dispatch_changes_id;
4950
=== modified file 'src/bamf-matcher.c'
--- src/bamf-matcher.c 2013-03-28 19:59:24 +0000
+++ src/bamf-matcher.c 2013-03-28 22:20:27 +0000
@@ -714,15 +714,52 @@
714 return FALSE;714 return FALSE;
715}715}
716716
717static gboolean
718is_no_display_desktop (BamfMatcher *self, const gchar *desktop_path)
719{
720 g_return_val_if_fail (BAMF_IS_MATCHER (self), FALSE);
721
722 if (!desktop_path || desktop_path[0] == '\0')
723 return FALSE;
724
725 GList *list = self->priv->no_display_desktop;
726
727 return g_list_find_custom (list, desktop_path, (GCompareFunc) g_strcmp0) != NULL;
728}
729
730static GList *
731get_last_no_display_desktop_in_list (BamfMatcher *self, GList *desktop_list)
732{
733 GList *last, *l;
734
735 g_return_val_if_fail (BAMF_IS_MATCHER (self), NULL);
736
737 last = NULL;
738
739 for (l = desktop_list; l; l = l->next)
740 {
741 char *desktop_path = l->data;
742
743 if (is_no_display_desktop (self, desktop_path))
744 {
745 last = l;
746 break;
747 }
748 }
749
750 return last;
751}
752
717static void753static void
718insert_data_into_tables (BamfMatcher *self,754insert_data_into_tables (BamfMatcher *self,
719 const char *data,755 const char *data,
720 const char *exec,756 const char *exec,
721 const char *desktop_id,757 const char *desktop_id,
758 gboolean no_display,
722 GHashTable *desktop_file_table,759 GHashTable *desktop_file_table,
723 GHashTable *desktop_id_table)760 GHashTable *desktop_id_table)
724{761{
725 GList *file_list, *id_list;762 GList *file_list, *id_list, *last, *l;
726 char *datadup;763 char *datadup;
727764
728 g_return_if_fail (exec);765 g_return_if_fail (exec);
@@ -739,11 +776,15 @@
739776
740 datadup = g_strdup (data);777 datadup = g_strdup (data);
741778
779 if (no_display)
780 {
781 self->priv->no_display_desktop = g_list_prepend (self->priv->no_display_desktop, datadup);
782 }
783
742 /* order so that items whose desktop_id == exec string are first in the list */784 /* order so that items whose desktop_id == exec string are first in the list */
743785
744 if (g_strcmp0 (exec, desktop_id) == 0 || is_desktop_folder_item (datadup, -1))786 if (g_strcmp0 (exec, desktop_id) == 0 || is_desktop_folder_item (datadup, -1))
745 {787 {
746 GList *l, *last;
747 last = NULL;788 last = NULL;
748789
749 for (l = file_list; l; l = l->next)790 for (l = file_list; l; l = l->next)
@@ -768,7 +809,7 @@
768 continue;809 continue;
769 }810 }
770811
771 if (strncmp (desktop_id, dname_start, len) != 0 &&812 if ((strncmp (desktop_id, dname_start, len) != 0 || is_no_display_desktop (self, dpath)) &&
772 !is_desktop_folder_item (dpath, (dname_start - dpath - 1)))813 !is_desktop_folder_item (dpath, (dname_start - dpath - 1)))
773 {814 {
774 last = l;815 last = l;
@@ -780,10 +821,20 @@
780 }821 }
781 else822 else
782 {823 {
783 file_list = g_list_append (file_list, datadup);824 last = NULL;
825
826 if (!no_display)
827 last = get_last_no_display_desktop_in_list (self, file_list);
828
829 file_list = g_list_insert_before (file_list, last, datadup);
784 }830 }
785831
786 id_list = g_list_append (id_list, datadup);832 last = NULL;
833
834 if (!no_display)
835 last = get_last_no_display_desktop_in_list (self, id_list);
836
837 id_list = g_list_insert_before (id_list, last, datadup);
787838
788 g_hash_table_insert (desktop_file_table, g_strdup (exec), file_list);839 g_hash_table_insert (desktop_file_table, g_strdup (exec), file_list);
789 g_hash_table_insert (desktop_id_table, g_strdup (desktop_id), id_list);840 g_hash_table_insert (desktop_id_table, g_strdup (desktop_id), id_list);
@@ -823,6 +874,7 @@
823 GHashTable *desktop_class_table)874 GHashTable *desktop_class_table)
824{875{
825 GDesktopAppInfo *desktop_file;876 GDesktopAppInfo *desktop_file;
877 gboolean no_display;
826 const char *current_desktop;878 const char *current_desktop;
827 char *exec;879 char *exec;
828 char *path;880 char *path;
@@ -874,8 +926,9 @@
874 g_free (path);926 g_free (path);
875927
876 desktop_id = g_string_truncate (desktop_id, desktop_id->len - 8); /* remove last 8 characters for .desktop */928 desktop_id = g_string_truncate (desktop_id, desktop_id->len - 8); /* remove last 8 characters for .desktop */
929 no_display = g_desktop_app_info_get_nodisplay (desktop_file);
877930
878 insert_data_into_tables (self, file, exec, desktop_id->str, desktop_file_table, desktop_id_table);931 insert_data_into_tables (self, file, exec, desktop_id->str, no_display, desktop_file_table, desktop_id_table);
879 insert_desktop_file_class_into_table (self, file, desktop_class_table);932 insert_desktop_file_class_into_table (self, file, desktop_class_table);
880933
881 g_free (exec);934 g_free (exec);
@@ -970,6 +1023,7 @@
970 const char *class;1023 const char *class;
971 const char *show_in;1024 const char *show_in;
972 GString *desktop_id;1025 GString *desktop_id;
1026 gboolean no_display;
9731027
974 /* Order is: 0 Desktop-Id, 1 Exec, 2 class, 3 ShowIn, 4 NoDisplay */1028 /* Order is: 0 Desktop-Id, 1 Exec, 2 class, 3 ShowIn, 4 NoDisplay */
975 gchar **parts = g_strsplit (line, "\t", 5);1029 gchar **parts = g_strsplit (line, "\t", 5);
@@ -1011,7 +1065,13 @@
1011 desktop_id = g_string_new (parts[0]);1065 desktop_id = g_string_new (parts[0]);
1012 g_string_truncate (desktop_id, desktop_id->len - 8);1066 g_string_truncate (desktop_id, desktop_id->len - 8);
10131067
1014 insert_data_into_tables (self, filename, exec, desktop_id->str, desktop_file_table, desktop_id_table);1068 no_display = FALSE;
1069 if (parts[4] && g_ascii_strcasecmp (parts[4], "true") == 0)
1070 {
1071 no_display = TRUE;
1072 }
1073
1074 insert_data_into_tables (self, filename, exec, desktop_id->str, no_display, desktop_file_table, desktop_id_table);
10151075
1016 class = parts[2];1076 class = parts[2];
1017 if (class && class[0] != '\0')1077 if (class && class[0] != '\0')
@@ -3027,6 +3087,7 @@
3027 g_hash_table_destroy (priv->desktop_file_table);3087 g_hash_table_destroy (priv->desktop_file_table);
3028 g_hash_table_destroy (priv->desktop_class_table);3088 g_hash_table_destroy (priv->desktop_class_table);
3029 g_hash_table_destroy (priv->registered_pids);3089 g_hash_table_destroy (priv->registered_pids);
3090 g_list_free (priv->no_display_desktop);
30303091
3031 if (priv->opened_closed_paths_table)3092 if (priv->opened_closed_paths_table)
3032 {3093 {
30333094
=== added directory 'tests/bamfdaemon/data/no-display'
=== added file 'tests/bamfdaemon/data/no-display/test-bamf-app.desktop'
--- tests/bamfdaemon/data/no-display/test-bamf-app.desktop 1970-01-01 00:00:00 +0000
+++ tests/bamfdaemon/data/no-display/test-bamf-app.desktop 2013-03-28 22:20:27 +0000
@@ -0,0 +1,8 @@
1[Desktop Entry]
2Version=1.0
3Name=TestBamfApp
4Type=Application
5Exec=test-bamf-app
6Icon=bamf
7NoDisplay=true
8StartupWMClass=test_bamf_app
09
=== added file 'tests/bamfdaemon/data/test-bamf-app-display.desktop'
--- tests/bamfdaemon/data/test-bamf-app-display.desktop 1970-01-01 00:00:00 +0000
+++ tests/bamfdaemon/data/test-bamf-app-display.desktop 2013-03-28 22:20:27 +0000
@@ -0,0 +1,7 @@
1[Desktop Entry]
2Version=1.0
3Name=TestBamfApp
4Type=Application
5Exec=test-bamf-app
6Icon=bamf
7StartupWMClass=test_bamf_app
08
=== added file 'tests/bamfdaemon/data/test-bamf-app-no-display.desktop'
--- tests/bamfdaemon/data/test-bamf-app-no-display.desktop 1970-01-01 00:00:00 +0000
+++ tests/bamfdaemon/data/test-bamf-app-no-display.desktop 2013-03-28 22:20:27 +0000
@@ -0,0 +1,8 @@
1[Desktop Entry]
2Version=1.0
3Name=TestBamfApp
4Type=Application
5Exec=test-bamf-app
6Icon=bamf
7NoDisplay=true
8StartupWMClass=test_bamf_app
09
=== modified file 'tests/bamfdaemon/test-bamf.c'
--- tests/bamfdaemon/test-bamf.c 2013-03-28 21:16:29 +0000
+++ tests/bamfdaemon/test-bamf.c 2013-03-28 22:20:27 +0000
@@ -65,6 +65,7 @@
65 gtk_init (&argc, &argv);65 gtk_init (&argc, &argv);
66 g_test_init (&argc, &argv, NULL);66 g_test_init (&argc, &argv, NULL);
67 glibtop_init ();67 glibtop_init ();
68
68 g_setenv("BAMF_TEST_MODE", "TRUE", TRUE);69 g_setenv("BAMF_TEST_MODE", "TRUE", TRUE);
6970
70 loop = g_main_loop_new (NULL, FALSE);71 loop = g_main_loop_new (NULL, FALSE);
7172
=== modified file 'tests/bamfdaemon/test-matcher.c'
--- tests/bamfdaemon/test-matcher.c 2013-03-28 18:58:28 +0000
+++ tests/bamfdaemon/test-matcher.c 2013-03-28 22:20:27 +0000
@@ -28,6 +28,8 @@
2828
29static void test_allocation (void);29static void test_allocation (void);
30static void test_load_desktop_file (void);30static void test_load_desktop_file (void);
31static void test_load_desktop_file_no_display_has_lower_prio_same_id (void);
32static void test_load_desktop_file_no_display_has_lower_prio_different_id (void);
31static void test_open_windows (void);33static void test_open_windows (void);
32static void test_match_desktopless_application (void);34static void test_match_desktopless_application (void);
33static void test_match_desktop_application (void);35static void test_match_desktop_application (void);
@@ -53,6 +55,8 @@
5355
54 g_test_add_func (DOMAIN"/Allocation", test_allocation);56 g_test_add_func (DOMAIN"/Allocation", test_allocation);
55 g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file);57 g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file);
58 g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/SameID", test_load_desktop_file_no_display_has_lower_prio_same_id);
59 g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/DifferentID", test_load_desktop_file_no_display_has_lower_prio_different_id);
56 g_test_add_func (DOMAIN"/OpenWindows", test_open_windows);60 g_test_add_func (DOMAIN"/OpenWindows", test_open_windows);
57 g_test_add_func (DOMAIN"/Matching/Application/DesktopLess", test_match_desktopless_application);61 g_test_add_func (DOMAIN"/Matching/Application/DesktopLess", test_match_desktopless_application);
58 g_test_add_func (DOMAIN"/Matching/Application/Desktop", test_match_desktop_application);62 g_test_add_func (DOMAIN"/Matching/Application/Desktop", test_match_desktop_application);
@@ -88,6 +92,7 @@
88 g_hash_table_destroy (matcher->priv->desktop_file_table);92 g_hash_table_destroy (matcher->priv->desktop_file_table);
89 g_hash_table_destroy (matcher->priv->desktop_id_table);93 g_hash_table_destroy (matcher->priv->desktop_id_table);
90 g_hash_table_destroy (matcher->priv->desktop_class_table);94 g_hash_table_destroy (matcher->priv->desktop_class_table);
95 g_list_free (matcher->priv->no_display_desktop);
9196
92 matcher->priv->desktop_file_table =97 matcher->priv->desktop_file_table =
93 g_hash_table_new_full ((GHashFunc) g_str_hash,98 g_hash_table_new_full ((GHashFunc) g_str_hash,
@@ -106,6 +111,8 @@
106 (GEqualFunc) g_str_equal,111 (GEqualFunc) g_str_equal,
107 (GDestroyNotify) g_free,112 (GDestroyNotify) g_free,
108 (GDestroyNotify) g_free);113 (GDestroyNotify) g_free);
114
115 matcher->priv->no_display_desktop = NULL;
109}116}
110117
111static BamfWindow *118static BamfWindow *
@@ -173,9 +180,11 @@
173 bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);180 bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
174181
175 GList *l = g_hash_table_lookup (priv->desktop_file_table, "test-bamf-app");182 GList *l = g_hash_table_lookup (priv->desktop_file_table, "test-bamf-app");
183 g_assert (l);
176 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);184 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
177185
178 l = g_hash_table_lookup (priv->desktop_id_table, "test-bamf-app");186 l = g_hash_table_lookup (priv->desktop_id_table, "test-bamf-app");
187 g_assert (l);
179 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);188 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
180189
181 const char *desktop = g_hash_table_lookup (priv->desktop_class_table, TEST_BAMF_APP_DESKTOP);190 const char *desktop = g_hash_table_lookup (priv->desktop_class_table, TEST_BAMF_APP_DESKTOP);
@@ -183,6 +192,49 @@
183}192}
184193
185static void194static void
195test_load_desktop_file_no_display_has_lower_prio_same_id (void)
196{
197 BamfMatcher *matcher = bamf_matcher_get_default ();
198 BamfMatcherPrivate *priv = matcher->priv;
199
200 cleanup_matcher_tables (matcher);
201 bamf_matcher_load_desktop_file (matcher, DATA_DIR"/no-display/test-bamf-app.desktop");
202 bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
203
204 GList *l = g_hash_table_lookup (priv->desktop_file_table, "test-bamf-app");
205 g_assert (l);
206 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
207
208 g_assert (l->next);
209 g_assert_cmpstr (l->next->data, ==, DATA_DIR"/no-display/test-bamf-app.desktop");
210
211 l = g_hash_table_lookup (priv->desktop_id_table, "test-bamf-app");
212 g_assert (l);
213 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
214
215 g_assert (l->next);
216 g_assert_cmpstr (l->next->data, ==, DATA_DIR"/no-display/test-bamf-app.desktop");
217}
218
219static void
220test_load_desktop_file_no_display_has_lower_prio_different_id (void)
221{
222 BamfMatcher *matcher = bamf_matcher_get_default ();
223 BamfMatcherPrivate *priv = matcher->priv;
224
225 cleanup_matcher_tables (matcher);
226 bamf_matcher_load_desktop_file (matcher, DATA_DIR"/test-bamf-app-no-display.desktop");
227 bamf_matcher_load_desktop_file (matcher, DATA_DIR"/test-bamf-app-display.desktop");
228
229 GList *l = g_hash_table_lookup (priv->desktop_file_table, "test-bamf-app");
230 g_assert (l);
231 g_assert_cmpstr (l->data, ==, DATA_DIR"/test-bamf-app-display.desktop");
232
233 g_assert (l->next);
234 g_assert_cmpstr (l->next->data, ==, DATA_DIR"/test-bamf-app-no-display.desktop");
235}
236
237static void
186test_open_windows (void)238test_open_windows (void)
187{239{
188 BamfMatcher *matcher;240 BamfMatcher *matcher;

Subscribers

People subscribed via source and target branches