diff options
Diffstat (limited to 'xwayland')
| -rw-r--r-- | xwayland/meson.build | 6 | ||||
| -rw-r--r-- | xwayland/xwayland.c | 3 | ||||
| -rw-r--r-- | xwayland/xwm.c | 9 | 
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); | 
