diff -Nru bamf-0.5.3~bzr0+16.04.20160523/debian/bamfdaemon.triggers bamf-0.5.3~bzr0+16.04.20160701/debian/bamfdaemon.triggers --- bamf-0.5.3~bzr0+16.04.20160523/debian/bamfdaemon.triggers 2016-07-11 17:57:16.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/debian/bamfdaemon.triggers 2016-07-11 17:57:16.000000000 +0000 @@ -1,2 +1,2 @@ -interest /usr/share/applications -interest gmenucache +interest-noawait /usr/share/applications +interest-noawait gmenucache diff -Nru bamf-0.5.3~bzr0+16.04.20160523/debian/changelog bamf-0.5.3~bzr0+16.04.20160701/debian/changelog --- bamf-0.5.3~bzr0+16.04.20160523/debian/changelog 2016-07-11 17:57:16.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/debian/changelog 2016-07-11 17:57:16.000000000 +0000 @@ -1,3 +1,18 @@ +bamf (0.5.3~bzr0+16.04.20160701-0ubuntu1) xenial; urgency=medium + + [ Marco Trevisan (Treviño) ] + * BamfMatcher: allow overriding desktop with the environment var + BAMF_DESKTOP_FILE_HINT + + [ Andrea Azzarone ] + * Daemon: manually set to complete the startup notification on view + state change (LP: #1582430) + + [ Marco Trevisan (Treviño) ] + * debian/bamfdaemon.triggers: use interest-noawait (LP: #1589097) + + -- Marco Trevisan (Treviño) Fri, 01 Jul 2016 10:44:07 +0000 + bamf (0.5.3~bzr0+16.04.20160523-0ubuntu1) xenial; urgency=medium * bamfdaemon-dbus-runner: don't try to start again if already running diff -Nru bamf-0.5.3~bzr0+16.04.20160523/src/bamf-control.c bamf-0.5.3~bzr0+16.04.20160701/src/bamf-control.c --- bamf-0.5.3~bzr0+16.04.20160523/src/bamf-control.c 2016-05-23 18:05:04.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/src/bamf-control.c 2016-07-01 10:43:43.000000000 +0000 @@ -54,7 +54,7 @@ g_variant_get_child (parameters, 0, "^&ay", &desktop_file); g_variant_get_child (parameters, 2, "x", &pid); - bamf_matcher_set_starting_desktop_file (matcher, desktop_file, TRUE); + bamf_matcher_set_starting_desktop_file (matcher, desktop_file, NULL, TRUE); bamf_matcher_register_desktop_file_for_pid (matcher, desktop_file, pid); } diff -Nru bamf-0.5.3~bzr0+16.04.20160523/src/bamf-legacy-screen.c bamf-0.5.3~bzr0+16.04.20160701/src/bamf-legacy-screen.c --- bamf-0.5.3~bzr0+16.04.20160523/src/bamf-legacy-screen.c 2016-05-23 18:05:04.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/src/bamf-legacy-screen.c 2016-07-01 10:43:43.000000000 +0000 @@ -258,7 +258,7 @@ { SnStartupSequence *sequence = sn_monitor_event_get_startup_sequence (event); const gchar *app_id = sn_startup_sequence_get_application_id (sequence); - g_signal_emit (self, legacy_screen_signals[WINDOW_OPENING], 0, app_id); + g_signal_emit (self, legacy_screen_signals[WINDOW_OPENING], 0, app_id, sequence); } break; case SN_MONITOR_EVENT_COMPLETED: @@ -477,8 +477,8 @@ G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (BamfLegacyScreenClass, window_opening), NULL, NULL, NULL, - G_TYPE_NONE, 1, - G_TYPE_STRING); + G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_POINTER); legacy_screen_signals [WINDOW_OPENING_COMPLETED] = g_signal_new (BAMF_LEGACY_SCREEN_SIGNAL_WINDOW_OPENING_COMPLETED, diff -Nru bamf-0.5.3~bzr0+16.04.20160523/src/bamf-legacy-window.c bamf-0.5.3~bzr0+16.04.20160701/src/bamf-legacy-window.c --- bamf-0.5.3~bzr0+16.04.20160523/src/bamf-legacy-window.c 2016-05-23 18:05:04.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/src/bamf-legacy-window.c 2016-07-01 10:43:43.000000000 +0000 @@ -194,7 +194,7 @@ pid = bamf_legacy_window_get_pid (self); - if (pid <= 0) + if (pid < 2) return NULL; stat_path = g_strdup_printf ("/proc/%i/status", pid); diff -Nru bamf-0.5.3~bzr0+16.04.20160523/src/bamf-matcher.c bamf-0.5.3~bzr0+16.04.20160701/src/bamf-matcher.c --- bamf-0.5.3~bzr0+16.04.20160523/src/bamf-matcher.c 2016-05-23 18:05:04.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/src/bamf-matcher.c 2016-07-01 10:43:43.000000000 +0000 @@ -30,6 +30,8 @@ #include #define BAMF_INDEX_NAME "bamf-2.index" +#define EXEC_DESKTOP_FILE_OVERRIDE "--desktop_file_hint" +#define ENV_DESKTOP_FILE_OVERRIDE "BAMF_DESKTOP_FILE_HINT" G_DEFINE_TYPE (BamfMatcher, bamf_matcher, BAMF_DBUS_TYPE_MATCHER_SKELETON); #define BAMF_MATCHER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \ @@ -79,8 +81,6 @@ "com-sun-javaws-Main", "VCLSalFrame" }; -const gchar * EXEC_DESKTOP_FILE_OVERRIDE = "--desktop_file_hint"; - static void on_view_active_changed (BamfView *view, gboolean active, BamfMatcher *matcher) { @@ -556,6 +556,49 @@ return result; } +char * +get_env_overridden_desktop_file (guint pid) +{ + gchar *environ_file; + gchar *environ; + gchar *result; + gsize file_len; + gint i; + + if (pid < 2) + return NULL; + + environ = NULL; + result = NULL; + environ_file = g_strdup_printf ("/proc/%u/environ", pid); + + if (g_file_get_contents (environ_file, &environ, &file_len, NULL)) + { + for (i = 0; i < file_len && environ && environ[i] != '\0'; i += strlen (environ + i) + 1) + { + const gchar *var = environ + i; + + if (g_str_has_prefix (var, ENV_DESKTOP_FILE_OVERRIDE"=")) + { + const gchar *file_path; + file_path = var + sizeof (ENV_DESKTOP_FILE_OVERRIDE); + + if (g_str_has_suffix (file_path, ".desktop") && + g_file_test (file_path, G_FILE_TEST_EXISTS|G_FILE_TEST_IS_REGULAR)) + { + result = g_strdup (file_path); + break; + } + } + } + } + + g_free (environ); + g_free (environ_file); + + return result; +} + static GList * pid_parent_tree (BamfMatcher *self, guint pid) { @@ -1670,8 +1713,17 @@ g_free (desktop_file); } } - else + + if (!desktop_files) { + gint pid = bamf_legacy_window_get_pid (window); + desktop_file = get_env_overridden_desktop_file (pid); + + if (desktop_file) + { + desktop_files = g_list_prepend (desktop_files, desktop_file); + } + const char *exec_string = bamf_legacy_window_get_exec_string (window); desktop_file = get_exec_overridden_desktop_file (exec_string); @@ -1679,7 +1731,8 @@ { desktop_files = g_list_prepend (desktop_files, desktop_file); } - else + + if (!desktop_files) { app_id = bamf_legacy_window_get_hint (window, _GTK_APPLICATION_ID); @@ -2197,15 +2250,15 @@ } static void -handle_window_opening (BamfLegacyScreen *screen, const gchar *desktop_id, BamfMatcher *self) +handle_window_opening (BamfLegacyScreen *screen, const gchar *desktop_id, SnStartupSequence *startup_sequence, BamfMatcher *self) { - bamf_matcher_set_starting_desktop_file (self, desktop_id, TRUE); + bamf_matcher_set_starting_desktop_file (self, desktop_id, startup_sequence, TRUE); } static void handle_window_opening_finished (BamfLegacyScreen *screen, const gchar *desktop_id, BamfMatcher *self) { - bamf_matcher_set_starting_desktop_file (self, desktop_id, FALSE); + bamf_matcher_set_starting_desktop_file (self, desktop_id, NULL, FALSE); } static void @@ -2446,6 +2499,7 @@ void bamf_matcher_set_starting_desktop_file (BamfMatcher *self, const char *desktop_file, + SnStartupSequence *startup_sequence, gboolean starting) { BamfApplication *app; @@ -2470,7 +2524,7 @@ if (BAMF_IS_APPLICATION (app)) { - bamf_view_set_starting (BAMF_VIEW (app), starting); + bamf_view_set_starting (BAMF_VIEW (app), startup_sequence, starting); } } diff -Nru bamf-0.5.3~bzr0+16.04.20160523/src/bamf-matcher.h bamf-0.5.3~bzr0+16.04.20160701/src/bamf-matcher.h --- bamf-0.5.3~bzr0+16.04.20160523/src/bamf-matcher.h 2016-05-23 18:05:04.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/src/bamf-matcher.h 2016-07-01 10:43:43.000000000 +0000 @@ -76,6 +76,7 @@ void bamf_matcher_set_starting_desktop_file (BamfMatcher * self, const char *desktop_file, + SnStartupSequence *sequence, gboolean starting); const char * bamf_matcher_get_desktop_file_class (BamfMatcher * self, diff -Nru bamf-0.5.3~bzr0+16.04.20160523/src/bamf-view.c bamf-0.5.3~bzr0+16.04.20160701/src/bamf-view.c --- bamf-0.5.3~bzr0+16.04.20160523/src/bamf-view.c 2016-05-23 18:05:04.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/src/bamf-view.c 2016-07-01 10:43:43.000000000 +0000 @@ -78,6 +78,8 @@ gboolean closed; guint starting_timeout; + SnStartupSequence *startup_sequence; + /* FIXME: remove this as soon as we move to properties on library as well */ guint active_changed_idle; }; @@ -115,6 +117,9 @@ guint idle = g_idle_add_full (G_PRIORITY_DEFAULT, on_active_changed_idle, view, NULL); view->priv->active_changed_idle = idle; } + + if (active) + bamf_view_set_starting (view, NULL, FALSE); } static void @@ -152,7 +157,7 @@ { BamfView *view = data; - bamf_view_set_starting (view, FALSE); + bamf_view_set_starting (view, NULL, FALSE); view->priv->starting_timeout = 0; return FALSE; @@ -197,7 +202,7 @@ g_signal_emit_by_name (view, "running-changed", running); if (running) - bamf_view_set_starting (view, FALSE); + bamf_view_set_starting (view, NULL, FALSE); } static void @@ -213,6 +218,9 @@ if (emit) g_signal_emit_by_name (view, "urgent-changed", urgent); + + if (urgent) + bamf_view_set_starting (view, NULL, FALSE); } void @@ -480,8 +488,33 @@ void bamf_view_set_starting (BamfView *view, + SnStartupSequence *startup_sequence, gboolean starting) { + if (!bamf_view_is_starting (view) && starting) + { + if (view->priv->startup_sequence) + { + sn_startup_sequence_unref (view->priv->startup_sequence); + view->priv->startup_sequence = NULL; + } + + if (startup_sequence) + { + view->priv->startup_sequence = startup_sequence; + sn_startup_sequence_ref (view->priv->startup_sequence); + } + } + else if (!starting) + { + if (view->priv->startup_sequence) + { + sn_startup_sequence_complete (view->priv->startup_sequence); + sn_startup_sequence_unref (view->priv->startup_sequence); + view->priv->startup_sequence = NULL; + } + } + BAMF_VIEW_SET_BOOL_PROPERTY (view, starting); } @@ -581,7 +614,7 @@ bamf_view_set_name (view, cache->name); bamf_view_set_icon (view, cache->icon); bamf_view_set_active (view, cache->active); - bamf_view_set_starting (view, cache->starting); + bamf_view_set_starting (view, NULL, cache->starting); bamf_view_set_running (view, cache->running); bamf_view_set_user_visible (view, cache->user_visible); bamf_view_set_urgent (view, cache->urgent); @@ -863,6 +896,12 @@ priv->active_changed_idle = 0; } + if (priv->startup_sequence) + { + sn_startup_sequence_unref (priv->startup_sequence); + priv->startup_sequence = NULL; + } + bamf_view_cached_properties_clear (view); g_dbus_object_skeleton_flush (G_DBUS_OBJECT_SKELETON (view)); @@ -931,6 +970,8 @@ self->priv->dbus_iface = _bamf_dbus_item_view_skeleton_new (); self->priv->props = g_new0 (BamfViewPropCache, 1); + self->priv->startup_sequence = NULL; + /* We need to connect to the object own signals to redirect them to the dbus * interface */ g_signal_connect (self, "active-changed", G_CALLBACK (on_view_active_changed), NULL); diff -Nru bamf-0.5.3~bzr0+16.04.20160523/src/bamf-view.h bamf-0.5.3~bzr0+16.04.20160701/src/bamf-view.h --- bamf-0.5.3~bzr0+16.04.20160523/src/bamf-view.h 2016-05-23 18:05:04.000000000 +0000 +++ bamf-0.5.3~bzr0+16.04.20160701/src/bamf-view.h 2016-07-01 10:43:43.000000000 +0000 @@ -25,6 +25,10 @@ #include #include +#define SN_API_NOT_YET_FROZEN +#include +#undef SN_API_NOT_YET_FROZEN + #define BAMF_TYPE_VIEW (bamf_view_get_type ()) #define BAMF_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BAMF_TYPE_VIEW, BamfView)) #define BAMF_IS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BAMF_TYPE_VIEW)) @@ -89,7 +93,7 @@ void bamf_view_set_active (BamfView *view, gboolean active); gboolean bamf_view_is_starting (BamfView *view); -void bamf_view_set_starting (BamfView *view, gboolean starting); +void bamf_view_set_starting (BamfView *view, SnStartupSequence *startup_sequence, gboolean starting); gboolean bamf_view_is_running (BamfView *view); void bamf_view_set_running (BamfView *view, gboolean running);