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 +#include #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 *