cage: add -x flag to disable XWayland at runtime
Some checks failed
Continuous integration build / compile (clang, alpine:edge, disabled) (push) Has been cancelled
Continuous integration build / compile (clang, alpine:edge, enabled) (push) Has been cancelled
Continuous integration build / compile (clang, archlinux:base-devel, disabled) (push) Has been cancelled
Continuous integration build / compile (clang, archlinux:base-devel, enabled) (push) Has been cancelled
Continuous integration build / compile (gcc, alpine:edge, disabled) (push) Has been cancelled
Continuous integration build / compile (gcc, alpine:edge, enabled) (push) Has been cancelled
Continuous integration build / compile (gcc, archlinux:base-devel, disabled) (push) Has been cancelled
Continuous integration build / compile (gcc, archlinux:base-devel, enabled) (push) Has been cancelled
Continuous integration build / format (push) Has been cancelled
Continuous integration build / scan-build (push) Has been cancelled

Allows disabling XWayland support at runtime even when the binary was
built with it.
This commit is contained in:
David Cohen 2026-04-02 03:17:08 -05:00 committed by Simon Ser
parent 4ba2f605f4
commit 14d12cfa49
2 changed files with 39 additions and 28 deletions

66
cage.c
View file

@ -248,6 +248,7 @@ usage(FILE *file, const char *cage)
" -m last Use only the last connected output\n" " -m last Use only the last connected output\n"
" -s\t Allow VT switching\n" " -s\t Allow VT switching\n"
" -v\t Show the version number and exit\n" " -v\t Show the version number and exit\n"
" -x\t Disable XWayland\n"
"\n" "\n"
" Use -- when you want to pass arguments to APPLICATION\n", " Use -- when you want to pass arguments to APPLICATION\n",
cage); cage);
@ -256,8 +257,10 @@ usage(FILE *file, const char *cage)
static bool static bool
parse_args(struct cg_server *server, int argc, char *argv[]) parse_args(struct cg_server *server, int argc, char *argv[])
{ {
server->enable_xwayland = true;
int c; int c;
while ((c = getopt(argc, argv, "dDhm:sv")) != -1) { while ((c = getopt(argc, argv, "dDhm:svx")) != -1) {
switch (c) { switch (c) {
case 'd': case 'd':
server->xdg_decoration = true; server->xdg_decoration = true;
@ -281,6 +284,9 @@ parse_args(struct cg_server *server, int argc, char *argv[])
case 'v': case 'v':
fprintf(stdout, "Cage version " CAGE_VERSION "\n"); fprintf(stdout, "Cage version " CAGE_VERSION "\n");
exit(0); exit(0);
case 'x':
server->enable_xwayland = false;
break;
default: default:
usage(stderr, argv[0]); usage(stderr, argv[0]);
return false; return false;
@ -562,35 +568,39 @@ main(int argc, char *argv[])
#if CAGE_HAS_XWAYLAND #if CAGE_HAS_XWAYLAND
struct wlr_xcursor_manager *xcursor_manager = NULL; struct wlr_xcursor_manager *xcursor_manager = NULL;
struct wlr_xwayland *xwayland = wlr_xwayland_create(server.wl_display, compositor, true); struct wlr_xwayland *xwayland = NULL;
if (!xwayland) { if (server.enable_xwayland) {
wlr_log(WLR_ERROR, "Cannot create XWayland server"); xwayland = wlr_xwayland_create(server.wl_display, compositor, true);
} else { if (!xwayland) {
server.new_xwayland_surface.notify = handle_xwayland_surface_new; wlr_log(WLR_ERROR, "Cannot create XWayland server");
wl_signal_add(&xwayland->events.new_surface, &server.new_xwayland_surface);
xcursor_manager = wlr_xcursor_manager_create(DEFAULT_XCURSOR, XCURSOR_SIZE);
if (!xcursor_manager) {
wlr_log(WLR_ERROR, "Cannot create XWayland XCursor manager");
ret = 1;
goto end;
}
if (setenv("DISPLAY", xwayland->display_name, true) < 0) {
wlr_log_errno(WLR_ERROR,
"Unable to set DISPLAY for XWayland. Clients may not be able to connect");
} else { } else {
wlr_log(WLR_DEBUG, "XWayland is running on display %s", xwayland->display_name); server.new_xwayland_surface.notify = handle_xwayland_surface_new;
} wl_signal_add(&xwayland->events.new_surface, &server.new_xwayland_surface);
if (!wlr_xcursor_manager_load(xcursor_manager, 1)) { xcursor_manager = wlr_xcursor_manager_create(DEFAULT_XCURSOR, XCURSOR_SIZE);
wlr_log(WLR_ERROR, "Cannot load XWayland XCursor theme"); if (!xcursor_manager) {
} wlr_log(WLR_ERROR, "Cannot create XWayland XCursor manager");
struct wlr_xcursor *xcursor = wlr_xcursor_manager_get_xcursor(xcursor_manager, DEFAULT_XCURSOR, 1); ret = 1;
if (xcursor) { goto end;
struct wlr_xcursor_image *image = xcursor->images[0]; }
wlr_xwayland_set_cursor(xwayland, wlr_xcursor_image_get_buffer(image), image->hotspot_x,
image->hotspot_y); if (setenv("DISPLAY", xwayland->display_name, true) < 0) {
wlr_log_errno(WLR_ERROR,
"Unable to set DISPLAY for XWayland. Clients may not be able to connect");
} else {
wlr_log(WLR_DEBUG, "XWayland is running on display %s", xwayland->display_name);
}
if (!wlr_xcursor_manager_load(xcursor_manager, 1)) {
wlr_log(WLR_ERROR, "Cannot load XWayland XCursor theme");
}
struct wlr_xcursor *xcursor =
wlr_xcursor_manager_get_xcursor(xcursor_manager, DEFAULT_XCURSOR, 1);
if (xcursor) {
struct wlr_xcursor_image *image = xcursor->images[0];
wlr_xwayland_set_cursor(xwayland, wlr_xcursor_image_get_buffer(image), image->hotspot_x,
image->hotspot_y);
}
} }
} }
#endif #endif

View file

@ -72,6 +72,7 @@ struct cg_server {
bool xdg_decoration; bool xdg_decoration;
bool allow_vt_switch; bool allow_vt_switch;
bool enable_xwayland;
bool return_app_code; bool return_app_code;
bool terminated; bool terminated;
enum wlr_log_importance log_level; enum wlr_log_importance log_level;