shell-app: Finish startup sequence for process that exit too early

If a process associated to an application declaring StartupNotify=true
in its desktop file exits before having ever mapped a top level window,
the "remove" X message expected as per the Startup Notification Spec [1]
won't ever be issued, and the shell will keep waiting for a while until
the sequence is finished on time out.

This provides a confusing and bad experience since things like a confusing
icon + a spinner, or the mouse pointer switching to a spinning cursor, will
be showing up in the meantime, so we need to detect those situations and
make sure the sequence gets completed, and the app moved to STOPPED.

[1] https://www.freedesktop.org/wiki/Specifications/startup-notification-spec

Closes: #267
This commit is contained in:
Mario Sanchez Prada 2018-05-11 13:36:02 +01:00
parent 6ee13ff685
commit 969db82f5a

View File

@ -1190,12 +1190,37 @@ app_child_setup (gpointer user_data)
}
#endif
static void
_shell_app_watch_callback (GPid pid,
gint status,
ShellApp *app)
{
if (app->state == SHELL_APP_STATE_STARTING)
{
ShellWindowTracker *tracker = shell_window_tracker_get_default ();
GSList *startup_sequences = shell_window_tracker_get_startup_sequences (tracker);
GSList *iter = NULL;
for (iter = startup_sequences; iter; iter = g_slist_next (iter))
{
ShellStartupSequence *sequence = (ShellStartupSequence*) iter->data;
ShellApp *startup_app = shell_startup_sequence_get_app (sequence);
if (startup_app == app)
shell_startup_sequence_complete (sequence);
}
shell_app_state_transition (app, SHELL_APP_STATE_STOPPED);
}
g_spawn_close_pid (pid);
}
static void
wait_pid (GDesktopAppInfo *appinfo,
GPid pid,
gpointer user_data)
ShellApp *app)
{
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
g_child_watch_add (pid, (GChildWatchFunc) _shell_app_watch_callback, app);
}
/**
@ -1242,7 +1267,8 @@ shell_app_launch (ShellApp *app,
#else
NULL, NULL,
#endif
wait_pid, NULL,
(GDesktopAppLaunchCallback) wait_pid,
app,
error);
g_object_unref (context);