mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-25 22:25:58 +01:00
xwayland: terminate when no client is connected
Automatically shutdown Xwayland 10s after all X11 clients have gone away.
This commit is contained in:
parent
352064d76d
commit
f575e445ec
4 changed files with 19 additions and 0 deletions
|
@ -122,6 +122,7 @@ struct wlr_xwm {
|
||||||
|
|
||||||
const xcb_query_extension_reply_t *xfixes;
|
const xcb_query_extension_reply_t *xfixes;
|
||||||
const xcb_query_extension_reply_t *xres;
|
const xcb_query_extension_reply_t *xres;
|
||||||
|
uint32_t xfixes_major_version;
|
||||||
#if HAS_XCB_ERRORS
|
#if HAS_XCB_ERRORS
|
||||||
xcb_errors_context_t *errors_context;
|
xcb_errors_context_t *errors_context;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -74,3 +74,9 @@ wlr_files += files(
|
||||||
)
|
)
|
||||||
wlr_deps += xwayland_libs
|
wlr_deps += xwayland_libs
|
||||||
features += { 'xwayland': true }
|
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',
|
||||||
|
)
|
||||||
|
|
|
@ -88,6 +88,9 @@ struct wlr_xwayland *wlr_xwayland_create(struct wl_display *wl_display,
|
||||||
struct wlr_xwayland_server_options options = {
|
struct wlr_xwayland_server_options options = {
|
||||||
.lazy = lazy,
|
.lazy = lazy,
|
||||||
.enable_wm = true,
|
.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);
|
xwayland->server = wlr_xwayland_server_create(wl_display, &options);
|
||||||
if (xwayland->server == NULL) {
|
if (xwayland->server == NULL) {
|
||||||
|
|
|
@ -1842,6 +1842,7 @@ static void xwm_get_resources(struct wlr_xwm *xwm) {
|
||||||
|
|
||||||
wlr_log(WLR_DEBUG, "xfixes version: %" PRIu32 ".%" PRIu32,
|
wlr_log(WLR_DEBUG, "xfixes version: %" PRIu32 ".%" PRIu32,
|
||||||
xfixes_reply->major_version, xfixes_reply->minor_version);
|
xfixes_reply->major_version, xfixes_reply->minor_version);
|
||||||
|
xwm->xfixes_major_version = xfixes_reply->major_version;
|
||||||
|
|
||||||
free(xfixes_reply);
|
free(xfixes_reply);
|
||||||
|
|
||||||
|
@ -2103,6 +2104,14 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *xwayland, int wm_fd) {
|
||||||
sizeof(supported)/sizeof(*supported),
|
sizeof(supported)/sizeof(*supported),
|
||||||
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);
|
xcb_flush(xwm->xcb_conn);
|
||||||
|
|
||||||
xwm_set_net_active_window(xwm, XCB_WINDOW_NONE);
|
xwm_set_net_active_window(xwm, XCB_WINDOW_NONE);
|
||||||
|
|
Loading…
Reference in a new issue