Merge lp:~azzar1/bamf/bamf-sn into lp:bamf

Proposed by Andrea Azzarone
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
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.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Marco Trevisan (Treviño) (3v1n0) wrote :

Wondering why we can't just use org.gtk.gio.DesktopAppInfo signal instead of SN?

This could have been implemented just for a BamfApplication, but that's fine for a view as well.

In case of SN_MONITOR_EVENT_CANCELED: We should set the starting to false.
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-notification0-dev as build-dependency
 debian/changelog: bump version
 debian/libbamf3-2.symbols: add new symbols (use 0replaceme for versioning, see previous examples)

review: Needs Fixing
lp:~azzar1/bamf/bamf-sn updated
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.

Revision history for this message
Andrea Azzarone (azzar1) wrote :

Done.

review: Needs Resubmitting
lp:~azzar1/bamf/bamf-sn updated
631. By Andrea Azzarone

Properly bump version.

632. By Andrea Azzarone

And again.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
lp:~azzar1/bamf/bamf-sn updated
633. By Andrea Azzarone

Properly remove deprecated methods.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
lp:~azzar1/bamf/bamf-sn updated
634. By Andrea Azzarone

Merge with lp:~3v1n0/bamf/sn-fixes

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

Good to go

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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)

Subscribers

People subscribed via source and target branches

to all changes: