From 15903829aa8f8553829770ce052dc165797738e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Fri, 29 Mar 2013 20:32:54 +0100 Subject: [PATCH] compositor: don't let weston terminate with dpms set to off if possible This will not catch the cases where weston crashes, but it's at least better than the current state. --- src/compositor.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index 1617d96..c3e6bed 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3236,10 +3236,15 @@ weston_version(int *major, int *minor, int *micro) static int on_term_signal(int signal_number, void *data) { - struct wl_display *display = data; + struct weston_compositor *ec = data; weston_log("caught signal %d\n", signal_number); - wl_display_terminate(display); + + /* Turn DPMS back on, so we're not left with a black screen */ + if (ec->state == WESTON_COMPOSITOR_SLEEPING) + weston_compositor_dpms(ec, WESTON_DPMS_ON); + + wl_display_terminate(ec->wl_display); return 1; } @@ -3571,15 +3576,9 @@ int main(int argc, char *argv[]) display = wl_display_create(); loop = wl_display_get_event_loop(display); - signals[0] = wl_event_loop_add_signal(loop, SIGTERM, on_term_signal, - display); - signals[1] = wl_event_loop_add_signal(loop, SIGINT, on_term_signal, - display); - signals[2] = wl_event_loop_add_signal(loop, SIGQUIT, on_term_signal, - display); wl_list_init(&child_process_list); - signals[3] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler, + signals[0] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler, NULL); if (!backend) { @@ -3604,6 +3603,13 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + signals[1] = wl_event_loop_add_signal(loop, SIGTERM, on_term_signal, + ec); + signals[2] = wl_event_loop_add_signal(loop, SIGINT, on_term_signal, + ec); + signals[3] = wl_event_loop_add_signal(loop, SIGQUIT, on_term_signal, + ec); + catch_signals(); segv_compositor = ec; @@ -3636,6 +3642,10 @@ int main(int argc, char *argv[]) wl_display_run(display); out: + /* Turn DPMS back on, so we're not left with a black screen */ + if (ec->state == WESTON_COMPOSITOR_SLEEPING) + weston_compositor_dpms(ec, WESTON_DPMS_ON); + /* prevent further rendering while shutting down */ ec->state = WESTON_COMPOSITOR_OFFSCREEN; -- 1.8.2