Merge lp:~3v1n0/bamf/qmlapp-matching-0.4 into lp:bamf/0.4
- qmlapp-matching-0.4
- Merge into 0.4
Proposed by
Marco Trevisan (Treviño)
Status: | Merged |
---|---|
Approved by: | Christopher Townsend |
Approved revision: | 543 |
Merged at revision: | 543 |
Proposed branch: | lp:~3v1n0/bamf/qmlapp-matching-0.4 |
Merge into: | lp:bamf/0.4 |
Diff against target: |
937 lines (+508/-152) 9 files modified
src/bamf-application.c (+1/-4) src/bamf-legacy-window-test.c (+2/-2) src/bamf-legacy-window.c (+15/-6) src/bamf-legacy-window.h (+2/-2) src/bamf-matcher-private.h (+2/-1) src/bamf-matcher.c (+118/-64) tests/bamfdaemon/test-application.c (+101/-35) tests/bamfdaemon/test-matcher.c (+259/-38) tests/data/bamf-qml-app.desktop (+8/-0) |
To merge this branch: | bzr merge lp:~3v1n0/bamf/qmlapp-matching-0.4 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot (community) | continuous-integration | Approve | |
Christopher Townsend | Approve | ||
Review via email: mp+176928@code.launchpad.net |
Commit message
BamfMatcher: correctly match QML applications launched with qmlscene or qmlviewer
This also includes adding support to the "--desktop_
matching and caching the window exec string in BamfLegacyWindow.
Description of the change
Backported branches lp:~3v1n0/bamf/qmlapp-matching, lp:~3v1n0/bamf/desktop_file_hint-exec-override and lp:~3v1n0/bamf/cache-exec-string to Bamf 0.4
To post a comment you must log in.
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-application.c' | |||
2 | --- src/bamf-application.c 2013-05-24 17:00:19 +0000 | |||
3 | +++ src/bamf-application.c 2013-07-25 12:39:27 +0000 | |||
4 | @@ -300,7 +300,7 @@ | |||
5 | 300 | break; | 300 | break; |
6 | 301 | 301 | ||
7 | 302 | g_free (icon); | 302 | g_free (icon); |
9 | 303 | icon = bamf_legacy_window_get_exec_string (bamf_window_get_window (window)); | 303 | icon = g_strdup (bamf_legacy_window_get_exec_string (bamf_window_get_window (window))); |
10 | 304 | 304 | ||
11 | 305 | if (icon_name_is_valid (icon)) | 305 | if (icon_name_is_valid (icon)) |
12 | 306 | break; | 306 | break; |
13 | @@ -444,9 +444,6 @@ | |||
14 | 444 | const char *window_class = bamf_legacy_window_get_class_name (window); | 444 | const char *window_class = bamf_legacy_window_get_class_name (window); |
15 | 445 | const char *instance_name = bamf_legacy_window_get_class_instance_name (window); | 445 | const char *instance_name = bamf_legacy_window_get_class_instance_name (window); |
16 | 446 | 446 | ||
17 | 447 | if (!window_class && !instance_name) | ||
18 | 448 | return FALSE; | ||
19 | 449 | |||
20 | 450 | children = bamf_view_get_children (BAMF_VIEW (self)); | 447 | children = bamf_view_get_children (BAMF_VIEW (self)); |
21 | 451 | for (l = children; l; l = l->next) | 448 | for (l = children; l; l = l->next) |
22 | 452 | { | 449 | { |
23 | 453 | 450 | ||
24 | === modified file 'src/bamf-legacy-window-test.c' | |||
25 | --- src/bamf-legacy-window-test.c 2013-04-18 13:57:15 +0000 | |||
26 | +++ src/bamf-legacy-window-test.c 2013-07-25 12:39:27 +0000 | |||
27 | @@ -221,14 +221,14 @@ | |||
28 | 221 | return self->wm_class_instance; | 221 | return self->wm_class_instance; |
29 | 222 | } | 222 | } |
30 | 223 | 223 | ||
32 | 224 | char * | 224 | const char * |
33 | 225 | bamf_legacy_window_test_get_exec_string (BamfLegacyWindow *legacy_window) | 225 | bamf_legacy_window_test_get_exec_string (BamfLegacyWindow *legacy_window) |
34 | 226 | { | 226 | { |
35 | 227 | BamfLegacyWindowTest *self; | 227 | BamfLegacyWindowTest *self; |
36 | 228 | 228 | ||
37 | 229 | self = BAMF_LEGACY_WINDOW_TEST (legacy_window); | 229 | self = BAMF_LEGACY_WINDOW_TEST (legacy_window); |
38 | 230 | 230 | ||
40 | 231 | return g_strdup (self->exec); | 231 | return self->exec; |
41 | 232 | } | 232 | } |
42 | 233 | 233 | ||
43 | 234 | char * | 234 | char * |
44 | 235 | 235 | ||
45 | === modified file 'src/bamf-legacy-window.c' | |||
46 | --- src/bamf-legacy-window.c 2013-04-18 14:20:02 +0000 | |||
47 | +++ src/bamf-legacy-window.c 2013-07-25 12:39:27 +0000 | |||
48 | @@ -51,7 +51,8 @@ | |||
49 | 51 | struct _BamfLegacyWindowPrivate | 51 | struct _BamfLegacyWindowPrivate |
50 | 52 | { | 52 | { |
51 | 53 | WnckWindow * legacy_window; | 53 | WnckWindow * legacy_window; |
53 | 54 | char * mini_icon_path; | 54 | gchar * mini_icon_path; |
54 | 55 | gchar * exec_string; | ||
55 | 55 | gboolean is_closed; | 56 | gboolean is_closed; |
56 | 56 | }; | 57 | }; |
57 | 57 | 58 | ||
58 | @@ -218,10 +219,9 @@ | |||
59 | 218 | return result; | 219 | return result; |
60 | 219 | } | 220 | } |
61 | 220 | 221 | ||
63 | 221 | char * | 222 | const char * |
64 | 222 | bamf_legacy_window_get_exec_string (BamfLegacyWindow *self) | 223 | bamf_legacy_window_get_exec_string (BamfLegacyWindow *self) |
65 | 223 | { | 224 | { |
66 | 224 | gchar *result = NULL; | ||
67 | 225 | gint pid = 0, i = 0; | 225 | gint pid = 0, i = 0; |
68 | 226 | gchar **argv = NULL; | 226 | gchar **argv = NULL; |
69 | 227 | GString *exec = NULL; | 227 | GString *exec = NULL; |
70 | @@ -232,6 +232,9 @@ | |||
71 | 232 | if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_exec_string) | 232 | if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_exec_string) |
72 | 233 | return BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_exec_string (self); | 233 | return BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_exec_string (self); |
73 | 234 | 234 | ||
74 | 235 | if (self->priv->exec_string) | ||
75 | 236 | return self->priv->exec_string; | ||
76 | 237 | |||
77 | 235 | pid = bamf_legacy_window_get_pid (self); | 238 | pid = bamf_legacy_window_get_pid (self); |
78 | 236 | 239 | ||
79 | 237 | if (pid == 0) | 240 | if (pid == 0) |
80 | @@ -251,9 +254,10 @@ | |||
81 | 251 | 254 | ||
82 | 252 | g_free (argv); | 255 | g_free (argv); |
83 | 253 | 256 | ||
85 | 254 | result = g_strdup (exec->str); | 257 | self->priv->exec_string = g_strdup (exec->str); |
86 | 255 | g_string_free (exec, TRUE); | 258 | g_string_free (exec, TRUE); |
88 | 256 | return result; | 259 | |
89 | 260 | return self->priv->exec_string; | ||
90 | 257 | } | 261 | } |
91 | 258 | 262 | ||
92 | 259 | const char * | 263 | const char * |
93 | @@ -561,7 +565,6 @@ | |||
94 | 561 | 565 | ||
95 | 562 | self = BAMF_LEGACY_WINDOW (object); | 566 | self = BAMF_LEGACY_WINDOW (object); |
96 | 563 | 567 | ||
97 | 564 | |||
98 | 565 | if (self->priv->mini_icon_path) | 568 | if (self->priv->mini_icon_path) |
99 | 566 | { | 569 | { |
100 | 567 | file = g_file_new_for_path (self->priv->mini_icon_path); | 570 | file = g_file_new_for_path (self->priv->mini_icon_path); |
101 | @@ -572,6 +575,12 @@ | |||
102 | 572 | self->priv->mini_icon_path = NULL; | 575 | self->priv->mini_icon_path = NULL; |
103 | 573 | } | 576 | } |
104 | 574 | 577 | ||
105 | 578 | if (self->priv->exec_string) | ||
106 | 579 | { | ||
107 | 580 | g_free (self->priv->exec_string); | ||
108 | 581 | self->priv->exec_string = NULL; | ||
109 | 582 | } | ||
110 | 583 | |||
111 | 575 | g_signal_handlers_disconnect_by_data (wnck_screen_get_default (), self); | 584 | g_signal_handlers_disconnect_by_data (wnck_screen_get_default (), self); |
112 | 576 | 585 | ||
113 | 577 | if (self->priv->legacy_window) | 586 | if (self->priv->legacy_window) |
114 | 578 | 587 | ||
115 | === modified file 'src/bamf-legacy-window.h' | |||
116 | --- src/bamf-legacy-window.h 2013-04-17 00:48:32 +0000 | |||
117 | +++ src/bamf-legacy-window.h 2013-07-25 12:39:27 +0000 | |||
118 | @@ -77,7 +77,7 @@ | |||
119 | 77 | const char * (*get_role) (BamfLegacyWindow *legacy_window); | 77 | const char * (*get_role) (BamfLegacyWindow *legacy_window); |
120 | 78 | const char * (*get_class_name) (BamfLegacyWindow *legacy_window); | 78 | const char * (*get_class_name) (BamfLegacyWindow *legacy_window); |
121 | 79 | const char * (*get_class_instance_name) (BamfLegacyWindow *legacy_window); | 79 | const char * (*get_class_instance_name) (BamfLegacyWindow *legacy_window); |
123 | 80 | char * (*get_exec_string) (BamfLegacyWindow *legacy_window); | 80 | const char * (*get_exec_string) (BamfLegacyWindow *legacy_window); |
124 | 81 | char * (*get_process_name) (BamfLegacyWindow *legacy_window); | 81 | char * (*get_process_name) (BamfLegacyWindow *legacy_window); |
125 | 82 | char * (*get_app_id) (BamfLegacyWindow *legacy_window); | 82 | char * (*get_app_id) (BamfLegacyWindow *legacy_window); |
126 | 83 | char * (*get_unique_bus_name) (BamfLegacyWindow *legacy_window); | 83 | char * (*get_unique_bus_name) (BamfLegacyWindow *legacy_window); |
127 | @@ -149,7 +149,7 @@ | |||
128 | 149 | 149 | ||
129 | 150 | const char * bamf_legacy_window_save_mini_icon (BamfLegacyWindow *self); | 150 | const char * bamf_legacy_window_save_mini_icon (BamfLegacyWindow *self); |
130 | 151 | 151 | ||
132 | 152 | char * bamf_legacy_window_get_exec_string (BamfLegacyWindow *self); | 152 | const char * bamf_legacy_window_get_exec_string (BamfLegacyWindow *self); |
133 | 153 | 153 | ||
134 | 154 | char * bamf_legacy_window_get_process_name (BamfLegacyWindow *self); | 154 | char * bamf_legacy_window_get_process_name (BamfLegacyWindow *self); |
135 | 155 | 155 | ||
136 | 156 | 156 | ||
137 | === modified file 'src/bamf-matcher-private.h' | |||
138 | --- src/bamf-matcher-private.h 2013-03-28 17:22:08 +0000 | |||
139 | +++ src/bamf-matcher-private.h 2013-07-25 12:39:27 +0000 | |||
140 | @@ -51,7 +51,8 @@ | |||
141 | 51 | 51 | ||
142 | 52 | BamfApplication * bamf_matcher_get_application_by_desktop_file (BamfMatcher *self, const char *desktop_file); | 52 | BamfApplication * bamf_matcher_get_application_by_desktop_file (BamfMatcher *self, const char *desktop_file); |
143 | 53 | BamfApplication * bamf_matcher_get_application_by_xid (BamfMatcher *self, guint xid); | 53 | BamfApplication * bamf_matcher_get_application_by_xid (BamfMatcher *self, guint xid); |
144 | 54 | gboolean bamf_matcher_is_valid_process_prefix (BamfMatcher *self, const char *exec); | ||
145 | 54 | char * bamf_matcher_get_trimmed_exec (BamfMatcher *self, const char *exec); | 55 | char * bamf_matcher_get_trimmed_exec (BamfMatcher *self, const char *exec); |
147 | 55 | gboolean bamf_matcher_is_valid_process_prefix (BamfMatcher *self, const char *exec); | 56 | char * get_exec_overridden_desktop_file (const char *exec); |
148 | 56 | 57 | ||
149 | 57 | #endif | 58 | #endif |
150 | 58 | 59 | ||
151 | === modified file 'src/bamf-matcher.c' | |||
152 | --- src/bamf-matcher.c 2013-04-18 14:20:02 +0000 | |||
153 | +++ src/bamf-matcher.c 2013-07-25 12:39:27 +0000 | |||
154 | @@ -57,13 +57,16 @@ | |||
155 | 57 | // Prefixes to be ignored in exec strings | 57 | // Prefixes to be ignored in exec strings |
156 | 58 | const gchar* EXEC_BAD_PREFIXES[] = | 58 | const gchar* EXEC_BAD_PREFIXES[] = |
157 | 59 | { | 59 | { |
159 | 60 | "^gksu(do)?$", "^sudo$", "^su-to-root$", "^amdxdg-su$", "^java(ws)?$", | 60 | "^gksu(do)?$", "^sudo$", "^su-to-root$", "^amdxdg-su$", "^java(ws)?$", "^cli$", |
160 | 61 | "^mono$", "^ruby$", "^padsp$", "^aoss$", "^python(\\d.\\d)?$", "^(ba)?sh$", | 61 | "^mono$", "^ruby$", "^padsp$", "^aoss$", "^python(\\d.\\d)?$", "^(ba)?sh$", |
162 | 62 | "^perl$", "^env$", "^xdg-open$", | 62 | "^perl$", "^env$", "^xdg-open$", "^qmlscene$", "^qmlviewer$", |
163 | 63 | /* javaws strings: */ "^net\\.sourceforge\\.jnlp\\.runtime\\.Boot$", "^rt\\.jar$", | 63 | /* javaws strings: */ "^net\\.sourceforge\\.jnlp\\.runtime\\.Boot$", "^rt\\.jar$", |
164 | 64 | "^com\\.sun\\.javaws\\.Main$", "^deploy\\.jar$" | 64 | "^com\\.sun\\.javaws\\.Main$", "^deploy\\.jar$" |
165 | 65 | }; | 65 | }; |
166 | 66 | 66 | ||
167 | 67 | // Sufixes to be ignored in exec strings | ||
168 | 68 | const gchar* EXEC_BAD_SUFIXES = "(\\.bin|\\.py|\\.pl|\\.qml)$"; | ||
169 | 69 | |||
170 | 67 | // Prefixes that must be considered starting point of exec strings | 70 | // Prefixes that must be considered starting point of exec strings |
171 | 68 | const gchar* EXEC_GOOD_PREFIXES[] = | 71 | const gchar* EXEC_GOOD_PREFIXES[] = |
172 | 69 | { | 72 | { |
173 | @@ -71,6 +74,8 @@ | |||
174 | 71 | "^sol$" | 74 | "^sol$" |
175 | 72 | }; | 75 | }; |
176 | 73 | 76 | ||
177 | 77 | const gchar * EXEC_DESKTOP_FILE_OVERRIDE = "--desktop_file_hint"; | ||
178 | 78 | |||
179 | 74 | static void | 79 | static void |
180 | 75 | on_view_active_changed (BamfView *view, gboolean active, BamfMatcher *matcher) | 80 | on_view_active_changed (BamfView *view, gboolean active, BamfMatcher *matcher) |
181 | 76 | { | 81 | { |
182 | @@ -441,9 +446,16 @@ | |||
183 | 441 | for (i = 0; i < parts_size; ++i) | 446 | for (i = 0; i < parts_size; ++i) |
184 | 442 | { | 447 | { |
185 | 443 | part = parts[i]; | 448 | part = parts[i]; |
187 | 444 | if (*part == '%' || g_utf8_strrchr (part, -1, '=')) | 449 | if (*part == '%' || *part == '$' || g_utf8_strrchr (part, -1, '=')) |
188 | 445 | continue; | 450 | continue; |
189 | 446 | 451 | ||
190 | 452 | if (i+1 < parts_size && g_strcmp0 (parts[i], EXEC_DESKTOP_FILE_OVERRIDE) == 0) | ||
191 | 453 | { | ||
192 | 454 | /* Skip if the .desktop file is overridden using the exec parameter */ | ||
193 | 455 | ++i; | ||
194 | 456 | continue; | ||
195 | 457 | } | ||
196 | 458 | |||
197 | 447 | if (*part != '-' || good_prefix) | 459 | if (*part != '-' || good_prefix) |
198 | 448 | { | 460 | { |
199 | 449 | if (!result) | 461 | if (!result) |
200 | @@ -519,7 +531,7 @@ | |||
201 | 519 | { | 531 | { |
202 | 520 | tmp = result; | 532 | tmp = result; |
203 | 521 | 533 | ||
205 | 522 | regex = g_regex_new ("(\\.bin|\\.py|\\.pl)$", 0, 0, NULL); | 534 | regex = g_regex_new (EXEC_BAD_SUFIXES, 0, 0, NULL); |
206 | 523 | result = g_regex_replace_literal (regex, result, -1, 0, "", 0, NULL); | 535 | result = g_regex_replace_literal (regex, result, -1, 0, "", 0, NULL); |
207 | 524 | 536 | ||
208 | 525 | g_free (tmp); | 537 | g_free (tmp); |
209 | @@ -531,6 +543,37 @@ | |||
210 | 531 | return result; | 543 | return result; |
211 | 532 | } | 544 | } |
212 | 533 | 545 | ||
213 | 546 | char * | ||
214 | 547 | get_exec_overridden_desktop_file (const char *exec_string) | ||
215 | 548 | { | ||
216 | 549 | gchar *result = NULL; | ||
217 | 550 | gchar **parts; | ||
218 | 551 | gint i, parts_size; | ||
219 | 552 | |||
220 | 553 | if (!exec_string || exec_string[0] == '\0') | ||
221 | 554 | return result; | ||
222 | 555 | |||
223 | 556 | if (!g_shell_parse_argv (exec_string, &parts_size, &parts, NULL)) | ||
224 | 557 | return result; | ||
225 | 558 | |||
226 | 559 | for (i = 0; i < parts_size; ++i) | ||
227 | 560 | { | ||
228 | 561 | if (i+1 < parts_size && g_strcmp0 (parts[i], EXEC_DESKTOP_FILE_OVERRIDE) == 0) | ||
229 | 562 | { | ||
230 | 563 | if (g_str_has_suffix (parts[i+1], ".desktop") && | ||
231 | 564 | g_file_test (parts[i+1], G_FILE_TEST_EXISTS|G_FILE_TEST_IS_REGULAR)) | ||
232 | 565 | { | ||
233 | 566 | result = g_strdup (parts[i+1]); | ||
234 | 567 | break; | ||
235 | 568 | } | ||
236 | 569 | } | ||
237 | 570 | } | ||
238 | 571 | |||
239 | 572 | g_strfreev (parts); | ||
240 | 573 | |||
241 | 574 | return result; | ||
242 | 575 | } | ||
243 | 576 | |||
244 | 534 | static GList * | 577 | static GList * |
245 | 535 | pid_parent_tree (BamfMatcher *self, guint pid) | 578 | pid_parent_tree (BamfMatcher *self, guint pid) |
246 | 536 | { | 579 | { |
247 | @@ -1408,7 +1451,7 @@ | |||
248 | 1408 | { | 1451 | { |
249 | 1409 | BamfMatcherPrivate *priv; | 1452 | BamfMatcherPrivate *priv; |
250 | 1410 | GList *result = NULL, *table_list, *l; | 1453 | GList *result = NULL, *table_list, *l; |
252 | 1411 | char *exec_string; | 1454 | const char *exec_string; |
253 | 1412 | char *trimmed; | 1455 | char *trimmed; |
254 | 1413 | 1456 | ||
255 | 1414 | g_return_val_if_fail (BAMF_IS_MATCHER (self), NULL); | 1457 | g_return_val_if_fail (BAMF_IS_MATCHER (self), NULL); |
256 | @@ -1434,7 +1477,6 @@ | |||
257 | 1434 | } | 1477 | } |
258 | 1435 | g_free (trimmed); | 1478 | g_free (trimmed); |
259 | 1436 | } | 1479 | } |
260 | 1437 | g_free (exec_string); | ||
261 | 1438 | } | 1480 | } |
262 | 1439 | 1481 | ||
263 | 1440 | if (result) | 1482 | if (result) |
264 | @@ -1596,18 +1638,18 @@ | |||
265 | 1596 | filter_by_wmclass = bamf_matcher_has_instance_class_desktop_file (self, target_class); | 1638 | filter_by_wmclass = bamf_matcher_has_instance_class_desktop_file (self, target_class); |
266 | 1597 | 1639 | ||
267 | 1598 | if (!filter_by_wmclass) | 1640 | if (!filter_by_wmclass) |
280 | 1599 | { | 1641 | { |
281 | 1600 | if (is_web_app_window (window)) | 1642 | if (is_web_app_window (window)) |
282 | 1601 | { | 1643 | { |
283 | 1602 | // This ensures that a new application is created even for unknown webapps | 1644 | // This ensures that a new application is created even for unknown webapps |
284 | 1603 | filter_by_wmclass = TRUE; | 1645 | filter_by_wmclass = TRUE; |
285 | 1604 | } | 1646 | } |
286 | 1605 | else | 1647 | else |
287 | 1606 | { | 1648 | { |
288 | 1607 | target_class = class_name; | 1649 | target_class = class_name; |
289 | 1608 | filter_by_wmclass = bamf_matcher_has_instance_class_desktop_file (self, target_class); | 1650 | filter_by_wmclass = bamf_matcher_has_instance_class_desktop_file (self, target_class); |
290 | 1609 | } | 1651 | } |
291 | 1610 | } | 1652 | } |
292 | 1611 | 1653 | ||
293 | 1612 | if (desktop_file) | 1654 | if (desktop_file) |
294 | 1613 | { | 1655 | { |
295 | @@ -1622,6 +1664,16 @@ | |||
296 | 1622 | g_free (desktop_file); | 1664 | g_free (desktop_file); |
297 | 1623 | } | 1665 | } |
298 | 1624 | } | 1666 | } |
299 | 1667 | else | ||
300 | 1668 | { | ||
301 | 1669 | const char *exec_string = bamf_legacy_window_get_exec_string (window); | ||
302 | 1670 | desktop_file = get_exec_overridden_desktop_file (exec_string); | ||
303 | 1671 | |||
304 | 1672 | if (desktop_file) | ||
305 | 1673 | { | ||
306 | 1674 | desktop_files = g_list_prepend (desktop_files, desktop_file); | ||
307 | 1675 | } | ||
308 | 1676 | } | ||
309 | 1625 | 1677 | ||
310 | 1626 | desktop_file = NULL; | 1678 | desktop_file = NULL; |
311 | 1627 | 1679 | ||
312 | @@ -1839,60 +1891,62 @@ | |||
313 | 1839 | 1891 | ||
314 | 1840 | const gchar *app_desktop_class; | 1892 | const gchar *app_desktop_class; |
315 | 1841 | 1893 | ||
317 | 1842 | for (a = self->priv->views; a; a = a->next) | 1894 | const char *win_instance_name = bamf_legacy_window_get_class_instance_name (window); |
318 | 1895 | const char *exec_string = bamf_legacy_window_get_exec_string (window); | ||
319 | 1896 | char *trimmed_exec = bamf_matcher_get_trimmed_exec (self, exec_string); | ||
320 | 1897 | |||
321 | 1898 | if (trimmed_exec || win_class_name || win_instance_name) | ||
322 | 1843 | { | 1899 | { |
331 | 1844 | view = a->data; | 1900 | for (a = self->priv->views; a; a = a->next) |
324 | 1845 | |||
325 | 1846 | if (!BAMF_IS_APPLICATION (view)) | ||
326 | 1847 | continue; | ||
327 | 1848 | |||
328 | 1849 | app = BAMF_APPLICATION (view); | ||
329 | 1850 | |||
330 | 1851 | if (bamf_application_contains_similar_to_window (app, bamf_window)) | ||
332 | 1852 | { | 1901 | { |
340 | 1853 | char *exec_string = bamf_legacy_window_get_exec_string (window); | 1902 | view = a->data; |
341 | 1854 | char *trimmed_exec = bamf_matcher_get_trimmed_exec (self, exec_string); | 1903 | |
342 | 1855 | g_free (exec_string); | 1904 | if (!BAMF_IS_APPLICATION (view)) |
343 | 1856 | 1905 | continue; | |
344 | 1857 | GList *ll; | 1906 | |
345 | 1858 | gboolean found_exec = FALSE; | 1907 | app = BAMF_APPLICATION (view); |
346 | 1859 | for (ll = bamf_view_get_children (BAMF_VIEW (app)); ll && !found_exec; ll = ll->next) | 1908 | |
347 | 1909 | if (bamf_application_contains_similar_to_window (app, bamf_window)) | ||
348 | 1860 | { | 1910 | { |
350 | 1861 | if (!BAMF_IS_WINDOW (ll->data)) | 1911 | GList *ll; |
351 | 1912 | gboolean found_exec = FALSE; | ||
352 | 1913 | for (ll = bamf_view_get_children (BAMF_VIEW (app)); ll && !found_exec; ll = ll->next) | ||
353 | 1914 | { | ||
354 | 1915 | if (!BAMF_IS_WINDOW (ll->data)) | ||
355 | 1916 | continue; | ||
356 | 1917 | |||
357 | 1918 | BamfLegacyWindow *w = bamf_window_get_window (BAMF_WINDOW (ll->data)); | ||
358 | 1919 | const char *wexec = bamf_legacy_window_get_exec_string (w); | ||
359 | 1920 | char *wtrimmed = bamf_matcher_get_trimmed_exec (self, wexec); | ||
360 | 1921 | |||
361 | 1922 | if (g_strcmp0 (trimmed_exec, wtrimmed) == 0) | ||
362 | 1923 | { | ||
363 | 1924 | best = BAMF_APPLICATION (view); | ||
364 | 1925 | found_exec = TRUE; | ||
365 | 1926 | } | ||
366 | 1927 | |||
367 | 1928 | g_free (wtrimmed); | ||
368 | 1929 | } | ||
369 | 1930 | |||
370 | 1931 | if (!found_exec) | ||
371 | 1862 | continue; | 1932 | continue; |
372 | 1863 | 1933 | ||
402 | 1864 | BamfLegacyWindow *w = bamf_window_get_window (BAMF_WINDOW (ll->data)); | 1934 | app_desktop_class = bamf_application_get_wmclass (app); |
403 | 1865 | char *wexec = bamf_legacy_window_get_exec_string (w); | 1935 | |
404 | 1866 | char *wtrimmed = bamf_matcher_get_trimmed_exec (self, wexec); | 1936 | if (target_class && g_strcmp0 (target_class, app_desktop_class) == 0) |
405 | 1867 | g_free (wexec); | 1937 | { |
406 | 1868 | 1938 | best = app; | |
407 | 1869 | if (g_strcmp0 (trimmed_exec, wtrimmed) == 0) | 1939 | break; |
408 | 1870 | { | 1940 | } |
409 | 1871 | best = BAMF_APPLICATION (view); | 1941 | else if (!best) |
410 | 1872 | found_exec = TRUE; | 1942 | { |
411 | 1873 | } | 1943 | best = app; |
412 | 1874 | 1944 | } | |
384 | 1875 | g_free (wtrimmed); | ||
385 | 1876 | } | ||
386 | 1877 | |||
387 | 1878 | g_free (trimmed_exec); | ||
388 | 1879 | |||
389 | 1880 | if (!found_exec) | ||
390 | 1881 | continue; | ||
391 | 1882 | |||
392 | 1883 | app_desktop_class = bamf_application_get_wmclass (app); | ||
393 | 1884 | |||
394 | 1885 | if (target_class && g_strcmp0 (target_class, app_desktop_class) == 0) | ||
395 | 1886 | { | ||
396 | 1887 | best = app; | ||
397 | 1888 | break; | ||
398 | 1889 | } | ||
399 | 1890 | else if (!best) | ||
400 | 1891 | { | ||
401 | 1892 | best = app; | ||
413 | 1893 | } | 1945 | } |
414 | 1894 | } | 1946 | } |
415 | 1895 | } | 1947 | } |
416 | 1948 | |||
417 | 1949 | g_free (trimmed_exec); | ||
418 | 1896 | } | 1950 | } |
419 | 1897 | 1951 | ||
420 | 1898 | if (!best) | 1952 | if (!best) |
421 | 1899 | 1953 | ||
422 | === modified file 'tests/bamfdaemon/test-application.c' | |||
423 | --- tests/bamfdaemon/test-application.c 2013-05-30 22:06:14 +0000 | |||
424 | +++ tests/bamfdaemon/test-application.c 2013-07-25 12:39:27 +0000 | |||
425 | @@ -28,46 +28,11 @@ | |||
426 | 28 | 28 | ||
427 | 29 | #define DESKTOP_FILE "/usr/share/applications/gnome-terminal.desktop" | 29 | #define DESKTOP_FILE "/usr/share/applications/gnome-terminal.desktop" |
428 | 30 | 30 | ||
429 | 31 | static void test_allocation (void); | ||
430 | 32 | static void test_desktop_file (void); | ||
431 | 33 | static void test_desktop_no_icon (void); | ||
432 | 34 | static void test_get_mime_types (void); | ||
433 | 35 | static void test_get_mime_types_none (void); | ||
434 | 36 | static void test_urgent (void); | ||
435 | 37 | static void test_active (void); | ||
436 | 38 | static void test_get_xids (void); | ||
437 | 39 | static void test_manages_xid (void); | ||
438 | 40 | static void test_user_visible (void); | ||
439 | 41 | static void test_urgent (void); | ||
440 | 42 | static void test_window_added (void); | ||
441 | 43 | static void test_window_removed (void); | ||
442 | 44 | |||
443 | 45 | static gboolean signal_seen = FALSE; | 31 | static gboolean signal_seen = FALSE; |
444 | 46 | static gboolean signal_result = FALSE; | 32 | static gboolean signal_result = FALSE; |
445 | 47 | static char * signal_window = NULL; | 33 | static char * signal_window = NULL; |
446 | 48 | static GDBusConnection * gdbus_connection = NULL; | 34 | static GDBusConnection * gdbus_connection = NULL; |
447 | 49 | 35 | ||
448 | 50 | void | ||
449 | 51 | test_application_create_suite (GDBusConnection *connection) | ||
450 | 52 | { | ||
451 | 53 | #define DOMAIN "/Application" | ||
452 | 54 | |||
453 | 55 | gdbus_connection = connection; | ||
454 | 56 | |||
455 | 57 | g_test_add_func (DOMAIN"/Allocation", test_allocation); | ||
456 | 58 | g_test_add_func (DOMAIN"/DesktopFile", test_desktop_file); | ||
457 | 59 | g_test_add_func (DOMAIN"/DesktopFile/NoIcon", test_desktop_no_icon); | ||
458 | 60 | g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/Valid", test_get_mime_types); | ||
459 | 61 | g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/None", test_get_mime_types_none); | ||
460 | 62 | g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid); | ||
461 | 63 | g_test_add_func (DOMAIN"/Xids", test_get_xids); | ||
462 | 64 | g_test_add_func (DOMAIN"/Events/Active", test_active); | ||
463 | 65 | g_test_add_func (DOMAIN"/Events/Urgent", test_urgent); | ||
464 | 66 | g_test_add_func (DOMAIN"/Events/UserVisible", test_user_visible); | ||
465 | 67 | g_test_add_func (DOMAIN"/Events/WindowAdded", test_window_added); | ||
466 | 68 | g_test_add_func (DOMAIN"/Events/WindowRemoved", test_window_removed); | ||
467 | 69 | } | ||
468 | 70 | |||
469 | 71 | static void | 36 | static void |
470 | 72 | test_allocation (void) | 37 | test_allocation (void) |
471 | 73 | { | 38 | { |
472 | @@ -536,3 +501,104 @@ | |||
473 | 536 | g_object_unref (window); | 501 | g_object_unref (window); |
474 | 537 | g_object_unref (test); | 502 | g_object_unref (test); |
475 | 538 | } | 503 | } |
476 | 504 | |||
477 | 505 | static void | ||
478 | 506 | test_contain_similar_to_window (void) | ||
479 | 507 | { | ||
480 | 508 | BamfApplication *application; | ||
481 | 509 | BamfLegacyWindowTest *lwin; | ||
482 | 510 | BamfWindow *win, *win1, *win2, *win3; | ||
483 | 511 | |||
484 | 512 | application = bamf_application_new (); | ||
485 | 513 | lwin = bamf_legacy_window_test_new (20, "window", NULL, "binary"); | ||
486 | 514 | bamf_legacy_window_test_set_wmclass (lwin, "ClassName", "ClassInstance"); | ||
487 | 515 | win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
488 | 516 | bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win)); | ||
489 | 517 | g_object_unref (lwin); | ||
490 | 518 | |||
491 | 519 | lwin = bamf_legacy_window_test_new (30, "window1", NULL, "binary1"); | ||
492 | 520 | bamf_legacy_window_test_set_wmclass (lwin, "ClassName", "ClassInstance"); | ||
493 | 521 | win1 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
494 | 522 | g_object_unref (lwin); | ||
495 | 523 | g_assert (bamf_application_contains_similar_to_window (application, win1)); | ||
496 | 524 | |||
497 | 525 | lwin = bamf_legacy_window_test_new (40, "window2", NULL, "binary2"); | ||
498 | 526 | bamf_legacy_window_test_set_wmclass (lwin, "ClassName", "ClassInstance2"); | ||
499 | 527 | win2 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
500 | 528 | g_object_unref (lwin); | ||
501 | 529 | g_assert (!bamf_application_contains_similar_to_window (application, win2)); | ||
502 | 530 | |||
503 | 531 | lwin = bamf_legacy_window_test_new (50, "window3", NULL, "binary3"); | ||
504 | 532 | bamf_legacy_window_test_set_wmclass (lwin, "ClassName3", "ClassInstance"); | ||
505 | 533 | win3 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
506 | 534 | g_object_unref (lwin); | ||
507 | 535 | g_assert (!bamf_application_contains_similar_to_window (application, win3)); | ||
508 | 536 | |||
509 | 537 | g_object_unref (win); | ||
510 | 538 | g_object_unref (win1); | ||
511 | 539 | g_object_unref (win2); | ||
512 | 540 | g_object_unref (win3); | ||
513 | 541 | g_object_unref (application); | ||
514 | 542 | } | ||
515 | 543 | |||
516 | 544 | static void | ||
517 | 545 | test_contain_similar_to_window_null (void) | ||
518 | 546 | { | ||
519 | 547 | BamfApplication *application; | ||
520 | 548 | BamfLegacyWindowTest *lwin; | ||
521 | 549 | BamfWindow *win, *win1, *win2, *win3; | ||
522 | 550 | |||
523 | 551 | application = bamf_application_new (); | ||
524 | 552 | lwin = bamf_legacy_window_test_new (20, "window", NULL, "binary"); | ||
525 | 553 | bamf_legacy_window_test_set_wmclass (lwin, NULL, NULL); | ||
526 | 554 | win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
527 | 555 | bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win)); | ||
528 | 556 | g_object_unref (lwin); | ||
529 | 557 | |||
530 | 558 | lwin = bamf_legacy_window_test_new (30, "window1", NULL, "binary1"); | ||
531 | 559 | bamf_legacy_window_test_set_wmclass (lwin, NULL, NULL); | ||
532 | 560 | win1 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
533 | 561 | g_object_unref (lwin); | ||
534 | 562 | g_assert (bamf_application_contains_similar_to_window (application, win1)); | ||
535 | 563 | |||
536 | 564 | lwin = bamf_legacy_window_test_new (40, "window2", NULL, "binary2"); | ||
537 | 565 | bamf_legacy_window_test_set_wmclass (lwin, "ClassName", NULL); | ||
538 | 566 | win2 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
539 | 567 | g_object_unref (lwin); | ||
540 | 568 | g_assert (!bamf_application_contains_similar_to_window (application, win2)); | ||
541 | 569 | |||
542 | 570 | lwin = bamf_legacy_window_test_new (50, "window3", NULL, "binary3"); | ||
543 | 571 | bamf_legacy_window_test_set_wmclass (lwin, NULL, "ClassInstance"); | ||
544 | 572 | win3 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin)); | ||
545 | 573 | g_object_unref (lwin); | ||
546 | 574 | g_assert (!bamf_application_contains_similar_to_window (application, win3)); | ||
547 | 575 | |||
548 | 576 | g_object_unref (win); | ||
549 | 577 | g_object_unref (win1); | ||
550 | 578 | g_object_unref (win2); | ||
551 | 579 | g_object_unref (win3); | ||
552 | 580 | g_object_unref (application); | ||
553 | 581 | } | ||
554 | 582 | |||
555 | 583 | void | ||
556 | 584 | test_application_create_suite (GDBusConnection *connection) | ||
557 | 585 | { | ||
558 | 586 | #define DOMAIN "/Application" | ||
559 | 587 | |||
560 | 588 | gdbus_connection = connection; | ||
561 | 589 | |||
562 | 590 | g_test_add_func (DOMAIN"/Allocation", test_allocation); | ||
563 | 591 | g_test_add_func (DOMAIN"/ContainsSimilarToWindow", test_contain_similar_to_window); | ||
564 | 592 | g_test_add_func (DOMAIN"/ContainsSimilarToWindow/Null", test_contain_similar_to_window_null); | ||
565 | 593 | g_test_add_func (DOMAIN"/DesktopFile", test_desktop_file); | ||
566 | 594 | g_test_add_func (DOMAIN"/DesktopFile/NoIcon", test_desktop_no_icon); | ||
567 | 595 | g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/Valid", test_get_mime_types); | ||
568 | 596 | g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/None", test_get_mime_types_none); | ||
569 | 597 | g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid); | ||
570 | 598 | g_test_add_func (DOMAIN"/Xids", test_get_xids); | ||
571 | 599 | g_test_add_func (DOMAIN"/Events/Active", test_active); | ||
572 | 600 | g_test_add_func (DOMAIN"/Events/Urgent", test_urgent); | ||
573 | 601 | g_test_add_func (DOMAIN"/Events/UserVisible", test_user_visible); | ||
574 | 602 | g_test_add_func (DOMAIN"/Events/WindowAdded", test_window_added); | ||
575 | 603 | g_test_add_func (DOMAIN"/Events/WindowRemoved", test_window_removed); | ||
576 | 604 | } | ||
577 | 539 | 605 | ||
578 | === modified file 'tests/bamfdaemon/test-matcher.c' | |||
579 | --- tests/bamfdaemon/test-matcher.c 2013-05-24 17:11:00 +0000 | |||
580 | +++ tests/bamfdaemon/test-matcher.c 2013-07-25 12:39:27 +0000 | |||
581 | @@ -26,50 +26,12 @@ | |||
582 | 26 | #include "bamf-legacy-window.h" | 26 | #include "bamf-legacy-window.h" |
583 | 27 | #include "bamf-legacy-window-test.h" | 27 | #include "bamf-legacy-window-test.h" |
584 | 28 | 28 | ||
585 | 29 | static void test_allocation (void); | ||
586 | 30 | static void test_load_desktop_file (void); | ||
587 | 31 | static void test_load_desktop_file_no_display_has_lower_prio_same_id (void); | ||
588 | 32 | static void test_load_desktop_file_no_display_has_lower_prio_different_id (void); | ||
589 | 33 | static void test_open_windows (void); | ||
590 | 34 | static void test_match_desktopless_application (void); | ||
591 | 35 | static void test_match_desktop_application (void); | ||
592 | 36 | static void test_match_libreoffice_windows (void); | ||
593 | 37 | static void test_match_gnome_control_center_panels (void); | ||
594 | 38 | static void test_match_javaws_windows (void); | ||
595 | 39 | static void test_match_javaws_windows_hint_ignored (void); | ||
596 | 40 | static void test_match_javaws_windows_no_desktop_match (void); | ||
597 | 41 | static void test_new_desktop_matches_unmatched_windows (void); | ||
598 | 42 | static void test_match_transient_windows (void); | ||
599 | 43 | static void test_trim_exec_string (void); | ||
600 | 44 | |||
601 | 45 | static GDBusConnection *gdbus_connection = NULL; | 29 | static GDBusConnection *gdbus_connection = NULL; |
602 | 46 | 30 | ||
603 | 47 | #define DOMAIN "/Matcher" | 31 | #define DOMAIN "/Matcher" |
604 | 48 | #define DATA_DIR TESTDIR "/data" | 32 | #define DATA_DIR TESTDIR "/data" |
605 | 49 | #define TEST_BAMF_APP_DESKTOP DATA_DIR "/test-bamf-app.desktop" | 33 | #define TEST_BAMF_APP_DESKTOP DATA_DIR "/test-bamf-app.desktop" |
606 | 50 | 34 | ||
607 | 51 | void | ||
608 | 52 | test_matcher_create_suite (GDBusConnection *connection) | ||
609 | 53 | { | ||
610 | 54 | gdbus_connection = connection; | ||
611 | 55 | |||
612 | 56 | g_test_add_func (DOMAIN"/Allocation", test_allocation); | ||
613 | 57 | g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file); | ||
614 | 58 | g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/SameID", test_load_desktop_file_no_display_has_lower_prio_same_id); | ||
615 | 59 | g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/DifferentID", test_load_desktop_file_no_display_has_lower_prio_different_id); | ||
616 | 60 | g_test_add_func (DOMAIN"/OpenWindows", test_open_windows); | ||
617 | 61 | g_test_add_func (DOMAIN"/Matching/Application/DesktopLess", test_match_desktopless_application); | ||
618 | 62 | g_test_add_func (DOMAIN"/Matching/Application/Desktop", test_match_desktop_application); | ||
619 | 63 | g_test_add_func (DOMAIN"/Matching/Application/LibreOffice", test_match_libreoffice_windows); | ||
620 | 64 | g_test_add_func (DOMAIN"/Matching/Application/GnomeControlCenter", test_match_gnome_control_center_panels); | ||
621 | 65 | g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart", test_match_javaws_windows); | ||
622 | 66 | g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart/HintIngored", test_match_javaws_windows_hint_ignored); | ||
623 | 67 | g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart/NoDesktopMatch", test_match_javaws_windows_no_desktop_match); | ||
624 | 68 | g_test_add_func (DOMAIN"/Matching/Windows/UnmatchedOnNewDesktop", test_new_desktop_matches_unmatched_windows); | ||
625 | 69 | g_test_add_func (DOMAIN"/Matching/Windows/Transient", test_match_transient_windows); | ||
626 | 70 | g_test_add_func (DOMAIN"/ExecStringTrimming", test_trim_exec_string); | ||
627 | 71 | } | ||
628 | 72 | |||
629 | 73 | static void | 35 | static void |
630 | 74 | export_matcher_on_bus (BamfMatcher *matcher) | 36 | export_matcher_on_bus (BamfMatcher *matcher) |
631 | 75 | { | 37 | { |
632 | @@ -771,6 +733,191 @@ | |||
633 | 771 | } | 733 | } |
634 | 772 | 734 | ||
635 | 773 | static void | 735 | static void |
636 | 736 | test_match_qml_app_no_desktop (void) | ||
637 | 737 | { | ||
638 | 738 | BamfMatcher *matcher; | ||
639 | 739 | BamfLegacyScreen *screen; | ||
640 | 740 | BamfLegacyWindowTest *test_win; | ||
641 | 741 | BamfApplication *app1, *app2, *app3; | ||
642 | 742 | |||
643 | 743 | screen = bamf_legacy_screen_get_default (); | ||
644 | 744 | matcher = bamf_matcher_get_default (); | ||
645 | 745 | cleanup_matcher_tables (matcher); | ||
646 | 746 | export_matcher_on_bus (matcher); | ||
647 | 747 | |||
648 | 748 | guint xid = g_random_int (); | ||
649 | 749 | test_win = bamf_legacy_window_test_new (xid, "QmlApp1", NULL, "qmlscene qmlapp1.qml"); | ||
650 | 750 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
651 | 751 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
652 | 752 | |||
653 | 753 | app1 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
654 | 754 | g_assert (BAMF_IS_APPLICATION (app1)); | ||
655 | 755 | |||
656 | 756 | xid = g_random_int (); | ||
657 | 757 | test_win = bamf_legacy_window_test_new (xid, "QmlApp2", NULL, "qmlscene qmlapp2.qml"); | ||
658 | 758 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
659 | 759 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
660 | 760 | |||
661 | 761 | app2 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
662 | 762 | g_assert (BAMF_IS_APPLICATION (app2)); | ||
663 | 763 | g_assert (app1 != app2); | ||
664 | 764 | |||
665 | 765 | xid = g_random_int (); | ||
666 | 766 | test_win = bamf_legacy_window_test_new (xid, "QmlApp2", NULL, "qmlscene qmlapp2.qml"); | ||
667 | 767 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
668 | 768 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
669 | 769 | |||
670 | 770 | app3 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
671 | 771 | g_assert (BAMF_IS_APPLICATION (app3)); | ||
672 | 772 | g_assert (app2 == app3); | ||
673 | 773 | |||
674 | 774 | g_object_unref (matcher); | ||
675 | 775 | g_object_unref (screen); | ||
676 | 776 | } | ||
677 | 777 | |||
678 | 778 | static void | ||
679 | 779 | test_match_qml_app_desktop (void) | ||
680 | 780 | { | ||
681 | 781 | BamfMatcher *matcher; | ||
682 | 782 | BamfLegacyScreen *screen; | ||
683 | 783 | BamfLegacyWindowTest *test_win; | ||
684 | 784 | BamfApplication *app1, *app2, *app3; | ||
685 | 785 | |||
686 | 786 | screen = bamf_legacy_screen_get_default (); | ||
687 | 787 | matcher = bamf_matcher_get_default (); | ||
688 | 788 | cleanup_matcher_tables (matcher); | ||
689 | 789 | export_matcher_on_bus (matcher); | ||
690 | 790 | |||
691 | 791 | bamf_matcher_load_desktop_file (matcher, DATA_DIR"/bamf-qml-app.desktop"); | ||
692 | 792 | |||
693 | 793 | guint xid = g_random_int (); | ||
694 | 794 | test_win = bamf_legacy_window_test_new (xid, "QmlAppWin1", NULL, "/path/qmlscene bamf_qml_app.qml"); | ||
695 | 795 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
696 | 796 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
697 | 797 | |||
698 | 798 | app1 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
699 | 799 | g_assert (BAMF_IS_APPLICATION (app1)); | ||
700 | 800 | g_assert_cmpstr (bamf_application_get_desktop_file (app1), ==, DATA_DIR"/bamf-qml-app.desktop"); | ||
701 | 801 | |||
702 | 802 | xid = g_random_int (); | ||
703 | 803 | test_win = bamf_legacy_window_test_new (xid, "QmlAppWin1", NULL, "qmlscene files/foo/bamf_qml_app.qml"); | ||
704 | 804 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
705 | 805 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
706 | 806 | |||
707 | 807 | app2 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
708 | 808 | g_assert (BAMF_IS_APPLICATION (app2)); | ||
709 | 809 | g_assert (app1 == app2); | ||
710 | 810 | |||
711 | 811 | xid = g_random_int (); | ||
712 | 812 | test_win = bamf_legacy_window_test_new (xid, "QmlApp2", NULL, "qmlscene qmlapp2.qml"); | ||
713 | 813 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
714 | 814 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
715 | 815 | |||
716 | 816 | app3 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
717 | 817 | g_assert (BAMF_IS_APPLICATION (app3)); | ||
718 | 818 | g_assert (app2 != app3); | ||
719 | 819 | |||
720 | 820 | g_object_unref (matcher); | ||
721 | 821 | g_object_unref (screen); | ||
722 | 822 | } | ||
723 | 823 | |||
724 | 824 | static void | ||
725 | 825 | test_match_desktop_file_hint_exec (void) | ||
726 | 826 | { | ||
727 | 827 | BamfMatcher *matcher; | ||
728 | 828 | BamfLegacyScreen *screen; | ||
729 | 829 | BamfLegacyWindowTest *test_win; | ||
730 | 830 | BamfApplication *app1, *app2, *app3; | ||
731 | 831 | |||
732 | 832 | screen = bamf_legacy_screen_get_default (); | ||
733 | 833 | matcher = bamf_matcher_get_default (); | ||
734 | 834 | cleanup_matcher_tables (matcher); | ||
735 | 835 | export_matcher_on_bus (matcher); | ||
736 | 836 | |||
737 | 837 | bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP); | ||
738 | 838 | |||
739 | 839 | guint xid = g_random_int (); | ||
740 | 840 | const gchar *exec = "/path/qmlscene --desktop_file_hint "TEST_BAMF_APP_DESKTOP" test-qml-app1.qml"; | ||
741 | 841 | test_win = bamf_legacy_window_test_new (xid, "QmlAppWin1", NULL, exec); | ||
742 | 842 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
743 | 843 | |||
744 | 844 | app1 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
745 | 845 | g_assert_cmpstr (bamf_application_get_desktop_file (app1), ==, TEST_BAMF_APP_DESKTOP); | ||
746 | 846 | _bamf_legacy_screen_close_test_window (screen, test_win); | ||
747 | 847 | |||
748 | 848 | xid = g_random_int (); | ||
749 | 849 | exec = "/path/qmlscene test-qml-app2.qml --desktop_file_hint "TEST_BAMF_APP_DESKTOP; | ||
750 | 850 | test_win = bamf_legacy_window_test_new (xid, "QmlAppWin2", NULL, exec); | ||
751 | 851 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
752 | 852 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
753 | 853 | |||
754 | 854 | app2 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
755 | 855 | g_assert_cmpstr (bamf_application_get_desktop_file (app2), ==, TEST_BAMF_APP_DESKTOP); | ||
756 | 856 | _bamf_legacy_screen_close_test_window (screen, test_win); | ||
757 | 857 | |||
758 | 858 | xid = g_random_int (); | ||
759 | 859 | exec = "test-bamf-app --desktop_file_hint "TEST_BAMF_APP_DESKTOP; | ||
760 | 860 | test_win = bamf_legacy_window_test_new (xid, "AnyAppWin1", NULL, exec); | ||
761 | 861 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
762 | 862 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
763 | 863 | |||
764 | 864 | app3 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
765 | 865 | g_assert_cmpstr (bamf_application_get_desktop_file (app3), ==, TEST_BAMF_APP_DESKTOP); | ||
766 | 866 | |||
767 | 867 | g_object_unref (matcher); | ||
768 | 868 | g_object_unref (screen); | ||
769 | 869 | } | ||
770 | 870 | |||
771 | 871 | static void | ||
772 | 872 | test_match_desktop_file_hint_exec_invalid (void) | ||
773 | 873 | { | ||
774 | 874 | BamfMatcher *matcher; | ||
775 | 875 | BamfLegacyScreen *screen; | ||
776 | 876 | BamfLegacyWindowTest *test_win; | ||
777 | 877 | BamfApplication *app1, *app2, *app3; | ||
778 | 878 | |||
779 | 879 | screen = bamf_legacy_screen_get_default (); | ||
780 | 880 | matcher = bamf_matcher_get_default (); | ||
781 | 881 | cleanup_matcher_tables (matcher); | ||
782 | 882 | export_matcher_on_bus (matcher); | ||
783 | 883 | |||
784 | 884 | bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP); | ||
785 | 885 | |||
786 | 886 | guint xid = g_random_int (); | ||
787 | 887 | const gchar *exec = "/path/qmlscene --desktop_file_hint invalid-file.desktop test-qml-app1.qml"; | ||
788 | 888 | test_win = bamf_legacy_window_test_new (xid, "QmlAppWin1", NULL, exec); | ||
789 | 889 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
790 | 890 | |||
791 | 891 | app1 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
792 | 892 | g_assert_cmpstr (bamf_application_get_desktop_file (app1), ==, NULL); | ||
793 | 893 | |||
794 | 894 | xid = g_random_int (); | ||
795 | 895 | exec = "/path/qmlscene test-qml-app2.qml --desktop_file_hint "TEST_BAMF_APP_DESKTOP"s"; | ||
796 | 896 | test_win = bamf_legacy_window_test_new (xid, "QmlAppWin2", NULL, exec); | ||
797 | 897 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
798 | 898 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
799 | 899 | |||
800 | 900 | app2 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
801 | 901 | g_assert_cmpstr (bamf_application_get_desktop_file (app2), ==, NULL); | ||
802 | 902 | g_assert (app2 != app1); | ||
803 | 903 | _bamf_legacy_screen_close_test_window (screen, test_win); | ||
804 | 904 | |||
805 | 905 | xid = g_random_int (); | ||
806 | 906 | exec = "test-bamf-app --desktop_file_hint invalid-file"; | ||
807 | 907 | test_win = bamf_legacy_window_test_new (xid, "AnyAppWin1", NULL, exec); | ||
808 | 908 | bamf_legacy_window_test_set_wmclass (test_win, NULL, NULL); | ||
809 | 909 | _bamf_legacy_screen_open_test_window (screen, test_win); | ||
810 | 910 | |||
811 | 911 | app3 = bamf_matcher_get_application_by_xid (matcher, xid); | ||
812 | 912 | g_assert_cmpstr (bamf_application_get_desktop_file (app3), ==, TEST_BAMF_APP_DESKTOP); | ||
813 | 913 | g_assert (app3 != app1); | ||
814 | 914 | g_assert (app3 != app2); | ||
815 | 915 | |||
816 | 916 | g_object_unref (matcher); | ||
817 | 917 | g_object_unref (screen); | ||
818 | 918 | } | ||
819 | 919 | |||
820 | 920 | static void | ||
821 | 774 | test_match_transient_windows (void) | 921 | test_match_transient_windows (void) |
822 | 775 | { | 922 | { |
823 | 776 | BamfMatcher *matcher; | 923 | BamfMatcher *matcher; |
824 | @@ -830,6 +977,10 @@ | |||
825 | 830 | g_assert_cmpstr (trimmed, ==, "bad-prefix-bin"); | 977 | g_assert_cmpstr (trimmed, ==, "bad-prefix-bin"); |
826 | 831 | g_free (trimmed); | 978 | g_free (trimmed); |
827 | 832 | 979 | ||
828 | 980 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "gksu python very-bad-prefix-script.py"); | ||
829 | 981 | g_assert_cmpstr (trimmed, ==, "very-bad-prefix-script"); | ||
830 | 982 | g_free (trimmed); | ||
831 | 983 | |||
832 | 833 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "sudo --opt val=X /usr/bin/bad-prefix-bin"); | 984 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "sudo --opt val=X /usr/bin/bad-prefix-bin"); |
833 | 834 | g_assert_cmpstr (trimmed, ==, "bad-prefix-bin"); | 985 | g_assert_cmpstr (trimmed, ==, "bad-prefix-bin"); |
834 | 835 | g_free (trimmed); | 986 | g_free (trimmed); |
835 | @@ -846,6 +997,22 @@ | |||
836 | 846 | g_assert_cmpstr (trimmed, ==, "python"); | 997 | g_assert_cmpstr (trimmed, ==, "python"); |
837 | 847 | g_free (trimmed); | 998 | g_free (trimmed); |
838 | 848 | 999 | ||
839 | 1000 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "/usr/bin/mono /usr/share/bar/Foo.exe"); | ||
840 | 1001 | g_assert_cmpstr (trimmed, ==, "foo.exe"); | ||
841 | 1002 | g_free (trimmed); | ||
842 | 1003 | |||
843 | 1004 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "/usr/bin/mono %u --option val=/path"); | ||
844 | 1005 | g_assert_cmpstr (trimmed, ==, "mono"); | ||
845 | 1006 | g_free (trimmed); | ||
846 | 1007 | |||
847 | 1008 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "/usr/bin/cli /usr/share/foo/Bar.exe"); | ||
848 | 1009 | g_assert_cmpstr (trimmed, ==, "bar.exe"); | ||
849 | 1010 | g_free (trimmed); | ||
850 | 1011 | |||
851 | 1012 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "/usr/bin/cli %u --option val=/path"); | ||
852 | 1013 | g_assert_cmpstr (trimmed, ==, "cli"); | ||
853 | 1014 | g_free (trimmed); | ||
854 | 1015 | |||
855 | 849 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "sh -c \"binary --option --value %U || exec binary\""); | 1016 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "sh -c \"binary --option --value %U || exec binary\""); |
856 | 850 | g_assert_cmpstr (trimmed, ==, "binary"); | 1017 | g_assert_cmpstr (trimmed, ==, "binary"); |
857 | 851 | g_free (trimmed); | 1018 | g_free (trimmed); |
858 | @@ -872,6 +1039,34 @@ | |||
859 | 872 | g_assert_cmpstr (trimmed, ==, "myprog"); | 1039 | g_assert_cmpstr (trimmed, ==, "myprog"); |
860 | 873 | g_free (trimmed); | 1040 | g_free (trimmed); |
861 | 874 | 1041 | ||
862 | 1042 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "/usr/bin/qmlscene my-app.qml"); | ||
863 | 1043 | g_assert_cmpstr (trimmed, ==, "my-app"); | ||
864 | 1044 | g_free (trimmed); | ||
865 | 1045 | |||
866 | 1046 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "qmlscene /home/user/new-app.qml"); | ||
867 | 1047 | g_assert_cmpstr (trimmed, ==, "new-app"); | ||
868 | 1048 | g_free (trimmed); | ||
869 | 1049 | |||
870 | 1050 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "qmlscene $var /home/user/var-new-app.qml"); | ||
871 | 1051 | g_assert_cmpstr (trimmed, ==, "var-new-app"); | ||
872 | 1052 | g_free (trimmed); | ||
873 | 1053 | |||
874 | 1054 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "qmlscene --option -foo /home/user/opt-app.qml"); | ||
875 | 1055 | g_assert_cmpstr (trimmed, ==, "opt-app"); | ||
876 | 1056 | g_free (trimmed); | ||
877 | 1057 | |||
878 | 1058 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "qmlscene --desktop_file_hint deskapp.desktop desktop-app1.qml"); | ||
879 | 1059 | g_assert_cmpstr (trimmed, ==, "desktop-app1"); | ||
880 | 1060 | g_free (trimmed); | ||
881 | 1061 | |||
882 | 1062 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "qmlscene desktop-app2.qml --desktop_file_hint deskapp.desktop"); | ||
883 | 1063 | g_assert_cmpstr (trimmed, ==, "desktop-app2"); | ||
884 | 1064 | g_free (trimmed); | ||
885 | 1065 | |||
886 | 1066 | trimmed = bamf_matcher_get_trimmed_exec (matcher, "qmlscene desktop-app3.qml --desktop_file_hint"); | ||
887 | 1067 | g_assert_cmpstr (trimmed, ==, "desktop-app3"); | ||
888 | 1068 | g_free (trimmed); | ||
889 | 1069 | |||
890 | 875 | const char *exec = "/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java " \ | 1070 | const char *exec = "/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java " \ |
891 | 876 | "-Xbootclasspath/a:/usr/share/icedtea-web/netx.jar " \ | 1071 | "-Xbootclasspath/a:/usr/share/icedtea-web/netx.jar " \ |
892 | 877 | "-Xms8m -Djava.security.manager " \ | 1072 | "-Xms8m -Djava.security.manager " \ |
893 | @@ -899,3 +1094,29 @@ | |||
894 | 899 | 1094 | ||
895 | 900 | g_object_unref (matcher); | 1095 | g_object_unref (matcher); |
896 | 901 | } | 1096 | } |
897 | 1097 | |||
898 | 1098 | void | ||
899 | 1099 | test_matcher_create_suite (GDBusConnection *connection) | ||
900 | 1100 | { | ||
901 | 1101 | gdbus_connection = connection; | ||
902 | 1102 | |||
903 | 1103 | g_test_add_func (DOMAIN"/Allocation", test_allocation); | ||
904 | 1104 | g_test_add_func (DOMAIN"/ExecStringTrimming", test_trim_exec_string); | ||
905 | 1105 | g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file); | ||
906 | 1106 | g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/SameID", test_load_desktop_file_no_display_has_lower_prio_same_id); | ||
907 | 1107 | g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/DifferentID", test_load_desktop_file_no_display_has_lower_prio_different_id); | ||
908 | 1108 | g_test_add_func (DOMAIN"/OpenWindows", test_open_windows); | ||
909 | 1109 | g_test_add_func (DOMAIN"/Matching/Application/Desktop", test_match_desktop_application); | ||
910 | 1110 | g_test_add_func (DOMAIN"/Matching/Application/DesktopLess", test_match_desktopless_application); | ||
911 | 1111 | g_test_add_func (DOMAIN"/Matching/Application/DesktopFileHintExec", test_match_desktop_file_hint_exec); | ||
912 | 1112 | g_test_add_func (DOMAIN"/Matching/Application/DesktopFileHintExec/Invalid", test_match_desktop_file_hint_exec_invalid); | ||
913 | 1113 | g_test_add_func (DOMAIN"/Matching/Application/LibreOffice", test_match_libreoffice_windows); | ||
914 | 1114 | g_test_add_func (DOMAIN"/Matching/Application/GnomeControlCenter", test_match_gnome_control_center_panels); | ||
915 | 1115 | g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart", test_match_javaws_windows); | ||
916 | 1116 | g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart/HintIngored", test_match_javaws_windows_hint_ignored); | ||
917 | 1117 | g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart/NoDesktopMatch", test_match_javaws_windows_no_desktop_match); | ||
918 | 1118 | g_test_add_func (DOMAIN"/Matching/Application/Qml/NoDesktopMatch", test_match_qml_app_no_desktop); | ||
919 | 1119 | g_test_add_func (DOMAIN"/Matching/Application/Qml/DesktopMatch", test_match_qml_app_desktop); | ||
920 | 1120 | g_test_add_func (DOMAIN"/Matching/Windows/UnmatchedOnNewDesktop", test_new_desktop_matches_unmatched_windows); | ||
921 | 1121 | g_test_add_func (DOMAIN"/Matching/Windows/Transient", test_match_transient_windows); | ||
922 | 1122 | } | ||
923 | 902 | 1123 | ||
924 | === added file 'tests/data/bamf-qml-app.desktop' | |||
925 | --- tests/data/bamf-qml-app.desktop 1970-01-01 00:00:00 +0000 | |||
926 | +++ tests/data/bamf-qml-app.desktop 2013-07-25 12:39:27 +0000 | |||
927 | @@ -0,0 +1,8 @@ | |||
928 | 1 | [Desktop Entry] | ||
929 | 2 | Name=Bamf Qml APP | ||
930 | 3 | Exec=qmlscene bamf_qml_app.qml | ||
931 | 4 | Icon=bamf-qml-icon | ||
932 | 5 | Terminal=false | ||
933 | 6 | Type=Application | ||
934 | 7 | StartupNotify=true | ||
935 | 8 | OnlyShowIn=GNOME;Unity; | ||
936 | 0 | 9 | ||
937 | === added file 'tests/data/bin/qmlscene' |
Looks like a straight forward backport. +1