Merge lp:~3v1n0/bamf/safe-win-reopen-on-new-desktop into lp:bamf/0.4

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Michal Hruby
Approved revision: 502
Merged at revision: 476
Proposed branch: lp:~3v1n0/bamf/safe-win-reopen-on-new-desktop
Merge into: lp:bamf/0.4
Diff against target: 1107 lines (+634/-109)
13 files modified
src/bamf-application.c (+1/-1)
src/bamf-legacy-screen-private.h (+29/-0)
src/bamf-legacy-screen.c (+69/-18)
src/bamf-legacy-window-test.c (+95/-14)
src/bamf-legacy-window-test.h (+8/-2)
src/bamf-legacy-window.c (+15/-5)
src/bamf-legacy-window.h (+6/-4)
src/bamf-matcher-private.h (+50/-0)
src/bamf-matcher.c (+59/-53)
src/bamf-window.c (+1/-1)
tests/bamfdaemon/data/test-bamf-app.desktop (+7/-0)
tests/bamfdaemon/test-bamf.c (+2/-2)
tests/bamfdaemon/test-matcher.c (+292/-9)
To merge this branch: bzr merge lp:~3v1n0/bamf/safe-win-reopen-on-new-desktop
Reviewer Review Type Date Requested Status
Michal Hruby (community) Approve
Review via email: mp+117177@code.launchpad.net

Commit message

BamfMatcher: don't reopen windows when iterating on view's list, add tests

Description of the change

Fixed a crash that happened on reopening bamf windows when a new desktop file is added to a monitored folder, LegacyWindow and LegacyScreen slightly refactored and improved to allow matcher testing.

Added first real unit tests for the matcher.

To post a comment you must log in.
500. By Marco Trevisan (Treviño)

test-matcher: fix data_dir path

501. By Marco Trevisan (Treviño)

BamfLegacyScreen: avoid close event duplication

Revision history for this message
Michal Hruby (mhr3) wrote :

243 g_signal_emit_by_name (self, "closed");
244 + self->is_closed = TRUE;

Shouldn't the is_closed be set before emitting the signal? That way calling the .is_closed method will return proper value even inside the handler.

Revision history for this message
Marco Trevisan (Treviño) (3v1n0) wrote :

Yes, true.

502. By Marco Trevisan (Treviño)

BamfLegacyWindowTest: set the window as closed before emitting the signal

Revision history for this message
Michal Hruby (mhr3) wrote :

