summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>2014-08-28 11:41:26 +0300
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2014-09-01 10:18:59 +0300
commit2e62e4ad710d86fb5410e81541fda2c98f97a190 (patch)
treed51ebcf6728218dfdc6fb16718b4694eb10b5b72
parent8e3fe08c4281205edb8380fceb9954a481c00858 (diff)
downloadweston-2e62e4ad710d86fb5410e81541fda2c98f97a190.tar.gz
shell: quit weston, if weston-desktop-shell dies early
If weston-desktop-shell dies soon after launch, or maybe cannot be executed at all, let weston exit rather than letting the user stare at a black screen. But, do not exit weston, if weston-desktop-shell dies later, as the user may already have apps open, and those apps would likely still function correctly. This gives the user the opportunity to save his work and close the apps properly. This should make one class of "I see only black screen" failures obvious. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
-rw-r--r--desktop-shell/shell.c32
-rw-r--r--desktop-shell/shell.h3
2 files changed, 34 insertions, 1 deletions
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index c21d3645..26f13cc7 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -5298,6 +5298,32 @@ shell_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy)
}
}
+static bool
+check_desktop_shell_crash_too_early(struct desktop_shell *shell)
+{
+ struct timespec now;
+
+ if (clock_gettime(CLOCK_MONOTONIC, &now) < 0)
+ return false;
+
+ /*
+ * If the shell helper client dies before the session has been
+ * up for roughly 30 seconds, better just make Weston shut down,
+ * because the user likely has no way to interact with the desktop
+ * anyway.
+ */
+ if (now.tv_sec - shell->startup_time.tv_sec < 30) {
+ weston_log("Error: %s apparently cannot run at all.\n",
+ shell->client);
+ weston_log_continue(STAMP_SPACE "Quitting...");
+ wl_display_terminate(shell->compositor->wl_display);
+
+ return true;
+ }
+
+ return false;
+}
+
static void launch_desktop_shell_process(void *data);
static void
@@ -5340,7 +5366,9 @@ desktop_shell_client_destroy(struct wl_listener *listener, void *data)
* returning.
*/
- respawn_desktop_shell_process(shell);
+ if (!check_desktop_shell_crash_too_early(shell))
+ respawn_desktop_shell_process(shell);
+
shell_fade_startup(shell);
}
@@ -6407,5 +6435,7 @@ module_init(struct weston_compositor *ec,
shell_fade_init(shell);
+ clock_gettime(CLOCK_MONOTONIC, &shell->startup_time);
+
return 0;
}
diff --git a/desktop-shell/shell.h b/desktop-shell/shell.h
index 67c5f50f..2cfd1d62 100644
--- a/desktop-shell/shell.h
+++ b/desktop-shell/shell.h
@@ -23,6 +23,7 @@
*/
#include <stdbool.h>
+#include <time.h>
#include "compositor.h"
@@ -209,6 +210,8 @@ struct desktop_shell {
enum desktop_shell_panel_position panel_position;
char *client;
+
+ struct timespec startup_time;
};
struct weston_output *