aboutsummaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-06-25 13:49:47 +0200
committerKenny Levinsen <kl@kl.wtf>2022-05-07 19:25:44 +0000
commitf575e445ec36dec5fe7f5674a4dae8096a833d6f (patch)
tree9b0a7594a5543ed99d205e1aee643169a60e5435 /xwayland
parent352064d76d459b499b39a99f889f96f40987f0e9 (diff)
xwayland: terminate when no client is connected
Automatically shutdown Xwayland 10s after all X11 clients have gone away.
Diffstat (limited to 'xwayland')
-rw-r--r--xwayland/meson.build6
-rw-r--r--xwayland/xwayland.c3
-rw-r--r--xwayland/xwm.c9
3 files changed, 18 insertions, 0 deletions
diff --git a/xwayland/meson.build b/xwayland/meson.build
index b7bbcaf1..4d8ed5f4 100644
--- a/xwayland/meson.build
+++ b/xwayland/meson.build
@@ -74,3 +74,9 @@ wlr_files += files(
)
wlr_deps += xwayland_libs
features += { 'xwayland': true }
+
+have = cc.has_function('xcb_xfixes_set_client_disconnect_mode', dependencies: xwayland_libs)
+add_project_arguments(
+ '-DHAS_XCB_XFIXES_SET_CLIENT_DISCONNECT_MODE=@0@'.format(have.to_int()),
+ language: 'c',
+)
diff --git a/xwayland/xwayland.c b/xwayland/xwayland.c
index e09b05cf..cb62fcc1 100644
--- a/xwayland/xwayland.c
+++ b/xwayland/xwayland.c
@@ -88,6 +88,9 @@ struct wlr_xwayland *wlr_xwayland_create(struct wl_display *wl_display,
struct wlr_xwayland_server_options options = {
.lazy = lazy,
.enable_wm = true,
+#if HAS_XCB_XFIXES_SET_CLIENT_DISCONNECT_MODE
+ .terminate_delay = lazy ? 10 : 0,
+#endif
};
xwayland->server = wlr_xwayland_server_create(wl_display, &options);
if (xwayland->server == NULL) {
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index a80e4764..b398f2ab 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -1842,6 +1842,7 @@ static void xwm_get_resources(struct wlr_xwm *xwm) {
wlr_log(WLR_DEBUG, "xfixes version: %" PRIu32 ".%" PRIu32,
xfixes_reply->major_version, xfixes_reply->minor_version);
+ xwm->xfixes_major_version = xfixes_reply->major_version;
free(xfixes_reply);
@@ -2103,6 +2104,14 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *xwayland, int wm_fd) {
sizeof(supported)/sizeof(*supported),
supported);
+#if HAS_XCB_XFIXES_SET_CLIENT_DISCONNECT_MODE
+ if (xwm->xwayland->server->options.terminate_delay > 0 &&
+ xwm->xfixes_major_version >= 6) {
+ xcb_xfixes_set_client_disconnect_mode(xwm->xcb_conn,
+ XCB_XFIXES_CLIENT_DISCONNECT_FLAGS_TERMINATE);
+ }
+#endif
+
xcb_flush(xwm->xcb_conn);
xwm_set_net_active_window(xwm, XCB_WINDOW_NONE);