From 352064d76d459b499b39a99f889f96f40987f0e9 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Fri, 25 Jun 2021 12:00:26 +0200 Subject: [PATCH] xwayland: add wlr_xwayland_server_options.terminate_delay This allows users to specify a delay after which the Xwayland process terminates itself when there are no more X11 clients connected. --- include/wlr/xwayland.h | 1 + include/xwayland/meson.build | 3 +++ xwayland/server.c | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h index d4a48393..165ea944 100644 --- a/include/wlr/xwayland.h +++ b/include/wlr/xwayland.h @@ -24,6 +24,7 @@ struct wlr_xwayland_server_options { bool lazy; bool enable_wm; bool no_touch_pointer_emulation; + int terminate_delay; // in seconds, 0 to terminate immediately }; struct wlr_xwayland_server { diff --git a/include/xwayland/meson.build b/include/xwayland/meson.build index 1dad9259..adec52fc 100644 --- a/include/xwayland/meson.build +++ b/include/xwayland/meson.build @@ -1,11 +1,13 @@ have_listenfd = false have_no_touch_pointer_emulation = false +have_terminate_delay = false if xwayland.found() xwayland_path = xwayland.get_variable('xwayland') have_listenfd = xwayland.get_variable('have_listenfd', default_value: 'false') == 'true' have_no_touch_pointer_emulation = xwayland.get_variable( 'have_no_touch_pointer_emulation', default_value: 'false') == 'true' + have_terminate_delay = xwayland.get_variable(pkgconfig: 'have_terminate_delay') == 'true' else xwayland_path = xwayland_prog.full_path() endif @@ -14,6 +16,7 @@ xwayland_config_data = configuration_data() xwayland_config_data.set_quoted('XWAYLAND_PATH', xwayland_path) xwayland_config_data.set10('HAVE_XWAYLAND_LISTENFD', have_listenfd) xwayland_config_data.set10('HAVE_XWAYLAND_NO_TOUCH_POINTER_EMULATION', have_no_touch_pointer_emulation) +xwayland_config_data.set10('HAVE_XWAYLAND_TERMINATE_DELAY', have_terminate_delay) configure_file( output: 'config.h', configuration: xwayland_config_data, diff --git a/xwayland/server.c b/xwayland/server.c index e0cf5aa5..8502fcec 100644 --- a/xwayland/server.c +++ b/xwayland/server.c @@ -49,9 +49,18 @@ noreturn static void exec_xwayland(struct wlr_xwayland_server *server, argv[i++] = "Xwayland"; argv[i++] = server->display_name; argv[i++] = "-rootless"; - argv[i++] = "-terminate"; argv[i++] = "-core"; + argv[i++] = "-terminate"; +#if HAVE_XWAYLAND_TERMINATE_DELAY + char terminate_delay[16]; + if (server->options.terminate_delay > 0) { + snprintf(terminate_delay, sizeof(terminate_delay), "%d", + server->options.terminate_delay); + argv[i++] = terminate_delay; + } +#endif + #if HAVE_XWAYLAND_LISTENFD argv[i++] = "-listenfd"; argv[i++] = listenfd0; @@ -436,6 +445,10 @@ struct wlr_xwayland_server *wlr_xwayland_server_create( server->wl_display = wl_display; server->options = *options; +#if !HAVE_XWAYLAND_TERMINATE_DELAY + server->options.terminate_delay = 0; +#endif + server->x_fd[0] = server->x_fd[1] = -1; server->wl_fd[0] = server->wl_fd[1] = -1; server->wm_fd[0] = server->wm_fd[1] = -1;