Compare commits

..

4 commits

Author SHA1 Message Date
David Cohen
14d12cfa49 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.
2026-04-29 09:30:17 +02:00
Simon Ser
4ba2f605f4 seat: change default seat name to "default" from "seat0"
"seat0" is confusing because it's the name used by logind for
physical seats. Logical Wayland seats are completely orthogonal to
login physical seats, so let's switch the name to reduce mixups a
bit.

See the discussion in https://github.com/cage-kiosk/cage/pull/497
2026-04-28 22:17:06 +02:00
Simon Ser
bed2ff5afe ci: use "meson setup" 2026-04-28 18:18:29 +02:00
Simon Ser
6d9a16e042 ci: use variables for package lists
Avoids duplicating these.
2026-04-28 18:18:29 +02:00
4 changed files with 50 additions and 37 deletions

View file

@ -7,6 +7,8 @@ on:
env: env:
WLROOTS_VERSION: "0.20" WLROOTS_VERSION: "0.20"
ALPINE_PACKAGES: "build-base xcb-util-wm-dev libseat-dev clang git eudev-dev mesa-dev libdrm-dev libinput-dev libxkbcommon-dev pixman-dev wayland-dev meson wayland-protocols xwayland-dev scdoc-doc hwdata libdisplay-info-dev"
ARCHLINUX_PACKAGES: "xcb-util-wm seatd git clang meson libinput libdrm mesa libxkbcommon wayland wayland-protocols xorg-server-xwayland scdoc libdisplay-info"
jobs: jobs:
compile: compile:
@ -26,20 +28,20 @@ jobs:
- name: Install dependencies (Alpine) - name: Install dependencies (Alpine)
if: "matrix.OS == 'alpine:edge'" if: "matrix.OS == 'alpine:edge'"
run: apk add build-base xcb-util-wm-dev libseat-dev clang git eudev-dev mesa-dev libdrm-dev libinput-dev libxkbcommon-dev pixman-dev wayland-dev meson wayland-protocols xwayland-dev scdoc-doc hwdata libdisplay-info-dev run: apk add $ALPINE_PACKAGES
- name: Install dependencies (Arch) - name: Install dependencies (Arch)
if: "matrix.OS == 'archlinux:base-devel'" if: "matrix.OS == 'archlinux:base-devel'"
run: | run: |
pacman-key --init pacman-key --init
pacman -Syu --noconfirm xcb-util-wm seatd git clang meson libinput libdrm mesa libxkbcommon wayland wayland-protocols xorg-server-xwayland scdoc libdisplay-info pacman -Syu --noconfirm $ARCHLINUX_PACKAGES
- name: Fetch wlroots as a subproject - name: Fetch wlroots as a subproject
run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION
- name: Compile Cage (XWayland=${{ matrix.xwayland }}) - name: Compile Cage (XWayland=${{ matrix.xwayland }})
run: | run: |
meson --fatal-meson-warnings --wrap-mode=nodownload \ meson setup --fatal-meson-warnings --wrap-mode=nodownload \
build-${{ matrix.CC }}-${{matrix.xwayland }} \ build-${{ matrix.CC }}-${{matrix.xwayland }} \
-Dwlroots:xwayland=${{ matrix.xwayland }} -Dwlroots:xwayland=${{ matrix.xwayland }}
ninja -C build-${{ matrix.CC }}-${{matrix.xwayland }} ninja -C build-${{ matrix.CC }}-${{matrix.xwayland }}
@ -53,12 +55,12 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
pacman-key --init pacman-key --init
pacman -Syu --noconfirm xcb-util-wm seatd git clang meson libinput libdrm mesa libxkbcommon wayland wayland-protocols xorg-server-xwayland scdoc hwdata libdisplay-info pacman -Syu --noconfirm $ARCHLINUX_PACKAGES
- name: Fetch wlroots as a subproject - name: Fetch wlroots as a subproject
run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION
- name: Check for formatting changes - name: Check for formatting changes
run: | run: |
meson --wrap-mode=nodownload build-clang-format -Dwlroots:xwayland=enabled meson setup --wrap-mode=nodownload build-clang-format -Dwlroots:xwayland=enabled
ninja -C build-clang-format clang-format-check ninja -C build-clang-format clang-format-check
scan-build: scan-build:
@ -72,10 +74,10 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
pacman-key --init pacman-key --init
pacman -Syu --noconfirm xcb-util-wm seatd git clang meson libinput libdrm mesa libxkbcommon wayland wayland-protocols xorg-server-xwayland scdoc hwdata libdisplay-info pacman -Syu --noconfirm $ARCHLINUX_PACKAGES
- name: Fetch wlroots as a subproject - name: Fetch wlroots as a subproject
run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION run: git clone https://gitlab.freedesktop.org/wlroots/wlroots.git subprojects/wlroots -b $WLROOTS_VERSION
- name: Run scan-build - name: Run scan-build
run: | run: |
meson --wrap-mode=nodownload build-scan-build -Dwlroots:xwayland=enabled meson setup --wrap-mode=nodownload build-scan-build -Dwlroots:xwayland=enabled
ninja -C build-scan-build scan-build ninja -C build-scan-build scan-build

16
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,7 +568,9 @@ 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 (server.enable_xwayland) {
xwayland = wlr_xwayland_create(server.wl_display, compositor, true);
if (!xwayland) { if (!xwayland) {
wlr_log(WLR_ERROR, "Cannot create XWayland server"); wlr_log(WLR_ERROR, "Cannot create XWayland server");
} else { } else {
@ -586,13 +594,15 @@ main(int argc, char *argv[])
if (!wlr_xcursor_manager_load(xcursor_manager, 1)) { if (!wlr_xcursor_manager_load(xcursor_manager, 1)) {
wlr_log(WLR_ERROR, "Cannot load XWayland XCursor theme"); wlr_log(WLR_ERROR, "Cannot load XWayland XCursor theme");
} }
struct wlr_xcursor *xcursor = wlr_xcursor_manager_get_xcursor(xcursor_manager, DEFAULT_XCURSOR, 1); struct wlr_xcursor *xcursor =
wlr_xcursor_manager_get_xcursor(xcursor_manager, DEFAULT_XCURSOR, 1);
if (xcursor) { if (xcursor) {
struct wlr_xcursor_image *image = xcursor->images[0]; struct wlr_xcursor_image *image = xcursor->images[0];
wlr_xwayland_set_cursor(xwayland, wlr_xcursor_image_get_buffer(image), image->hotspot_x, wlr_xwayland_set_cursor(xwayland, wlr_xcursor_image_get_buffer(image), image->hotspot_x,
image->hotspot_y); image->hotspot_y);
} }
} }
}
#endif #endif
const char *socket = wl_display_add_socket_auto(server.wl_display); const char *socket = wl_display_add_socket_auto(server.wl_display);

4
seat.c
View file

@ -816,9 +816,9 @@ seat_create(struct cg_server *server, struct wlr_backend *backend)
return NULL; return NULL;
} }
seat->seat = wlr_seat_create(server->wl_display, "seat0"); seat->seat = wlr_seat_create(server->wl_display, "default");
if (!seat->seat) { if (!seat->seat) {
wlr_log(WLR_ERROR, "Cannot allocate seat0"); wlr_log(WLR_ERROR, "Cannot allocate seat");
free(seat); free(seat);
return NULL; return NULL;
} }

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;