Status: | Merged |
---|---|
Approved by: | Marco Trevisan (Treviño) |
Approved revision: | 634 |
Merged at revision: | 625 |
Proposed branch: | lp:~azzar1/bamf/bamf-sn |
Merge into: | lp:bamf |
Diff against target: |
823 lines (+340/-18) 17 files modified
configure.ac (+6/-1) debian/changelog (+6/-0) debian/libbamf3-2.symbols (+1/-0) lib/libbamf-private/org.ayatana.bamf.view.xml (+1/-0) lib/libbamf/bamf-view.c (+51/-0) lib/libbamf/bamf-view.h (+5/-2) src/Makefile.am (+2/-0) src/bamf-application.c (+19/-0) src/bamf-control.c (+4/-2) src/bamf-control.h (+2/-2) src/bamf-legacy-screen.c (+98/-1) src/bamf-legacy-screen.h (+14/-8) src/bamf-matcher.c (+54/-2) src/bamf-matcher.h (+4/-0) src/bamf-view.c (+67/-0) src/bamf-view.h (+4/-0) tests/bamfdaemon/Makefile.am (+2/-0) |
To merge this branch: | bzr merge lp:~azzar1/bamf/bamf-sn |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Marco Trevisan (Treviño) | Approve | ||
PS Jenkins bot (community) | continuous-integration | Approve | |
Andrea Azzarone (community) | Needs Resubmitting | ||
Review via email: mp+283314@code.launchpad.net |
Commit message
BamfView: add "starting" property which is true when an application has been launched
Description of the change
Add "starting" property to bamf views using startup notification. I suppose I also need to bump the API.
PS Jenkins bot (ps-jenkins) wrote : | # |
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:629
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Marco Trevisan (Treviño) (3v1n0) wrote : | # |
Wondering why we can't just use org.gtk.
This could have been implemented just for a BamfApplication, but that's fine for a view as well.
In case of SN_MONITOR_
Also we should define a maximum amount of time to wait after setting a viuw as starting.
Plus, bump version to 0.5.3, so that we can set set as build-dependency on unity side.
On debian side there's some work to do as well:
debian/control: add libstartup-
debian/changelog: bump version
debian/
- 625. By Andrea Azzarone
-
Merge with trunk.
- 626. By Andrea Azzarone
-
Remove deprecated methods.
- 627. By Andrea Azzarone
-
Remove two paddings to avoid ABI break.
- 628. By Andrea Azzarone
-
Remove useless space.
- 629. By Andrea Azzarone
-
Add a timeout to avoid infinite starting animation in case of failing.
- 630. By Andrea Azzarone
-
Bump version and update symbols.
Andrea Azzarone (azzar1) wrote : | # |
Done.
- 631. By Andrea Azzarone
-
Properly bump version.
- 632. By Andrea Azzarone
-
And again.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:631
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: http://
deb: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:632
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: http://
deb: http://
Click here to trigger a rebuild:
http://
- 633. By Andrea Azzarone
-
Properly remove deprecated methods.
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:633
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 634. By Andrea Azzarone
-
Merge with lp:~3v1n0/bamf/sn-fixes
Marco Trevisan (Treviño) (3v1n0) wrote : | # |
Good to go
Preview Diff
1 | === modified file 'configure.ac' |
2 | --- configure.ac 2015-10-28 16:37:55 +0000 |
3 | +++ configure.ac 2016-03-21 15:30:01 +0000 |
4 | @@ -1,7 +1,7 @@ |
5 | # -*- Autoconf -*- |
6 | # Process this file with autoconf to produce a configure script. |
7 | |
8 | -AC_INIT(bamf, 0.5.2, dx-team@canonical.com) |
9 | +AC_INIT(bamf, 0.5.3, dx-team@canonical.com) |
10 | AC_PREREQ(2.69) |
11 | AC_SUBST(LIBBAMF_VER, 3) |
12 | AC_SUBST(LIBBAMF_SONAME, 2:0:0) |
13 | @@ -63,6 +63,11 @@ |
14 | PKG_CHECK_MODULES(GTOP, libgtop-2.0) |
15 | |
16 | # |
17 | +# libsn |
18 | +# |
19 | +PKG_CHECK_MODULES(SN, libstartup-notification-1.0) |
20 | + |
21 | +# |
22 | # x11 |
23 | # |
24 | PKG_CHECK_MODULES(X, x11) |
25 | |
26 | === modified file 'debian/changelog' |
27 | --- debian/changelog 2015-12-17 18:01:40 +0000 |
28 | +++ debian/changelog 2016-03-21 15:30:01 +0000 |
29 | @@ -1,3 +1,9 @@ |
30 | +bamf (0.5.3~bzr0+16.04.20160229-0ubuntu1) xenial; urgency=medium |
31 | + |
32 | + * Use startup notifications to set a "starting" property (LP: #676457) |
33 | + |
34 | + -- Andrea <andrea.azzarone@canonical.com> Mon, 29 Feb 2016 16:02:03 +0100 |
35 | + |
36 | bamf (0.5.2~bzr0+16.04.20151217-0ubuntu1) xenial; urgency=medium |
37 | |
38 | * BamfMatcher: don't assign no-display desktop files to windows by |
39 | |
40 | === modified file 'debian/libbamf3-2.symbols' |
41 | --- debian/libbamf3-2.symbols 2015-11-04 16:24:12 +0000 |
42 | +++ debian/libbamf3-2.symbols 2016-03-21 15:30:01 +0000 |
43 | @@ -52,6 +52,7 @@ |
44 | bamf_view_has_child@Base 0.5.2~bzr0+16.04.20151104 |
45 | bamf_view_is_closed@Base 0.2.54 |
46 | bamf_view_is_running@Base 0.2.20 |
47 | + bamf_view_is_starting@Base 0replaceme |
48 | bamf_view_is_sticky@Base 0.2.60 |
49 | bamf_view_is_urgent@Base 0.2.20 |
50 | bamf_view_is_user_visible@Base 0.4.0 |
51 | |
52 | === modified file 'lib/libbamf-private/org.ayatana.bamf.view.xml' |
53 | --- lib/libbamf-private/org.ayatana.bamf.view.xml 2013-07-29 18:09:10 +0000 |
54 | +++ lib/libbamf-private/org.ayatana.bamf.view.xml 2016-03-21 15:30:01 +0000 |
55 | @@ -68,6 +68,7 @@ |
56 | <property name="Icon" type="s" access="read"/> |
57 | <property name="UserVisible" type="b" access="read"/> |
58 | <property name="Running" type="b" access="read"/> |
59 | + <property name="Starting" type="b" access="read"/> |
60 | <property name="Urgent" type="b" access="read"/> |
61 | <property name="Active" type="b" access="read"/> |
62 | </interface> |
63 | |
64 | === modified file 'lib/libbamf/bamf-view.c' |
65 | --- lib/libbamf/bamf-view.c 2015-04-22 15:58:06 +0000 |
66 | +++ lib/libbamf/bamf-view.c 2016-03-21 15:30:01 +0000 |
67 | @@ -55,6 +55,7 @@ |
68 | CHILD_ADDED, |
69 | CHILD_REMOVED, |
70 | CHILD_MOVED, |
71 | + STARTING_CHANGED, |
72 | RUNNING_CHANGED, |
73 | URGENT_CHANGED, |
74 | VISIBLE_CHANGED, |
75 | @@ -68,6 +69,7 @@ |
76 | PROP_0, |
77 | |
78 | PROP_PATH, |
79 | + PROP_STARTING, |
80 | PROP_RUNNING, |
81 | PROP_ACTIVE, |
82 | PROP_USER_VISIBLE, |
83 | @@ -270,6 +272,26 @@ |
84 | } |
85 | |
86 | /** |
87 | + * bamf_view_is_starting: |
88 | + * @view: a #BamfView |
89 | + * |
90 | + * Determines if the view is currently starting. Useful for the startup animation. |
91 | + */ |
92 | +gboolean |
93 | +bamf_view_is_starting (BamfView *self) |
94 | +{ |
95 | + g_return_val_if_fail (BAMF_IS_VIEW (self), FALSE); |
96 | + |
97 | + if (BAMF_VIEW_GET_CLASS (self)->is_starting) |
98 | + return BAMF_VIEW_GET_CLASS (self)->is_starting (self); |
99 | + |
100 | + if (!_bamf_view_remote_ready (self)) |
101 | + return FALSE; |
102 | + |
103 | + return _bamf_dbus_item_view_get_starting (self->priv->proxy); |
104 | +} |
105 | + |
106 | +/** |
107 | * bamf_view_is_running: |
108 | * @view: a #BamfView |
109 | * |
110 | @@ -609,6 +631,15 @@ |
111 | } |
112 | |
113 | static void |
114 | +bamf_view_on_starting_changed (BamfDBusItemView *proxy, GParamSpec *param, BamfView *self) |
115 | +{ |
116 | + gboolean starting = _bamf_dbus_item_view_get_starting (proxy); |
117 | + g_signal_emit (G_OBJECT (self), view_signals[STARTING_CHANGED], 0, starting); |
118 | + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STARTING]); |
119 | +} |
120 | + |
121 | + |
122 | +static void |
123 | bamf_view_on_running_changed (BamfDBusItemView *proxy, GParamSpec *param, BamfView *self) |
124 | { |
125 | gboolean running = _bamf_dbus_item_view_get_running (proxy); |
126 | @@ -699,6 +730,10 @@ |
127 | g_value_set_boolean (value, bamf_view_is_active (self)); |
128 | break; |
129 | |
130 | + case PROP_STARTING: |
131 | + g_value_set_boolean (value, bamf_view_is_starting (self)); |
132 | + break; |
133 | + |
134 | case PROP_RUNNING: |
135 | g_value_set_boolean (value, bamf_view_is_running (self)); |
136 | break; |
137 | @@ -798,6 +833,7 @@ |
138 | /* Notifying proxy properties makes the view to emit proper signals */ |
139 | g_object_notify (G_OBJECT (view->priv->proxy), "user-visible"); |
140 | g_object_notify (G_OBJECT (view->priv->proxy), "active"); |
141 | + g_object_notify (G_OBJECT (view->priv->proxy), "starting"); |
142 | g_object_notify (G_OBJECT (view->priv->proxy), "running"); |
143 | g_object_notify (G_OBJECT (view->priv->proxy), "urgent"); |
144 | g_object_notify (G_OBJECT (view->priv->proxy), "name"); |
145 | @@ -847,6 +883,9 @@ |
146 | g_signal_connect (priv->proxy, "notify::active", |
147 | G_CALLBACK (bamf_view_on_active_changed), view); |
148 | |
149 | + g_signal_connect (priv->proxy, "notify::starting", |
150 | + G_CALLBACK (bamf_view_on_starting_changed), view); |
151 | + |
152 | g_signal_connect (priv->proxy, "notify::running", |
153 | G_CALLBACK (bamf_view_on_running_changed), view); |
154 | |
155 | @@ -895,6 +934,9 @@ |
156 | properties[PROP_URGENT] = g_param_spec_boolean ("urgent", "urgent", "urgent", FALSE, G_PARAM_READABLE); |
157 | g_object_class_install_property (obj_class, PROP_URGENT, properties[PROP_URGENT]); |
158 | |
159 | + properties[PROP_STARTING] = g_param_spec_boolean ("starting", "starting", "starting", FALSE, G_PARAM_READABLE); |
160 | + g_object_class_install_property (obj_class, PROP_STARTING, properties[PROP_STARTING]); |
161 | + |
162 | properties[PROP_RUNNING] = g_param_spec_boolean ("running", "running", "running", FALSE, G_PARAM_READABLE); |
163 | g_object_class_install_property (obj_class, PROP_RUNNING, properties[PROP_RUNNING]); |
164 | |
165 | @@ -947,6 +989,15 @@ |
166 | G_TYPE_NONE, 1, |
167 | BAMF_TYPE_VIEW); |
168 | |
169 | + view_signals [STARTING_CHANGED] = |
170 | + g_signal_new (BAMF_VIEW_SIGNAL_STARTING_CHANGED, |
171 | + G_OBJECT_CLASS_TYPE (klass), |
172 | + G_SIGNAL_RUN_FIRST, |
173 | + G_STRUCT_OFFSET (BamfViewClass, starting_changed), |
174 | + NULL, NULL, NULL, |
175 | + G_TYPE_NONE, 1, |
176 | + G_TYPE_BOOLEAN); |
177 | + |
178 | view_signals [RUNNING_CHANGED] = |
179 | g_signal_new (BAMF_VIEW_SIGNAL_RUNNING_CHANGED, |
180 | G_OBJECT_CLASS_TYPE (klass), |
181 | |
182 | === modified file 'lib/libbamf/bamf-view.h' |
183 | --- lib/libbamf/bamf-view.h 2015-04-21 20:30:17 +0000 |
184 | +++ lib/libbamf/bamf-view.h 2016-03-21 15:30:01 +0000 |
185 | @@ -51,6 +51,7 @@ |
186 | |
187 | #define BAMF_VIEW_SIGNAL_ACTIVE_CHANGED "active-changed" |
188 | #define BAMF_VIEW_SIGNAL_RUNNING_CHANGED "running-changed" |
189 | +#define BAMF_VIEW_SIGNAL_STARTING_CHANGED "starting-changed" |
190 | #define BAMF_VIEW_SIGNAL_URGENT_CHANGED "urgent-changed" |
191 | #define BAMF_VIEW_SIGNAL_USER_VISIBLE_CHANGED "user-visible-changed" |
192 | #define BAMF_VIEW_SIGNAL_NAME_CHANGED "name-changed" |
193 | @@ -89,6 +90,7 @@ |
194 | |
195 | GList * (*get_children) (BamfView *view); |
196 | gboolean (*is_active) (BamfView *view); |
197 | + gboolean (*is_starting) (BamfView *view); |
198 | gboolean (*is_running) (BamfView *view); |
199 | gboolean (*is_urgent) (BamfView *view); |
200 | gboolean (*is_user_visible) (BamfView *view); |
201 | @@ -104,6 +106,7 @@ |
202 | void (*closed) (BamfView *view); |
203 | void (*child_added) (BamfView *view, BamfView *child); |
204 | void (*child_removed) (BamfView *view, BamfView *child); |
205 | + void (*starting_changed) (BamfView *view, gboolean starting); |
206 | void (*running_changed) (BamfView *view, gboolean running); |
207 | void (*urgent_changed) (BamfView *view, gboolean urgent); |
208 | void (*user_visible_changed) (BamfView *view, gboolean user_visible); |
209 | @@ -113,8 +116,6 @@ |
210 | |
211 | /*< private >*/ |
212 | void (*_view_padding1) (void); |
213 | - void (*_view_padding2) (void); |
214 | - void (*_view_padding3) (void); |
215 | }; |
216 | |
217 | GType bamf_view_get_type (void) G_GNUC_CONST; |
218 | @@ -129,6 +130,8 @@ |
219 | |
220 | gboolean bamf_view_is_active (BamfView *view); |
221 | |
222 | +gboolean bamf_view_is_starting (BamfView *view); |
223 | + |
224 | gboolean bamf_view_is_running (BamfView *view); |
225 | |
226 | gboolean bamf_view_is_urgent (BamfView *view); |
227 | |
228 | === modified file 'src/Makefile.am' |
229 | --- src/Makefile.am 2014-04-07 21:31:21 +0000 |
230 | +++ src/Makefile.am 2016-03-21 15:30:01 +0000 |
231 | @@ -47,6 +47,7 @@ |
232 | $(X_LIBS) \ |
233 | $(GLIB_LIBS) \ |
234 | $(GTK_LIBS) \ |
235 | + $(SN_LIBS) \ |
236 | $(WNCK_LIBS) \ |
237 | $(GTOP_LIBS) \ |
238 | $(NULL) |
239 | @@ -60,6 +61,7 @@ |
240 | -I$(top_builddir)/lib \ |
241 | $(GLIB_CFLAGS) \ |
242 | $(GTK_CFLAGS) \ |
243 | + $(SN_CFLAGS) \ |
244 | $(WNCK_CFLAGS) \ |
245 | $(GTOP_CFLAGS) \ |
246 | $(COVERAGE_CFLAGS) \ |
247 | |
248 | === modified file 'src/bamf-application.c' |
249 | --- src/bamf-application.c 2015-01-21 14:43:24 +0000 |
250 | +++ src/bamf-application.c 2016-03-21 15:30:01 +0000 |
251 | @@ -1149,6 +1149,24 @@ |
252 | } |
253 | } |
254 | |
255 | +static gboolean |
256 | +bamf_application_starting_changed (BamfView *view, gboolean starting) |
257 | +{ |
258 | + if (starting) |
259 | + { |
260 | + bamf_view_set_user_visible (view, TRUE); |
261 | + } |
262 | + else |
263 | + { |
264 | + bamf_application_ensure_flags (BAMF_APPLICATION (view)); |
265 | + |
266 | + if (!bamf_view_is_running (view)) |
267 | + bamf_view_close (view); |
268 | + } |
269 | + |
270 | + return TRUE; |
271 | +} |
272 | + |
273 | static void |
274 | matcher_favorites_changed (BamfMatcher *matcher, BamfApplication *self) |
275 | { |
276 | @@ -1448,6 +1466,7 @@ |
277 | view_class->view_type = bamf_application_get_view_type; |
278 | view_class->child_added = bamf_application_child_added; |
279 | view_class->child_removed = bamf_application_child_removed; |
280 | + view_class->starting_changed = bamf_application_starting_changed; |
281 | view_class->stable_bus_name = bamf_application_get_stable_bus_name; |
282 | |
283 | klass->get_supported_mime_types = bamf_application_default_get_supported_mime_types; |
284 | |
285 | === modified file 'src/bamf-control.c' |
286 | --- src/bamf-control.c 2013-07-30 23:56:55 +0000 |
287 | +++ src/bamf-control.c 2016-03-21 15:30:01 +0000 |
288 | @@ -46,14 +46,16 @@ |
289 | GVariant *parameters, |
290 | gpointer user_data) |
291 | { |
292 | + BamfMatcher *matcher; |
293 | const gchar *desktop_file; |
294 | gint64 pid; |
295 | |
296 | + matcher = bamf_matcher_get_default (); |
297 | g_variant_get_child (parameters, 0, "^&ay", &desktop_file); |
298 | g_variant_get_child (parameters, 2, "x", &pid); |
299 | |
300 | - bamf_matcher_register_desktop_file_for_pid (bamf_matcher_get_default (), |
301 | - desktop_file, pid); |
302 | + bamf_matcher_set_starting_desktop_file (matcher, desktop_file, TRUE); |
303 | + bamf_matcher_register_desktop_file_for_pid (matcher, desktop_file, pid); |
304 | } |
305 | |
306 | static void |
307 | |
308 | === modified file 'src/bamf-control.h' |
309 | --- src/bamf-control.h 2013-08-09 15:10:02 +0000 |
310 | +++ src/bamf-control.h 2016-03-21 15:30:01 +0000 |
311 | @@ -59,8 +59,8 @@ |
312 | void bamf_control_insert_desktop_file (BamfControl *control, |
313 | const char *path); |
314 | |
315 | -void bamf_control_create_local_desktop_file (BamfControl *control, |
316 | - const char *desktop_file); |
317 | +void bamf_control_create_local_desktop_file (BamfControl *control, |
318 | + const char *desktop_file); |
319 | |
320 | void bamf_control_quit (BamfControl *control); |
321 | |
322 | |
323 | === modified file 'src/bamf-legacy-screen.c' |
324 | --- src/bamf-legacy-screen.c 2014-09-11 17:00:26 +0000 |
325 | +++ src/bamf-legacy-screen.c 2016-03-21 15:30:01 +0000 |
326 | @@ -22,6 +22,10 @@ |
327 | #include <gdk/gdkx.h> |
328 | #include <gio/gio.h> |
329 | |
330 | +#define SN_API_NOT_YET_FROZEN |
331 | +#include <libsn/sn.h> |
332 | +#undef SN_API_NOT_YET_FROZEN |
333 | + |
334 | G_DEFINE_TYPE (BamfLegacyScreen, bamf_legacy_screen, G_TYPE_OBJECT); |
335 | #define BAMF_LEGACY_SCREEN_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \ |
336 | BAMF_TYPE_LEGACY_SCREEN, BamfLegacyScreenPrivate)) |
337 | @@ -30,6 +34,9 @@ |
338 | |
339 | enum |
340 | { |
341 | + WINDOW_OPENING, |
342 | + WINDOW_OPENING_COMPLETED, |
343 | + WINDOW_OPENING_CANCELED, |
344 | WINDOW_OPENED, |
345 | WINDOW_CLOSED, |
346 | STACKING_CHANGED, |
347 | @@ -45,6 +52,10 @@ |
348 | struct _BamfLegacyScreenPrivate |
349 | { |
350 | WnckScreen * legacy_screen; |
351 | + |
352 | + SnDisplay * sn_display; |
353 | + SnMonitorContext * sn_monitor_context; |
354 | + |
355 | GList *windows; |
356 | GFile *file; |
357 | GDataInputStream *stream; |
358 | @@ -235,6 +246,39 @@ |
359 | } |
360 | |
361 | static void |
362 | +handle_sn_monitor_event (SnMonitorEvent *event, |
363 | + void *data) |
364 | +{ |
365 | + BamfLegacyScreen *self = data; |
366 | + |
367 | + switch (sn_monitor_event_get_type (event)) |
368 | + { |
369 | + case SN_MONITOR_EVENT_INITIATED: |
370 | + case SN_MONITOR_EVENT_CHANGED: |
371 | + { |
372 | + SnStartupSequence *sequence = sn_monitor_event_get_startup_sequence (event); |
373 | + const gchar *app_id = sn_startup_sequence_get_application_id (sequence); |
374 | + g_signal_emit (self, legacy_screen_signals[WINDOW_OPENING], 0, app_id); |
375 | + } |
376 | + break; |
377 | + case SN_MONITOR_EVENT_COMPLETED: |
378 | + { |
379 | + SnStartupSequence *sequence = sn_monitor_event_get_startup_sequence (event); |
380 | + const gchar *app_id = sn_startup_sequence_get_application_id (sequence); |
381 | + g_signal_emit (self, legacy_screen_signals[WINDOW_OPENING_COMPLETED], 0, app_id); |
382 | + break; |
383 | + } |
384 | + case SN_MONITOR_EVENT_CANCELED: |
385 | + { |
386 | + SnStartupSequence *sequence = sn_monitor_event_get_startup_sequence (event); |
387 | + const gchar *app_id = sn_startup_sequence_get_application_id (sequence); |
388 | + g_signal_emit (self, legacy_screen_signals[WINDOW_OPENING_CANCELED], 0, app_id); |
389 | + break; |
390 | + } |
391 | + } |
392 | +} |
393 | + |
394 | +static void |
395 | handle_window_opened (WnckScreen *screen, WnckWindow *window, BamfLegacyScreen *legacy) |
396 | { |
397 | BamfLegacyWindow *legacy_window; |
398 | @@ -385,6 +429,18 @@ |
399 | { |
400 | BamfLegacyScreen *self = BAMF_LEGACY_SCREEN (object); |
401 | |
402 | + if (self->priv->sn_display) |
403 | + { |
404 | + sn_display_unref (self->priv->sn_display); |
405 | + self->priv->sn_display = NULL; |
406 | + } |
407 | + |
408 | + if (self->priv->sn_monitor_context) |
409 | + { |
410 | + sn_monitor_context_unref (self->priv->sn_monitor_context); |
411 | + self->priv->sn_monitor_context = NULL; |
412 | + } |
413 | + |
414 | if (self->priv->windows) |
415 | g_list_free_full (self->priv->windows, g_object_unref); |
416 | |
417 | @@ -415,6 +471,33 @@ |
418 | |
419 | g_type_class_add_private (klass, sizeof (BamfLegacyScreenPrivate)); |
420 | |
421 | + legacy_screen_signals [WINDOW_OPENING] = |
422 | + g_signal_new (BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING, |
423 | + G_OBJECT_CLASS_TYPE (klass), |
424 | + G_SIGNAL_RUN_FIRST, |
425 | + G_STRUCT_OFFSET (BamfLegacyScreenClass, window_opening), |
426 | + NULL, NULL, NULL, |
427 | + G_TYPE_NONE, 1, |
428 | + G_TYPE_STRING); |
429 | + |
430 | + legacy_screen_signals [WINDOW_OPENING_COMPLETED] = |
431 | + g_signal_new (BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING_COMPLETED, |
432 | + G_OBJECT_CLASS_TYPE (klass), |
433 | + G_SIGNAL_RUN_FIRST, |
434 | + G_STRUCT_OFFSET (BamfLegacyScreenClass, window_opening_completed), |
435 | + NULL, NULL, NULL, |
436 | + G_TYPE_NONE, 1, |
437 | + G_TYPE_STRING); |
438 | + |
439 | + legacy_screen_signals [WINDOW_OPENING_CANCELED] = |
440 | + g_signal_new (BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING_CANCELED, |
441 | + G_OBJECT_CLASS_TYPE (klass), |
442 | + G_SIGNAL_RUN_FIRST, |
443 | + G_STRUCT_OFFSET (BamfLegacyScreenClass, window_opening_canceled), |
444 | + NULL, NULL, NULL, |
445 | + G_TYPE_NONE, 1, |
446 | + G_TYPE_STRING); |
447 | + |
448 | legacy_screen_signals [WINDOW_OPENED] = |
449 | g_signal_new (BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENED, |
450 | G_OBJECT_CLASS_TYPE (klass), |
451 | @@ -460,6 +543,11 @@ |
452 | |
453 | if (xevent->type == ClientMessage) |
454 | { |
455 | + if (sn_display_process_event (self->priv->sn_display, xevent)) |
456 | + { |
457 | + return GDK_FILTER_REMOVE; |
458 | + } |
459 | + |
460 | if (xevent->xclient.message_type == _COMPIZ_TOOLKIT_ACTION) |
461 | { |
462 | Atom msg = xevent->xclient.data.l[0]; |
463 | @@ -491,6 +579,7 @@ |
464 | bamf_legacy_screen_get_default () |
465 | { |
466 | BamfLegacyScreen *self; |
467 | + Display *dpy; |
468 | |
469 | if (static_screen) |
470 | return static_screen; |
471 | @@ -506,6 +595,15 @@ |
472 | |
473 | self->priv->legacy_screen = wnck_screen_get_default (); |
474 | |
475 | + dpy = gdk_x11_get_default_xdisplay (); |
476 | + |
477 | + self->priv->sn_display = sn_display_new (dpy, NULL, NULL); |
478 | + |
479 | + self->priv->sn_monitor_context = sn_monitor_context_new (self->priv->sn_display, |
480 | + DefaultScreen (dpy), |
481 | + handle_sn_monitor_event, |
482 | + self, NULL); |
483 | + |
484 | g_signal_connect (G_OBJECT (self->priv->legacy_screen), "window-opened", |
485 | (GCallback) handle_window_opened, self); |
486 | |
487 | @@ -517,7 +615,6 @@ |
488 | |
489 | if (g_strcmp0 (g_getenv ("XDG_CURRENT_DESKTOP"), "Unity") == 0) |
490 | { |
491 | - Display *dpy = gdk_x11_get_default_xdisplay (); |
492 | _COMPIZ_TOOLKIT_ACTION = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION", False); |
493 | _COMPIZ_TOOLKIT_ACTION_WINDOW_MENU = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", False); |
494 | gdk_window_add_filter (NULL, filter_compiz_messages, self); |
495 | |
496 | === modified file 'src/bamf-legacy-screen.h' |
497 | --- src/bamf-legacy-screen.h 2013-06-08 13:54:06 +0000 |
498 | +++ src/bamf-legacy-screen.h 2016-03-21 15:30:01 +0000 |
499 | @@ -32,10 +32,13 @@ |
500 | #define BAMF_IS_LEGACY_SCREEN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BAMF_TYPE_LEGACY_SCREEN)) |
501 | #define BAMF_LEGACY_SCREEN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BAMF_TYPE_LEGACY_SCREEN, BamfLegacyScreenClass)) |
502 | |
503 | -#define BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENED "window-opened" |
504 | -#define BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_CLOSED "window-closed" |
505 | -#define BAMF_LEGACY_SCREEN_SIGNAL_STACKING_CHANGED "stacking-changed" |
506 | -#define BAMF_LEGACY_SCREEN_SIGNAL_ACTIVE_WINDOW_CHANGED "active-window-changed" |
507 | +#define BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING "window-opening" |
508 | +#define BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING_CANCELED "window-opening-canceled" |
509 | +#define BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING_COMPLETED "window-opening-completed" |
510 | +#define BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENED "window-opened" |
511 | +#define BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_CLOSED "window-closed" |
512 | +#define BAMF_LEGACY_SCREEN_SIGNAL_STACKING_CHANGED "stacking-changed" |
513 | +#define BAMF_LEGACY_SCREEN_SIGNAL_ACTIVE_WINDOW_CHANGED "active-window-changed" |
514 | |
515 | typedef struct _BamfLegacyScreen BamfLegacyScreen; |
516 | typedef struct _BamfLegacyScreenClass BamfLegacyScreenClass; |
517 | @@ -48,10 +51,13 @@ |
518 | GList (*get_windows) (BamfLegacyScreen *legacy_screen); |
519 | |
520 | /*< signals >*/ |
521 | - void (*window_opened) (BamfLegacyScreen *legacy_screen, BamfLegacyWindow *legacy_window); |
522 | - void (*window_closed) (BamfLegacyScreen *legacy_screen, BamfLegacyWindow *legacy_window); |
523 | - void (*stacking_changed) (BamfLegacyScreen *legacy_screen); |
524 | - void (*active_window_changed) (BamfLegacyScreen *legacy_screen); |
525 | + void (*window_opening) (BamfLegacyScreen *legacy_screen, const gchar *desktop_file); |
526 | + void (*window_opening_completed) (BamfLegacyScreen *legacy_screen, const gchar *desktop_file); |
527 | + void (*window_opening_canceled) (BamfLegacyScreen *legacy_screen, const gchar *desktop_file); |
528 | + void (*window_opened) (BamfLegacyScreen *legacy_screen, BamfLegacyWindow *legacy_window); |
529 | + void (*window_closed) (BamfLegacyScreen *legacy_screen, BamfLegacyWindow *legacy_window); |
530 | + void (*stacking_changed) (BamfLegacyScreen *legacy_screen); |
531 | + void (*active_window_changed) (BamfLegacyScreen *legacy_screen); |
532 | }; |
533 | |
534 | struct _BamfLegacyScreen |
535 | |
536 | === modified file 'src/bamf-matcher.c' |
537 | --- src/bamf-matcher.c 2015-11-24 15:02:39 +0000 |
538 | +++ src/bamf-matcher.c 2016-03-21 15:30:01 +0000 |
539 | @@ -2197,6 +2197,18 @@ |
540 | } |
541 | |
542 | static void |
543 | +handle_window_opening (BamfLegacyScreen *screen, const gchar *desktop_id, BamfMatcher *self) |
544 | +{ |
545 | + bamf_matcher_set_starting_desktop_file (self, desktop_id, TRUE); |
546 | +} |
547 | + |
548 | +static void |
549 | +handle_window_opening_finished (BamfLegacyScreen *screen, const gchar *desktop_id, BamfMatcher *self) |
550 | +{ |
551 | + bamf_matcher_set_starting_desktop_file (self, desktop_id, FALSE); |
552 | +} |
553 | + |
554 | +static void |
555 | handle_window_opened (BamfLegacyScreen * screen, BamfLegacyWindow * window, BamfMatcher *self) |
556 | { |
557 | g_return_if_fail (BAMF_IS_MATCHER (self)); |
558 | @@ -2403,6 +2415,37 @@ |
559 | } |
560 | } |
561 | |
562 | +void |
563 | +bamf_matcher_set_starting_desktop_file (BamfMatcher *self, |
564 | + const char *desktop_file, |
565 | + gboolean starting) |
566 | +{ |
567 | + BamfApplication *app; |
568 | + |
569 | + g_return_if_fail (BAMF_IS_MATCHER (self)); |
570 | + g_return_if_fail (desktop_file != NULL); |
571 | + |
572 | + if (is_no_display_desktop (self, desktop_file) || is_autostart_desktop_file (desktop_file)) |
573 | + return; |
574 | + |
575 | + app = bamf_matcher_get_application_by_desktop_file (self, desktop_file); |
576 | + |
577 | + if (!BAMF_IS_APPLICATION (app) && starting) |
578 | + { |
579 | + app = bamf_application_new_from_desktop_file (desktop_file); |
580 | + |
581 | + if (!bamf_matcher_is_view_registered (self, BAMF_VIEW (app))) |
582 | + { |
583 | + bamf_matcher_register_view_stealing_ref (self, BAMF_VIEW (app)); |
584 | + } |
585 | + } |
586 | + |
587 | + if (BAMF_IS_APPLICATION (app)) |
588 | + { |
589 | + bamf_view_set_starting (BAMF_VIEW (app), starting); |
590 | + } |
591 | +} |
592 | + |
593 | const char * |
594 | bamf_matcher_get_desktop_file_class (BamfMatcher * self, const char * desktop_file) |
595 | { |
596 | @@ -3011,11 +3054,20 @@ |
597 | &(priv->desktop_class_table)); |
598 | |
599 | screen = bamf_legacy_screen_get_default (); |
600 | + g_signal_connect (G_OBJECT (screen), BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING, |
601 | + G_CALLBACK (handle_window_opening), self); |
602 | + |
603 | + g_signal_connect (G_OBJECT (screen), BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING_COMPLETED, |
604 | + G_CALLBACK (handle_window_opening_finished), self); |
605 | + |
606 | + g_signal_connect (G_OBJECT (screen), BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING_CANCELED, |
607 | + G_CALLBACK (handle_window_opening_finished), self); |
608 | + |
609 | g_signal_connect (G_OBJECT (screen), BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENED, |
610 | - (GCallback) handle_window_opened, self); |
611 | + G_CALLBACK (handle_window_opened), self); |
612 | |
613 | g_signal_connect (G_OBJECT (screen), BAMF_LEGACY_SCREEN_SIGNAL_STACKING_CHANGED, |
614 | - (GCallback) handle_stacking_changed, self); |
615 | + G_CALLBACK (handle_stacking_changed), self); |
616 | |
617 | XSetErrorHandler (x_error_handler); |
618 | |
619 | |
620 | === modified file 'src/bamf-matcher.h' |
621 | --- src/bamf-matcher.h 2015-02-02 10:01:42 +0000 |
622 | +++ src/bamf-matcher.h 2016-03-21 15:30:01 +0000 |
623 | @@ -74,6 +74,10 @@ |
624 | const char *application, |
625 | guint64 pid); |
626 | |
627 | +void bamf_matcher_set_starting_desktop_file (BamfMatcher * self, |
628 | + const char *desktop_file, |
629 | + gboolean starting); |
630 | + |
631 | const char * bamf_matcher_get_desktop_file_class (BamfMatcher * self, |
632 | const char * desktop_file); |
633 | |
634 | |
635 | === modified file 'src/bamf-view.c' |
636 | --- src/bamf-view.c 2014-01-09 16:24:53 +0000 |
637 | +++ src/bamf-view.c 2016-03-21 15:30:01 +0000 |
638 | @@ -28,6 +28,8 @@ |
639 | G_IMPLEMENT_INTERFACE (BAMF_DBUS_ITEM_TYPE_VIEW, |
640 | bamf_view_dbus_view_iface_init)); |
641 | |
642 | +#define STARTING_MAX_WAIT 15 |
643 | + |
644 | enum |
645 | { |
646 | PROP_0, |
647 | @@ -35,6 +37,7 @@ |
648 | PROP_NAME, |
649 | PROP_ICON, |
650 | PROP_ACTIVE, |
651 | + PROP_STARTING, |
652 | PROP_RUNNING, |
653 | PROP_URGENT, |
654 | PROP_USER_VISIBLE, |
655 | @@ -57,6 +60,7 @@ |
656 | /* FIXME: temporary cache these properties until we don't export the view |
657 | * to the bus, we need this until the skeleton won't be smart enough to emit |
658 | * signals as soon as the object is exported */ |
659 | + gboolean starting; |
660 | gboolean running; |
661 | gboolean user_visible; |
662 | gboolean urgent; |
663 | @@ -74,6 +78,7 @@ |
664 | GList * children; |
665 | GList * parents; |
666 | gboolean closed; |
667 | + guint starting_timeout; |
668 | |
669 | /* FIXME: remove this as soon as we move to properties on library as well */ |
670 | guint active_changed_idle; |
671 | @@ -144,6 +149,41 @@ |
672 | g_signal_emit_by_name (view, "user-visible-changed", user_visible); |
673 | } |
674 | |
675 | +static gboolean |
676 | +on_starting_timeout (gpointer data) |
677 | +{ |
678 | + BamfView *view = data; |
679 | + |
680 | + bamf_view_set_starting (view, FALSE); |
681 | + view->priv->starting_timeout = 0; |
682 | + |
683 | + return FALSE; |
684 | +} |
685 | + |
686 | +static void |
687 | +bamf_view_starting_changed (BamfView *view, gboolean starting) |
688 | +{ |
689 | + BamfViewPrivate *priv; |
690 | + |
691 | + g_return_if_fail (BAMF_IS_VIEW (view)); |
692 | + |
693 | + priv = view->priv; |
694 | + |
695 | + if (BAMF_VIEW_GET_CLASS (view)->starting_changed) |
696 | + { |
697 | + BAMF_VIEW_GET_CLASS (view)->starting_changed (view, starting); |
698 | + } |
699 | + |
700 | + if (priv->starting_timeout) |
701 | + { |
702 | + g_source_remove (priv->starting_timeout); |
703 | + priv->starting_timeout = 0; |
704 | + } |
705 | + |
706 | + if (starting) |
707 | + priv->starting_timeout = g_timeout_add_seconds (STARTING_MAX_WAIT, on_starting_timeout, view); |
708 | +} |
709 | + |
710 | static void |
711 | bamf_view_running_changed (BamfView *view, gboolean running) |
712 | { |
713 | @@ -157,6 +197,9 @@ |
714 | |
715 | if (emit) |
716 | g_signal_emit_by_name (view, "running-changed", running); |
717 | + |
718 | + if (running) |
719 | + bamf_view_set_starting (view, FALSE); |
720 | } |
721 | |
722 | static void |
723 | @@ -421,6 +464,19 @@ |
724 | } |
725 | |
726 | gboolean |
727 | +bamf_view_is_starting (BamfView *view) |
728 | +{ |
729 | + BAMF_VIEW_GET_PROPERTY (view, starting, FALSE); |
730 | +} |
731 | + |
732 | +void |
733 | +bamf_view_set_starting (BamfView *view, |
734 | + gboolean starting) |
735 | +{ |
736 | + BAMF_VIEW_SET_BOOL_PROPERTY (view, starting); |
737 | +} |
738 | + |
739 | +gboolean |
740 | bamf_view_is_running (BamfView *view) |
741 | { |
742 | BAMF_VIEW_GET_PROPERTY (view, running, FALSE); |
743 | @@ -516,6 +572,7 @@ |
744 | bamf_view_set_name (view, cache->name); |
745 | bamf_view_set_icon (view, cache->icon); |
746 | bamf_view_set_active (view, cache->active); |
747 | + bamf_view_set_starting (view, cache->starting); |
748 | bamf_view_set_running (view, cache->running); |
749 | bamf_view_set_user_visible (view, cache->user_visible); |
750 | bamf_view_set_urgent (view, cache->urgent); |
751 | @@ -785,6 +842,12 @@ |
752 | priv->parents = NULL; |
753 | } |
754 | |
755 | + if (priv->starting_timeout) |
756 | + { |
757 | + g_source_remove (priv->starting_timeout); |
758 | + priv->starting_timeout = 0; |
759 | + } |
760 | + |
761 | if (priv->active_changed_idle) |
762 | { |
763 | g_source_remove (priv->active_changed_idle); |
764 | @@ -829,6 +892,9 @@ |
765 | case PROP_USER_VISIBLE: |
766 | g_value_set_boolean (value, bamf_view_is_user_visible (view)); |
767 | break; |
768 | + case PROP_STARTING: |
769 | + g_value_set_boolean (value, bamf_view_is_starting (view)); |
770 | + break; |
771 | case PROP_RUNNING: |
772 | g_value_set_boolean (value, bamf_view_is_running (view)); |
773 | break; |
774 | @@ -923,6 +989,7 @@ |
775 | g_object_class_override_property (object_class, PROP_ICON, "icon"); |
776 | g_object_class_override_property (object_class, PROP_ACTIVE, "active"); |
777 | g_object_class_override_property (object_class, PROP_URGENT, "urgent"); |
778 | + g_object_class_override_property (object_class, PROP_STARTING, "starting"); |
779 | g_object_class_override_property (object_class, PROP_RUNNING, "running"); |
780 | g_object_class_override_property (object_class, PROP_USER_VISIBLE, "user-visible"); |
781 | |
782 | |
783 | === modified file 'src/bamf-view.h' |
784 | --- src/bamf-view.h 2013-06-19 20:06:12 +0000 |
785 | +++ src/bamf-view.h 2016-03-21 15:30:01 +0000 |
786 | @@ -47,6 +47,7 @@ |
787 | |
788 | /*< random stuff >*/ |
789 | gboolean (* urgent_changed) (BamfView *view, gboolean urgent); |
790 | + gboolean (* starting_changed) (BamfView *view, gboolean starting); |
791 | gboolean (* running_changed) (BamfView *view, gboolean running); |
792 | gboolean (* active_changed) (BamfView *view, gboolean active); |
793 | gboolean (* user_visible_changed) (BamfView *view, gboolean visible); |
794 | @@ -89,6 +90,9 @@ |
795 | gboolean bamf_view_is_active (BamfView *view); |
796 | void bamf_view_set_active (BamfView *view, gboolean active); |
797 | |
798 | +gboolean bamf_view_is_starting (BamfView *view); |
799 | +void bamf_view_set_starting (BamfView *view, gboolean starting); |
800 | + |
801 | gboolean bamf_view_is_running (BamfView *view); |
802 | void bamf_view_set_running (BamfView *view, gboolean running); |
803 | |
804 | |
805 | === modified file 'tests/bamfdaemon/Makefile.am' |
806 | --- tests/bamfdaemon/Makefile.am 2015-04-22 14:21:03 +0000 |
807 | +++ tests/bamfdaemon/Makefile.am 2016-03-21 15:30:01 +0000 |
808 | @@ -53,6 +53,7 @@ |
809 | $(GTK_CFLAGS) \ |
810 | $(GTOP_CFLAGS) \ |
811 | $(MAINTAINER_CFLAGS) \ |
812 | + $(SN_CFLAGS) \ |
813 | $(WNCK_CFLAGS) \ |
814 | $(X_CFLAGS) \ |
815 | $(NULL) |
816 | @@ -62,6 +63,7 @@ |
817 | $(GLIB_LIBS) \ |
818 | $(GTK_LIBS) \ |
819 | $(GTOP_LIBS) \ |
820 | + $(SN_LIBS) \ |
821 | $(WNCK_LIBS) \ |
822 | $(X_LIBS) \ |
823 | $(NULL) |
FAILED: Continuous integration, rev:628 jenkins. qa.ubuntu. com/job/ bamf-ci/ 123/ jenkins. qa.ubuntu. com/job/ bamf-xenial- amd64-ci/ 4/console jenkins. qa.ubuntu. com/job/ bamf-xenial- armhf-ci/ 4/console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/bamf- ci/123/ rebuild
http://