Looks fine, tests pass here...

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/bamf-application.c'
--- src/bamf-application.c 2012-07-17 19:03:36 +0000
+++ src/bamf-application.c 2012-07-31 15:13:24 +0000
@@ -322,7 +322,7 @@
322 const char *window_class = bamf_legacy_window_get_class_name (window);322 const char *window_class = bamf_legacy_window_get_class_name (window);
323 const char *instance_name = bamf_legacy_window_get_class_instance_name (window);323 const char *instance_name = bamf_legacy_window_get_class_instance_name (window);
324324
325 if (!window_class || !instance_name)325 if (!window_class && !instance_name)
326 return FALSE;326 return FALSE;
327327
328 children = bamf_view_get_children (BAMF_VIEW (self));328 children = bamf_view_get_children (BAMF_VIEW (self));
329329
=== added file 'src/bamf-legacy-screen-private.h'
--- src/bamf-legacy-screen-private.h 1970-01-01 00:00:00 +0000
+++ src/bamf-legacy-screen-private.h 2012-07-31 15:13:24 +0000
@@ -0,0 +1,29 @@
1/*
2 * Copyright (C) 2012 Canonical Ltd
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Marco Trevisan (Treviño) <marco.trevisan@canonical.com>
17 *
18 */
19
20#ifndef __BAMF_LEGACY_SCREEN_PRIVATE_H__
21#define __BAMF_LEGACY_SCREEN_PRIVATE_H__
22
23#include "bamf-legacy-screen.h"
24#include "bamf-legacy-window-test.h"
25
26void _bamf_legacy_screen_open_test_window (BamfLegacyScreen *self, BamfLegacyWindowTest *window);
27void _bamf_legacy_screen_close_test_window (BamfLegacyScreen *self, BamfLegacyWindowTest *window);
28
29#endif
030
=== modified file 'src/bamf-legacy-screen.c'
--- src/bamf-legacy-screen.c 2012-01-10 17:48:03 +0000
+++ src/bamf-legacy-screen.c 2012-07-31 15:13:24 +0000
@@ -18,13 +18,15 @@
18 */18 */
1919
20#include "bamf-legacy-screen.h"20#include "bamf-legacy-screen.h"
21#include "bamf-legacy-window-test.h"21#include "bamf-legacy-screen-private.h"
22#include <gio/gio.h>22#include <gio/gio.h>
2323
24G_DEFINE_TYPE (BamfLegacyScreen, bamf_legacy_screen, G_TYPE_OBJECT);24G_DEFINE_TYPE (BamfLegacyScreen, bamf_legacy_screen, G_TYPE_OBJECT);
25#define BAMF_LEGACY_SCREEN_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \25#define BAMF_LEGACY_SCREEN_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \
26BAMF_TYPE_LEGACY_SCREEN, BamfLegacyScreenPrivate))26BAMF_TYPE_LEGACY_SCREEN, BamfLegacyScreenPrivate))
2727
28static BamfLegacyScreen *static_screen = NULL;
29
28enum30enum
29{31{
30 WINDOW_OPENED,32 WINDOW_OPENED,
@@ -100,14 +102,8 @@
100 class = parts[3];102 class = parts[3];
101 exec = parts[4];103 exec = parts[4];
102104
103 window = BAMF_LEGACY_WINDOW (bamf_legacy_window_test_new (xid, name, class, exec));105 BamfLegacyWindowTest *test_win = bamf_legacy_window_test_new (xid, name, class, exec);
104 self->priv->windows = g_list_append (self->priv->windows, window);106 _bamf_legacy_screen_open_test_window (self, test_win);
105 g_signal_emit (window, legacy_screen_signals[STACKING_CHANGED], 0);
106
107 g_signal_connect (G_OBJECT (window), "closed",
108 (GCallback) handle_window_closed, self);
109
110 g_signal_emit (self, legacy_screen_signals[WINDOW_OPENED], 0, window);
111 }107 }
112 else if (g_strcmp0 (parts[0], "close") == 0 && parts_size == 2)108 else if (g_strcmp0 (parts[0], "close") == 0 && parts_size == 2)
113 {109 {
@@ -116,7 +112,7 @@
116 window = l->data;112 window = l->data;
117 if (bamf_legacy_window_get_xid (window) == xid)113 if (bamf_legacy_window_get_xid (window) == xid)
118 {114 {
119 bamf_legacy_window_test_close (BAMF_LEGACY_WINDOW_TEST (window));115 _bamf_legacy_screen_close_test_window (self, BAMF_LEGACY_WINDOW_TEST (window));
120 break;116 break;
121 }117 }
122 }118 }
@@ -382,9 +378,22 @@
382}378}
383379
384static void380static void
385bamf_legacy_screen_dispose (GObject *object)381bamf_legacy_screen_finalize (GObject *object)
386{382{
387 G_OBJECT_CLASS (bamf_legacy_screen_parent_class)->dispose (object);383 BamfLegacyScreen *self = BAMF_LEGACY_SCREEN (object);
384
385 if (self->priv->windows)
386 g_list_free_full (self->priv->windows, g_object_unref);
387
388 if (self->priv->file)
389 g_object_unref (self->priv->file);
390
391 if (self->priv->stream)
392 g_object_unref (self->priv->stream);
393
394 static_screen = NULL;
395
396 G_OBJECT_CLASS (bamf_legacy_screen_parent_class)->finalize (object);
388}397}
389398
390static void399static void
@@ -398,7 +407,7 @@
398{407{
399 GObjectClass *object_class = G_OBJECT_CLASS (klass);408 GObjectClass *object_class = G_OBJECT_CLASS (klass);
400409
401 object_class->dispose = bamf_legacy_screen_dispose;410 object_class->finalize = bamf_legacy_screen_finalize;
402411
403 g_type_class_add_private (klass, sizeof (BamfLegacyScreenPrivate));412 g_type_class_add_private (klass, sizeof (BamfLegacyScreenPrivate));
404413
@@ -441,15 +450,16 @@
441 G_TYPE_NONE, 0);450 G_TYPE_NONE, 0);
442}451}
443452
444static BamfLegacyScreen *self = NULL;
445
446BamfLegacyScreen *453BamfLegacyScreen *
447bamf_legacy_screen_get_default ()454bamf_legacy_screen_get_default ()
448{455{
449 if (self)456 BamfLegacyScreen *self;
450 return self;457
458 if (static_screen)
459 return static_screen;
451460
452 self = (BamfLegacyScreen *) g_object_new (BAMF_TYPE_LEGACY_SCREEN, NULL);461 self = (BamfLegacyScreen *) g_object_new (BAMF_TYPE_LEGACY_SCREEN, NULL);
462 static_screen = self;
453463
454 self->priv->legacy_screen = wnck_screen_get_default ();464 self->priv->legacy_screen = wnck_screen_get_default ();
455465
@@ -462,5 +472,46 @@
462 g_signal_connect (G_OBJECT (self->priv->legacy_screen), "active-window-changed",472 g_signal_connect (G_OBJECT (self->priv->legacy_screen), "active-window-changed",
463 (GCallback) handle_active_window_changed, self);473 (GCallback) handle_active_window_changed, self);
464474
465 return self;475 return static_screen;
476}
477
478
479// Private functions for testing purposes
480
481void _bamf_legacy_screen_open_test_window (BamfLegacyScreen *self, BamfLegacyWindowTest *test_window)
482{
483 GList *l;
484 BamfLegacyWindow *window;
485 guint xid;
486
487 g_return_if_fail (BAMF_IS_LEGACY_SCREEN (self));
488 g_return_if_fail (BAMF_IS_LEGACY_WINDOW_TEST (test_window));
489
490 window = BAMF_LEGACY_WINDOW (test_window);
491 xid = bamf_legacy_window_get_xid (window);
492
493 for (l = self->priv->windows; l; l = l->next)
494 {
495 if (bamf_legacy_window_get_xid (BAMF_LEGACY_WINDOW (l->data)) == xid)
496 {
497 return;
498 }
499 }
500
501 self->priv->windows = g_list_append (self->priv->windows, window);
502 g_signal_emit (self, legacy_screen_signals[STACKING_CHANGED], 0);
503
504 g_signal_connect (G_OBJECT (window), "closed",
505 (GCallback) handle_window_closed, self);
506
507 g_signal_emit (self, legacy_screen_signals[WINDOW_OPENED], 0, window);
508}
509
510void _bamf_legacy_screen_close_test_window (BamfLegacyScreen *self, BamfLegacyWindowTest *test_window)
511{
512 g_return_if_fail (BAMF_IS_LEGACY_SCREEN (self));
513 g_return_if_fail (BAMF_IS_LEGACY_WINDOW_TEST (test_window));
514
515 // This will cause handle_window_closed to be called
516 bamf_legacy_window_test_close (BAMF_LEGACY_WINDOW_TEST (test_window));
466}517}
467518
=== modified file 'src/bamf-legacy-window-test.c'
--- src/bamf-legacy-window-test.c 2012-01-10 18:01:52 +0000
+++ src/bamf-legacy-window-test.c 2012-07-31 15:13:24 +0000
@@ -18,6 +18,7 @@
18 */18 */
1919
20#include "bamf-legacy-window-test.h"20#include "bamf-legacy-window-test.h"
21#include "bamf-legacy-screen-private.h"
2122
22G_DEFINE_TYPE (BamfLegacyWindowTest, bamf_legacy_window_test, BAMF_TYPE_LEGACY_WINDOW);23G_DEFINE_TYPE (BamfLegacyWindowTest, bamf_legacy_window_test, BAMF_TYPE_LEGACY_WINDOW);
2324
@@ -147,13 +148,23 @@
147}148}
148149
149static const char *150static const char *
150bamf_legacy_window_test_get_class (BamfLegacyWindow *legacy_window)151bamf_legacy_window_test_get_class_name (BamfLegacyWindow *legacy_window)
151{152{
152 BamfLegacyWindowTest *self;153 BamfLegacyWindowTest *self;
153154
154 self = BAMF_LEGACY_WINDOW_TEST (legacy_window);155 self = BAMF_LEGACY_WINDOW_TEST (legacy_window);
155156
156 return self->klass;157 return self->wm_class_name;
158}
159
160static const char *
161bamf_legacy_window_test_get_class_instance_name (BamfLegacyWindow *legacy_window)
162{
163 BamfLegacyWindowTest *self;
164
165 self = BAMF_LEGACY_WINDOW_TEST (legacy_window);
166
167 return self->wm_class_instance;
157}168}
158169
159char *170char *
@@ -229,6 +240,7 @@
229void240void
230bamf_legacy_window_test_close (BamfLegacyWindowTest *self)241bamf_legacy_window_test_close (BamfLegacyWindowTest *self)
231{242{
243 self->is_closed = TRUE;
232 g_signal_emit_by_name (self, "closed");244 g_signal_emit_by_name (self, "closed");
233}245}
234246
@@ -280,6 +292,42 @@
280 self->dbus_menu_object_path = g_strdup (object_path);292 self->dbus_menu_object_path = g_strdup (object_path);
281}293}
282294
295gboolean
296bamf_legacy_window_test_is_closed (BamfLegacyWindow *window)
297{
298 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW_TEST (window), TRUE);
299
300 BamfLegacyWindowTest *self = BAMF_LEGACY_WINDOW_TEST (window);
301 return self->is_closed;
302}
303
304static void
305handle_destroy_notify (BamfLegacyWindowTest *copy, BamfLegacyWindowTest *self_was_here)
306{
307 BamfLegacyScreen *screen = bamf_legacy_screen_get_default ();
308 _bamf_legacy_screen_open_test_window (screen, copy);
309}
310
311void
312bamf_legacy_window_test_reopen (BamfLegacyWindow *window)
313{
314 g_return_if_fail (BAMF_IS_LEGACY_WINDOW_TEST (window));
315
316 BamfLegacyWindowTest *self = BAMF_LEGACY_WINDOW_TEST (window);
317 BamfLegacyWindowTest *copy = bamf_legacy_window_copy (self);
318 g_object_weak_ref (G_OBJECT (self), (GWeakNotify) handle_destroy_notify, copy);
319 bamf_legacy_window_test_close (self);
320}
321
322BamfWindowType
323bamf_legacy_window_test_get_window_type (BamfLegacyWindow *window)
324{
325 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW_TEST (window), TRUE);
326
327 BamfLegacyWindowTest *self = BAMF_LEGACY_WINDOW_TEST (window);
328 return self->window_type;
329}
330
283void331void
284bamf_legacy_window_test_dispose (GObject *object)332bamf_legacy_window_test_dispose (GObject *object)
285{333{
@@ -294,7 +342,8 @@
294342
295 obj_class->dispose = bamf_legacy_window_test_dispose;343 obj_class->dispose = bamf_legacy_window_test_dispose;
296 win_class->get_name = bamf_legacy_window_test_get_name;344 win_class->get_name = bamf_legacy_window_test_get_name;
297 win_class->get_class_name = bamf_legacy_window_test_get_class;345 win_class->get_class_name = bamf_legacy_window_test_get_class_name;
346 win_class->get_class_instance_name = bamf_legacy_window_test_get_class_instance_name;
298 win_class->get_exec_string = bamf_legacy_window_test_get_exec_string;347 win_class->get_exec_string = bamf_legacy_window_test_get_exec_string;
299 win_class->get_xid = bamf_legacy_window_test_get_xid;348 win_class->get_xid = bamf_legacy_window_test_get_xid;
300 win_class->get_pid = bamf_legacy_window_test_get_pid;349 win_class->get_pid = bamf_legacy_window_test_get_pid;
@@ -306,7 +355,10 @@
306 win_class->get_unique_bus_name = bamf_legacy_window_test_get_unique_bus_name;355 win_class->get_unique_bus_name = bamf_legacy_window_test_get_unique_bus_name;
307 win_class->get_menu_object_path = bamf_legacy_window_test_get_menu_object_path;356 win_class->get_menu_object_path = bamf_legacy_window_test_get_menu_object_path;
308 win_class->get_geometry = bamf_legacy_window_test_get_geometry;357 win_class->get_geometry = bamf_legacy_window_test_get_geometry;
358 win_class->get_window_type = bamf_legacy_window_test_get_window_type;
309 win_class->maximized = bamf_legacy_window_test_maximized;359 win_class->maximized = bamf_legacy_window_test_maximized;
360 win_class->is_closed = bamf_legacy_window_test_is_closed;
361 win_class->reopen = bamf_legacy_window_test_reopen;
310}362}
311363
312364
@@ -315,18 +367,47 @@
315{367{
316 self->pid = g_random_int_range (1, 100000);368 self->pid = g_random_int_range (1, 100000);
317 self->maximized = BAMF_WINDOW_FLOATING;369 self->maximized = BAMF_WINDOW_FLOATING;
318}370 self->is_closed = FALSE;
319371}
320372
321BamfLegacyWindowTest *373
322bamf_legacy_window_test_new (guint32 xid, gchar *name, gchar *klass, gchar *exec)374BamfLegacyWindowTest *
375bamf_legacy_window_copy (BamfLegacyWindowTest *self)
376{
377 BamfLegacyWindowTest *copy;
378
379 copy = g_object_new (BAMF_TYPE_LEGACY_WINDOW_TEST, NULL);
380 copy->xid = self->xid;
381 copy->pid = self->pid;
382 copy->name = g_strdup (self->name);
383 copy->wm_class_name = g_strdup (self->wm_class_name);
384 copy->wm_class_instance = g_strdup (self->wm_class_instance);
385 copy->exec = g_strdup (self->exec);
386 copy->application_id = g_strdup (self->application_id);
387 copy->unique_bus_name = g_strdup (self->unique_bus_name);
388 copy->dbus_menu_object_path = g_strdup (self->dbus_menu_object_path);
389 copy->needs_attention = self->needs_attention;
390 copy->is_desktop = self->is_desktop;
391 copy->is_skip = self->is_skip;
392 copy->is_active = self->is_active;
393 copy->is_closed = self->is_closed;
394 copy->geometry = self->geometry;
395 copy->maximized = self->maximized;
396 copy->window_type = self->window_type;
397
398 return copy;
399}
400
401BamfLegacyWindowTest *
402bamf_legacy_window_test_new (guint32 xid, gchar *name, gchar *wmclass_name, gchar *exec)
323{403{
324 BamfLegacyWindowTest *self;404 BamfLegacyWindowTest *self;
325405
326 self = g_object_new (BAMF_TYPE_LEGACY_WINDOW_TEST, NULL);406 self = g_object_new (BAMF_TYPE_LEGACY_WINDOW_TEST, NULL);
407 self->window_type = BAMF_WINDOW_NORMAL;
327 self->xid = xid;408 self->xid = xid;
328 self->name = g_strdup (name);409 self->name = g_strdup (name);
329 self->klass = g_strdup (klass);410 self->wm_class_name = g_strdup (wmclass_name);
330 self->exec = g_strdup (exec);411 self->exec = g_strdup (exec);
331412
332 return self;413 return self;
333414
=== modified file 'src/bamf-legacy-window-test.h'
--- src/bamf-legacy-window-test.h 2012-01-10 18:01:52 +0000
+++ src/bamf-legacy-window-test.h 2012-07-31 15:13:24 +0000
@@ -54,7 +54,8 @@
54 guint32 xid;54 guint32 xid;
55 gint pid;55 gint pid;
56 char * name;56 char * name;
57 char * klass;57 char * wm_class_name;
58 char * wm_class_instance;
58 char * exec;59 char * exec;
59 char * application_id;60 char * application_id;
60 char * unique_bus_name;61 char * unique_bus_name;
@@ -63,8 +64,10 @@
63 gboolean is_desktop;64 gboolean is_desktop;
64 gboolean is_skip;65 gboolean is_skip;
65 gboolean is_active;66 gboolean is_active;
67 gboolean is_closed;
66 GdkRectangle geometry;68 GdkRectangle geometry;
67 BamfWindowMaximizationType maximized;69 BamfWindowMaximizationType maximized;
70 BamfWindowType window_type;
68};71};
6972
70struct _BamfLegacyWindowTestClass73struct _BamfLegacyWindowTestClass
@@ -136,6 +139,9 @@
136bamf_legacy_window_test_close (BamfLegacyWindowTest *self);139bamf_legacy_window_test_close (BamfLegacyWindowTest *self);
137140
138BamfLegacyWindowTest *141BamfLegacyWindowTest *
139bamf_legacy_window_test_new (guint32 xid, gchar *name, gchar *klass, gchar *exec);142bamf_legacy_window_test_new (guint32 xid, gchar *name, gchar *wmclass_name, gchar *exec);
143
144BamfLegacyWindowTest *
145bamf_legacy_window_copy (BamfLegacyWindowTest *self);
140146
141#endif147#endif
142148
=== modified file 'src/bamf-legacy-window.c'
--- src/bamf-legacy-window.c 2012-04-19 18:00:19 +0000
+++ src/bamf-legacy-window.c 2012-07-31 15:13:24 +0000
@@ -78,6 +78,10 @@
78bamf_legacy_window_get_window_type (BamfLegacyWindow *self)78bamf_legacy_window_get_window_type (BamfLegacyWindow *self)
79{79{
80 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), 0);80 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), 0);
81
82 if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_window_type)
83 return BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_window_type (self);
84
81 g_return_val_if_fail (self->priv->legacy_window, 0);85 g_return_val_if_fail (self->priv->legacy_window, 0);
8286
83 return (BamfWindowType) wnck_window_get_window_type (self->priv->legacy_window);87 return (BamfWindowType) wnck_window_get_window_type (self->priv->legacy_window);
@@ -88,7 +92,6 @@
88{92{
89 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), FALSE);93 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), FALSE);
9094
91
92 if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->needs_attention)95 if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->needs_attention)
93 return BAMF_LEGACY_WINDOW_GET_CLASS (self)->needs_attention (self);96 return BAMF_LEGACY_WINDOW_GET_CLASS (self)->needs_attention (self);
9497
@@ -356,11 +359,14 @@
356 g_signal_emit (self, legacy_window_signals[GEOMETRY_CHANGED], 0);359 g_signal_emit (self, legacy_window_signals[GEOMETRY_CHANGED], 0);
357}360}
358361
359gboolean 362gboolean
360bamf_legacy_window_is_closed (BamfLegacyWindow *self)363bamf_legacy_window_is_closed (BamfLegacyWindow *self)
361{364{
362 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), TRUE);365 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), TRUE);
363 366
367 if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->is_closed)
368 return BAMF_LEGACY_WINDOW_GET_CLASS (self)->is_closed (self);
369
364 return self->priv->is_closed;370 return self->priv->is_closed;
365}371}
366372
@@ -463,6 +469,10 @@
463bamf_legacy_window_reopen (BamfLegacyWindow *self)469bamf_legacy_window_reopen (BamfLegacyWindow *self)
464{470{
465 g_return_if_fail (BAMF_IS_LEGACY_WINDOW (self));471 g_return_if_fail (BAMF_IS_LEGACY_WINDOW (self));
472
473 if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->reopen)
474 return BAMF_LEGACY_WINDOW_GET_CLASS (self)->reopen (self);
475
466 g_return_if_fail (WNCK_IS_WINDOW (self->priv->legacy_window));476 g_return_if_fail (WNCK_IS_WINDOW (self->priv->legacy_window));
467477
468 guint xid = bamf_legacy_window_get_xid (self);478 guint xid = bamf_legacy_window_get_xid (self);
@@ -488,13 +498,13 @@
488498
489 g_signal_handler_disconnect (wnck_screen_get_default (),499 g_signal_handler_disconnect (wnck_screen_get_default (),
490 self->priv->closed_id);500 self->priv->closed_id);
491 501
492 if (self->priv->mini_icon_path)502 if (self->priv->mini_icon_path)
493 {503 {
494 file = g_file_new_for_path (self->priv->mini_icon_path);504 file = g_file_new_for_path (self->priv->mini_icon_path);
495 g_file_delete (file, NULL, NULL);505 g_file_delete (file, NULL, NULL);
496 g_object_unref (file);506 g_object_unref (file);
497 507
498 g_free (self->priv->mini_icon_path);508 g_free (self->priv->mini_icon_path);
499 self->priv->mini_icon_path = NULL;509 self->priv->mini_icon_path = NULL;
500 }510 }
501511
=== modified file 'src/bamf-legacy-window.h'
--- src/bamf-legacy-window.h 2012-04-18 20:12:33 +0000
+++ src/bamf-legacy-window.h 2012-07-31 15:13:24 +0000
@@ -84,11 +84,13 @@
84 gboolean (*is_skip_tasklist) (BamfLegacyWindow *legacy_window);84 gboolean (*is_skip_tasklist) (BamfLegacyWindow *legacy_window);
85 gboolean (*is_desktop) (BamfLegacyWindow *legacy_window);85 gboolean (*is_desktop) (BamfLegacyWindow *legacy_window);
86 gboolean (*is_dialog) (BamfLegacyWindow *legacy_window);86 gboolean (*is_dialog) (BamfLegacyWindow *legacy_window);
87 gboolean (*is_closed) (BamfLegacyWindow *legacy_window);
87 BamfWindowMaximizationType (*maximized) (BamfLegacyWindow *legacy_window);88 BamfWindowMaximizationType (*maximized) (BamfLegacyWindow *legacy_window);
8889 BamfWindowType (*get_window_type) (BamfLegacyWindow *legacy_window);
89 void (*get_geometry) (BamfLegacyWindow *self,90 void (*get_geometry) (BamfLegacyWindow *legacy_window,
90 gint *x, gint *y,91 gint *x, gint *y,
91 gint *width, gint *height);92 gint *width, gint *height);
93 void (*reopen) (BamfLegacyWindow *legacy_window);
9294
93 /*< signals >*/95 /*< signals >*/
94 void (*name_changed) (BamfLegacyWindow *legacy_window);96 void (*name_changed) (BamfLegacyWindow *legacy_window);
9597
=== added file 'src/bamf-matcher-private.h'
--- src/bamf-matcher-private.h 1970-01-01 00:00:00 +0000
+++ src/bamf-matcher-private.h 2012-07-31 15:13:24 +0000
@@ -0,0 +1,50 @@
1/*
2 * Copyright (C) 2012 Canonical Ltd
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Marco Trevisan (Treviño) <marco.trevisan@canonical.com>
17 *
18 */
19
20#ifndef __BAMF_MATCHER_PRIVATE_H__
21#define __BAMF_MATCHER_PRIVATE_H__
22
23#include "bamf-view.h"
24#include "bamf-matcher.h"
25#include "bamf-application.h"
26#include "bamf-window.h"
27#include "bamf-legacy-window.h"
28
29struct _BamfMatcherPrivate
30{
31 GArray * bad_prefixes;
32 GArray * good_prefixes;
33 GArray * known_pids;
34 GHashTable * desktop_id_table;
35 GHashTable * desktop_file_table;
36 GHashTable * desktop_class_table;
37 GHashTable * registered_pids;
38 GHashTable * opened_closed_paths_table;
39 GList * views;
40 GList * monitors;
41 GList * favorites;
42 BamfView * active_app;
43 BamfView * active_win;
44 guint dispatch_changes_id;
45};
46
47BamfApplication * bamf_matcher_get_application_by_desktop_file (BamfMatcher *self, const char *desktop_file);
48BamfApplication * bamf_matcher_get_application_by_xid (BamfMatcher *self, guint xid);
49
50#endif
051
=== modified file 'src/bamf-matcher.c'
--- src/bamf-matcher.c 2012-05-22 17:02:28 +0000
+++ src/bamf-matcher.c 2012-07-31 15:13:24 +0000
@@ -21,10 +21,9 @@
21#include "config.h"21#include "config.h"
2222
23#include "bamf-matcher.h"23#include "bamf-matcher.h"
24#include "bamf-matcher-private.h"
24#include "bamf-application.h"25#include "bamf-application.h"
25#include "bamf-window.h"26#include "bamf-window.h"
26#include "bamf-legacy-window.h"
27#include "bamf-legacy-window-test.h"
28#include "bamf-legacy-screen.h"27#include "bamf-legacy-screen.h"
29#include "bamf-indicator-source.h"28#include "bamf-indicator-source.h"
30#include "bamf-xutils.h"29#include "bamf-xutils.h"
@@ -50,24 +49,6 @@
50static BamfMatcher *static_matcher;49static BamfMatcher *static_matcher;
51static guint matcher_signals[LAST_SIGNAL] = { 0 };50static guint matcher_signals[LAST_SIGNAL] = { 0 };
5251
53struct _BamfMatcherPrivate
54{
55 GArray * bad_prefixes;
56 GArray * good_prefixes;
57 GArray * known_pids;
58 GHashTable * desktop_id_table;
59 GHashTable * desktop_file_table;
60 GHashTable * desktop_class_table;
61 GHashTable * registered_pids;
62 GHashTable * opened_closed_paths_table;
63 GList * views;
64 GList * monitors;
65 GList * favorites;
66 BamfView * active_app;
67 BamfView * active_win;
68 guint dispatch_changes_id;
69};
70
71static void52static void
72on_view_active_changed (BamfView *view, gboolean active, BamfMatcher *matcher)53on_view_active_changed (BamfView *view, gboolean active, BamfMatcher *matcher)
73{54{
@@ -127,7 +108,7 @@
127108
128static void bamf_matcher_unregister_view (BamfMatcher *self, BamfView *view);109static void bamf_matcher_unregister_view (BamfMatcher *self, BamfView *view);
129110
130static BamfApplication *111BamfApplication *
131bamf_matcher_get_application_by_desktop_file (BamfMatcher *self, const char *desktop_file)112bamf_matcher_get_application_by_desktop_file (BamfMatcher *self, const char *desktop_file)
132{113{
133 GList *l;114 GList *l;
@@ -158,6 +139,30 @@
158 return NULL;139 return NULL;
159}140}
160141
142BamfApplication *
143bamf_matcher_get_application_by_xid (BamfMatcher *self, guint xid)
144{
145 GList *l;
146 BamfView *view;
147
148 g_return_val_if_fail (BAMF_IS_MATCHER (self), NULL);
149
150 for (l = self->priv->views; l; l = l->next)
151 {
152 view = l->data;
153
154 if (!BAMF_IS_APPLICATION (view))
155 continue;
156
157 if (bamf_application_manages_xid (BAMF_APPLICATION (view), xid))
158 {
159 return BAMF_APPLICATION (view);
160 }
161 }
162
163 return NULL;
164}
165
161static gboolean166static gboolean
162emit_paths_changed (gpointer user_data)167emit_paths_changed (gpointer user_data)
163{168{
@@ -2238,7 +2243,7 @@
2238{2243{
2239 g_return_if_fail (BAMF_IS_MATCHER (self));2244 g_return_if_fail (BAMF_IS_MATCHER (self));
2240 g_return_if_fail (BAMF_IS_INDICATOR (indicator));2245 g_return_if_fail (BAMF_IS_INDICATOR (indicator));
2241 2246
2242 bamf_matcher_register_view_stealing_ref (self, BAMF_VIEW (indicator));2247 bamf_matcher_register_view_stealing_ref (self, BAMF_VIEW (indicator));
2243 bamf_matcher_setup_indicator_state (self, indicator);2248 bamf_matcher_setup_indicator_state (self, indicator);
2244}2249}
@@ -2258,7 +2263,12 @@
2258 self->priv->desktop_class_table);2263 self->priv->desktop_class_table);
22592264
2260 /* If an application with no .desktop file has windows that matches2265 /* If an application with no .desktop file has windows that matches
2261 * the new added .desktop file, then we try to re-match them. */2266 * the new added .desktop file, then we try to re-match them.
2267 * We use another list to save the windows that should be re-matched to avoid
2268 * that the list that we're iterating is changed, since reopening a window
2269 * makes it to be removed from the views. */
2270 GList *to_rematch = NULL;
2271
2262 for (vl = self->priv->views; vl; vl = vl->next)2272 for (vl = self->priv->views; vl; vl = vl->next)
2263 {2273 {
2264 if (!BAMF_IS_APPLICATION (vl->data))2274 if (!BAMF_IS_APPLICATION (vl->data))
@@ -2271,21 +2281,29 @@
2271 GList *children = bamf_view_get_children (BAMF_VIEW (app));2281 GList *children = bamf_view_get_children (BAMF_VIEW (app));
22722282
2273 for (wl = children; wl; wl = wl->next)2283 for (wl = children; wl; wl = wl->next)
2274 {2284 {
2275 if (!BAMF_IS_WINDOW (wl->data))2285 if (!BAMF_IS_WINDOW (wl->data))
2276 continue;2286 continue;
22772287
2278 BamfWindow *win = BAMF_WINDOW (wl->data);2288 BamfWindow *win = BAMF_WINDOW (wl->data);
2279 GList *desktops = bamf_matcher_possible_applications_for_window (self, win, NULL);2289 GList *desktops = bamf_matcher_possible_applications_for_window (self, win, NULL);
22802290
2281 if (g_list_find_custom (desktops, desktop_file, (GCompareFunc) g_strcmp0))2291 if (g_list_find_custom (desktops, desktop_file, (GCompareFunc) g_strcmp0))
2282 {2292 {
2283 BamfLegacyWindow *legacy_window = bamf_window_get_window (win);2293 BamfLegacyWindow *legacy_window = bamf_window_get_window (win);
2284 bamf_legacy_window_reopen (legacy_window);2294 to_rematch = g_list_prepend (to_rematch, legacy_window);
2285 }2295 }
2286 }2296 }
2287 }2297 }
2288 }2298 }
2299
2300 for (wl = to_rematch; wl; wl = wl->next)
2301 {
2302 BamfLegacyWindow *legacy_window = BAMF_LEGACY_WINDOW (wl->data);
2303 bamf_legacy_window_reopen (legacy_window);
2304 }
2305
2306 g_list_free (to_rematch);
2289}2307}
22902308
2291void2309void
@@ -2396,26 +2414,14 @@
2396bamf_matcher_application_for_xid (BamfMatcher *matcher,2414bamf_matcher_application_for_xid (BamfMatcher *matcher,
2397 guint32 xid)2415 guint32 xid)
2398{2416{
2399 GList *l;2417 BamfApplication *app;
2400 BamfView *view;
2401 BamfMatcherPrivate *priv;
24022418
2403 g_return_val_if_fail (BAMF_IS_MATCHER (matcher), NULL);2419 g_return_val_if_fail (BAMF_IS_MATCHER (matcher), NULL);
24042420
2405 priv = matcher->priv;2421 app = bamf_matcher_get_application_by_xid (matcher, xid);
24062422
2407 for (l = priv->views; l; l = l->next)2423 if (BAMF_IS_APPLICATION (app))
2408 {2424 return bamf_view_get_path (BAMF_VIEW (app));
2409 view = l->data;
2410
2411 if (!BAMF_IS_APPLICATION (view))
2412 continue;
2413
2414 if (bamf_application_manages_xid (BAMF_APPLICATION (view), xid))
2415 {
2416 return bamf_view_get_path (view);
2417 }
2418 }
24192425
2420 return "";2426 return "";
2421}2427}
24222428
=== modified file 'src/bamf-window.c'
--- src/bamf-window.c 2012-02-15 05:45:13 +0000
+++ src/bamf-window.c 2012-07-31 15:13:24 +0000
@@ -265,7 +265,7 @@
265 g_return_val_if_fail (BAMF_IS_WINDOW (view), NULL); 265 g_return_val_if_fail (BAMF_IS_WINDOW (view), NULL);
266 self = BAMF_WINDOW (view);266 self = BAMF_WINDOW (view);
267267
268 return g_strdup_printf ("window%i", bamf_legacy_window_get_xid (self->priv->legacy_window));268 return g_strdup_printf ("window%u", bamf_legacy_window_get_xid (self->priv->legacy_window));
269}269}
270270
271gint271gint
272272
=== added file 'tests/bamfdaemon/data/test-bamf-app.desktop'
--- tests/bamfdaemon/data/test-bamf-app.desktop 1970-01-01 00:00:00 +0000
+++ tests/bamfdaemon/data/test-bamf-app.desktop 2012-07-31 15:13:24 +0000
@@ -0,0 +1,7 @@
1[Desktop Entry]
2Name=TestBamfApp
3Type=Application
4Exec=testbamfapp
5Icon=bamf
6StartupWMClass=test_bamf_app
7
08
=== modified file 'tests/bamfdaemon/test-bamf.c'
--- tests/bamfdaemon/test-bamf.c 2012-01-19 16:22:52 +0000
+++ tests/bamfdaemon/test-bamf.c 2012-07-31 15:13:24 +0000
@@ -28,7 +28,7 @@
28#include "bamf.h"28#include "bamf.h"
2929
30void test_application_create_suite (GDBusConnection *connection);30void test_application_create_suite (GDBusConnection *connection);
31void test_matcher_create_suite (void);31void test_matcher_create_suite (GDBusConnection *connection);
32void test_view_create_suite (GDBusConnection *connection);32void test_view_create_suite (GDBusConnection *connection);
33void test_window_create_suite (void);33void test_window_create_suite (void);
3434
@@ -39,7 +39,7 @@
39{39{
40 GMainLoop *loop = data;40 GMainLoop *loop = data;
4141
42 test_matcher_create_suite ();42 test_matcher_create_suite (connection);
43 test_view_create_suite (connection);43 test_view_create_suite (connection);
44 test_window_create_suite ();44 test_window_create_suite ();
45 test_application_create_suite (connection);45 test_application_create_suite (connection);
4646
=== modified file 'tests/bamfdaemon/test-matcher.c'
--- tests/bamfdaemon/test-matcher.c 2010-05-05 10:07:48 +0000
+++ tests/bamfdaemon/test-matcher.c 2012-07-31 15:13:24 +0000
@@ -1,8 +1,8 @@
1/*1/*
2 * Copyright (C) 2009 Canonical Ltd2 * Copyright (C) 2009-2012 Canonical Ltd
3 *3 *
4 * This program is free software: you can redistribute it and/or modify4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 3 as 5 * it under the terms of the GNU General Public License version 3 as
6 * published by the Free Software Foundation.6 * published by the Free Software Foundation.
7 *7 *
8 * This program is distributed in the hope that it will be useful,8 * This program is distributed in the hope that it will be useful,
@@ -13,30 +13,313 @@
13 * You should have received a copy of the GNU General Public License13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *15 *
16 * Authored by Neil Jagdish Patel <neil.patel@canonical.com>16 * Authored by: Neil Jagdish Patel <neil.patel@canonical.com>
17 * Marco Trevisan (Treviño) <marco.trevisan@canonical.com>
17 *18 *
18 */19 */
1920
20#include <glib.h>21#include <glib.h>
21#include <stdlib.h>22#include <stdlib.h>
22#include "bamf-matcher.h"23#include "bamf-matcher.h"
2324#include "bamf-matcher-private.h"
24static void test_allocation (void);25#include "bamf-legacy-screen-private.h"
26#include "bamf-legacy-window.h"
27#include "bamf-legacy-window-test.h"
28
29static void test_allocation (void);
30static void test_load_desktop_file (void);
31static void test_open_windows (void);
32static void test_match_desktopless_application (void);
33static void test_match_desktop_application (void);
34static void test_new_desktop_matches_unmatched_windows (void);
35
36static GDBusConnection *gdbus_connection = NULL;
37
38#define DOMAIN "/Matcher"
39#define DATA_DIR TESTDIR "/bamfdaemon/data"
40#define TEST_BAMF_APP_DESKTOP DATA_DIR "/test-bamf-app.desktop"
2541
26void42void
27test_matcher_create_suite (void)43test_matcher_create_suite (GDBusConnection *connection)
28{44{
29#define DOMAIN "/Matcher"45 gdbus_connection = connection;
3046
31 g_test_add_func (DOMAIN"/Allocation", test_allocation);47 g_test_add_func (DOMAIN"/Allocation", test_allocation);
48 g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file);
49 g_test_add_func (DOMAIN"/OpenWindows", test_open_windows);
50 g_test_add_func (DOMAIN"/MatchDesktopLessApplication", test_match_desktopless_application);
51 g_test_add_func (DOMAIN"/MatchDesktopApplication", test_match_desktop_application);
52 g_test_add_func (DOMAIN"/NewMatchesUnmatchedWindows", test_new_desktop_matches_unmatched_windows);
53}
54
55static void
56export_matcher_on_bus (BamfMatcher *matcher)
57{
58 GError *error = NULL;
59 g_return_if_fail (BAMF_IS_MATCHER (matcher));
60
61 g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (matcher),
62 gdbus_connection, BAMF_MATCHER_PATH"/Test",
63 &error);
64
65 g_assert (!error);
66 g_clear_error (&error);
67}
68
69static BamfWindow *
70find_window_in_matcher (BamfMatcher *matcher, BamfLegacyWindow *legacy)
71{
72 GList *l;
73 BamfWindow *found_window = NULL;
74
75 for (l = matcher->priv->views; l; l = l->next)
76 {
77 if (!BAMF_IS_WINDOW (l->data))
78 continue;
79
80 if (bamf_window_get_window (BAMF_WINDOW (l->data)) == legacy)
81 {
82 g_assert (!found_window);
83 found_window = l->data;
84 }
85 }
86
87 return found_window;
88}
89
90static BamfWindow *
91find_window_in_app (BamfApplication *app, BamfLegacyWindow *legacy)
92{
93 GList *l;
94 BamfWindow *found_window = NULL;
95
96 for (l = bamf_view_get_children (BAMF_VIEW (app)); l; l = l->next)
97 {
98 if (!BAMF_IS_WINDOW (l->data))
99 continue;
100
101 if (bamf_window_get_window (BAMF_WINDOW (l->data)) == legacy)
102 {
103 g_assert (!found_window);
104 found_window = l->data;
105 }
106 }
107
108 return found_window;
32}109}
33110
34static void111static void
35test_allocation (void)112test_allocation (void)
36{113{
37 BamfMatcher *matcher;114 BamfMatcher *matcher;
38115
39 /* Check it allocates */116 /* Check it allocates */
40 matcher = bamf_matcher_get_default ();117 matcher = bamf_matcher_get_default ();
41 g_assert (BAMF_IS_MATCHER (matcher));118 g_assert (BAMF_IS_MATCHER (matcher));
42}119 g_object_unref (matcher);
120}
121
122static void
123test_load_desktop_file (void)
124{
125 BamfMatcher *matcher = bamf_matcher_get_default ();
126 BamfMatcherPrivate *priv = matcher->priv;
127
128 bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
129
130 GList *l = g_hash_table_lookup (priv->desktop_file_table, "testbamfapp");
131 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
132
133 l = g_hash_table_lookup (priv->desktop_id_table, "test-bamf-app");
134 g_assert_cmpstr (l->data, ==, TEST_BAMF_APP_DESKTOP);
135
136 const char *desktop = g_hash_table_lookup (priv->desktop_class_table, TEST_BAMF_APP_DESKTOP);
137 g_assert_cmpstr (desktop, ==, "test_bamf_app");
138}
139
140static void
141test_open_windows (void)
142{
143 BamfMatcher *matcher;
144 BamfLegacyScreen *screen;
145 BamfLegacyWindow *window;
146 BamfLegacyWindowTest *test_win;
147 guint xid;
148 const int window_count = 500;
149
150 screen = bamf_legacy_screen_get_default();
151 matcher = bamf_matcher_get_default ();
152
153 export_matcher_on_bus (matcher);
154
155 for (xid = G_MAXUINT; xid > G_MAXUINT-window_count; xid--)
156 {
157 gchar *name = g_strdup_printf ("Test Window %u", xid);
158 gchar *class = g_strdup_printf ("test-class-%u", xid);
159 gchar *exec = g_strdup_printf ("test-class-%u", xid);
160
161 test_win = bamf_legacy_window_test_new (xid, name, class, exec);
162 window = BAMF_LEGACY_WINDOW (test_win);
163
164 _bamf_legacy_screen_open_test_window (screen, test_win);
165 g_assert (g_list_find (bamf_legacy_screen_get_windows (screen), test_win));
166 g_assert (find_window_in_matcher (matcher, window));
167 g_assert (bamf_matcher_get_application_by_xid (matcher, xid));
168
169 _bamf_legacy_screen_close_test_window (screen, test_win);
170 g_assert (!g_list_find (bamf_legacy_screen_get_windows (screen), test_win));
171 g_assert (!find_window_in_matcher (matcher, window));
172 g_assert (!bamf_matcher_get_application_by_xid (matcher, xid));
173
174 g_free (name);
175 g_free (class);
176 g_free (exec);
177 }
178
179 g_object_unref (matcher);
180 g_object_unref (screen);
181}
182
183static void
184test_match_desktopless_application (void)
185{
186 BamfMatcher *matcher;
187 BamfLegacyScreen *screen;
188 BamfLegacyWindow *window;
189 BamfLegacyWindowTest *test_win;
190 BamfApplication *app;
191 GList *test_windows = NULL, *l, *app_children;
192 guint xid;
193 const int window_count = 5;
194
195 screen = bamf_legacy_screen_get_default();
196 matcher = bamf_matcher_get_default ();
197 char *exec = "test-bamf-app";
198 char *class = "test-bamf-app";
199
200 export_matcher_on_bus (matcher);
201
202 for (xid = G_MAXUINT; xid > G_MAXUINT-window_count; xid--)
203 {
204 gchar *name = g_strdup_printf ("Test Window %u", xid);
205
206 test_win = bamf_legacy_window_test_new (xid, name, class, exec);
207 window = BAMF_LEGACY_WINDOW (test_win);
208 test_windows = g_list_prepend (test_windows, window);
209
210 _bamf_legacy_screen_open_test_window (screen, test_win);
211 g_free (name);
212 }
213
214 app = bamf_matcher_get_application_by_xid (matcher, G_MAXUINT);
215 g_assert (app);
216
217 app_children = bamf_view_get_children (BAMF_VIEW (app));
218 g_assert_cmpuint (g_list_length (app_children), ==, window_count);
219
220 for (l = test_windows; l; l = l->next)
221 {
222 g_assert (find_window_in_app (app, BAMF_LEGACY_WINDOW (l->data)));
223 }
224
225 g_list_free (test_windows);
226 g_object_unref (matcher);
227 g_object_unref (screen);
228}
229
230static void
231test_match_desktop_application (void)
232{
233 BamfMatcher *matcher;
234 BamfLegacyScreen *screen;
235 BamfLegacyWindow *window;
236 BamfLegacyWindowTest *test_win;
237 BamfApplication *app;
238 GList *test_windows = NULL, *l, *app_children;
239 guint xid;
240 const int window_count = 5;
241
242 screen = bamf_legacy_screen_get_default();
243 matcher = bamf_matcher_get_default ();
244 char *exec = "testbamfapp";
245 char *class = "test_bamf_app";
246
247 export_matcher_on_bus (matcher);
248 bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
249
250 for (xid = G_MAXUINT; xid > G_MAXUINT-window_count; xid--)
251 {
252 gchar *name = g_strdup_printf ("Test Window %u", xid);
253
254 test_win = bamf_legacy_window_test_new (xid, name, class, exec);
255 window = BAMF_LEGACY_WINDOW (test_win);
256 test_windows = g_list_prepend (test_windows, window);
257
258 _bamf_legacy_screen_open_test_window (screen, test_win);
259 g_free (name);
260 }
261
262 app = bamf_matcher_get_application_by_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
263 g_assert (app);
264
265 g_assert (bamf_matcher_get_application_by_xid (matcher, G_MAXUINT) == app);
266
267 app_children = bamf_view_get_children (BAMF_VIEW (app));
268 g_assert_cmpuint (g_list_length (app_children), ==, window_count);
269
270 for (l = test_windows; l; l = l->next)
271 {
272 g_assert (find_window_in_app (app, BAMF_LEGACY_WINDOW (l->data)));
273 }
274
275 g_list_free (test_windows);
276 g_object_unref (matcher);
277 g_object_unref (screen);
278}
279
280static void
281test_new_desktop_matches_unmatched_windows (void)
282{
283 BamfMatcher *matcher;
284 BamfLegacyScreen *screen;
285 BamfLegacyWindowTest *test_win;
286 BamfApplication *app;
287 GList *app_children;
288 guint xid = 0;
289 const int window_count = 5;
290
291 screen = bamf_legacy_screen_get_default();
292 matcher = bamf_matcher_get_default ();
293 char *exec = "testbamfapp";
294 char *class = "test_bamf_app";
295
296 export_matcher_on_bus (matcher);
297 g_assert (!bamf_matcher_get_application_by_desktop_file (matcher, TEST_BAMF_APP_DESKTOP));
298
299 for (xid = G_MAXUINT; xid > G_MAXUINT-window_count; xid--)
300 {
301 gchar *name = g_strdup_printf ("Test Window %u", xid);
302
303 test_win = bamf_legacy_window_test_new (xid, name, class, exec);
304 _bamf_legacy_screen_open_test_window (screen, test_win);
305
306 g_free (name);
307 }
308
309 bamf_matcher_load_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
310
311 app = bamf_matcher_get_application_by_desktop_file (matcher, TEST_BAMF_APP_DESKTOP);
312 g_assert (app);
313
314 app_children = bamf_view_get_children (BAMF_VIEW (app));
315 g_assert_cmpuint (g_list_length (app_children), ==, window_count);
316
317 for (xid = G_MAXUINT; xid > G_MAXUINT-window_count; xid--)
318 {
319 g_assert (bamf_matcher_get_application_by_xid (matcher, xid) == app);
320 }
321
322 g_object_unref (matcher);
323 g_object_unref (screen);
324}
325

Subscribers

People subscribed via source and target branches