From a1fc3d20d381aa7e4a964c81c316e0fffbf0fcb3 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 30 Jul 2026 15:22:37 +1000 Subject: [PATCH] [client] wayland: allow seatless operation for github CI testing --- client/displayservers/Wayland/clipboard.c | 6 ++++++ client/displayservers/Wayland/input.c | 21 ++++++++++++++++++--- client/displayservers/Wayland/wayland.c | 2 +- client/displayservers/Wayland/wayland.h | 2 +- client/include/interface/displayserver.h | 1 + client/src/main.c | 1 + 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/client/displayservers/Wayland/clipboard.c b/client/displayservers/Wayland/clipboard.c index ea777a21..cb879e8d 100644 --- a/client/displayservers/Wayland/clipboard.c +++ b/client/displayservers/Wayland/clipboard.c @@ -342,6 +342,12 @@ bool waylandCBInit(void) { memset(&wlCb, 0, sizeof(wlCb)); + if (!wlWm.seat) + { + DEBUG_WARN("Clipboard unavailable without wl_seat"); + return false; + } + if (!wlWm.dataDeviceManager) { DEBUG_ERROR("Missing wl_data_device_manager interface (version 3+)"); diff --git a/client/displayservers/Wayland/input.c b/client/displayservers/Wayland/input.c index bbb71f63..402ecd08 100644 --- a/client/displayservers/Wayland/input.c +++ b/client/displayservers/Wayland/input.c @@ -405,10 +405,17 @@ static const struct wl_seat_listener seatListener = { .name = seatNameHandler, }; -bool waylandInputInit(void) +bool waylandInputInit(bool allowNoInput) { if (!wlWm.seat) { + if (allowNoInput) + { + DEBUG_WARN("Compositor missing wl_seat, input will be disabled"); + wlWm.warpSupport = false; + return true; + } + DEBUG_ERROR("Compositor missing wl_seat, will not proceed"); return false; } @@ -444,6 +451,9 @@ bool waylandInputInit(void) void waylandInputFree(void) { + if (!wlWm.seat) + return; + waylandUngrabPointer(); if (wlWm.pointer) @@ -468,7 +478,8 @@ void waylandInputFree(void) void waylandGrabPointer(void) { - if (!wlWm.relativePointerManager || !wlWm.pointerConstraints) + if (!wlWm.pointer || + !wlWm.relativePointerManager || !wlWm.pointerConstraints) return; if (!wlWm.warpSupport && !wlWm.relativePointer) @@ -493,6 +504,9 @@ void waylandGrabPointer(void) inline static void internalUngrabPointer(bool lock) { + if (!wlWm.pointer) + return; + if (lock) LG_LOCK(wlWm.surfaceLock); @@ -578,7 +592,8 @@ void waylandUncapturePointer(void) void waylandGrabKeyboard(void) { - if (wlWm.keyboardInhibitManager && !wlWm.keyboardInhibitor) + if (wlWm.seat && + wlWm.keyboardInhibitManager && !wlWm.keyboardInhibitor) { wlWm.keyboardInhibitor = zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts( wlWm.keyboardInhibitManager, wlWm.surface, wlWm.seat); diff --git a/client/displayservers/Wayland/wayland.c b/client/displayservers/Wayland/wayland.c index e72f1472..0a7d5201 100644 --- a/client/displayservers/Wayland/wayland.c +++ b/client/displayservers/Wayland/wayland.c @@ -166,7 +166,7 @@ static bool waylandInit(const LG_DSInitParams params) if (!waylandCursorInit()) return false; - if (!waylandInputInit()) + if (!waylandInputInit(params.allowNoInput)) return false; wlWm.desktop->setSize(params.w, params.h); diff --git a/client/displayservers/Wayland/wayland.h b/client/displayservers/Wayland/wayland.h index dfe369b0..2be2eba3 100644 --- a/client/displayservers/Wayland/wayland.h +++ b/client/displayservers/Wayland/wayland.h @@ -367,7 +367,7 @@ void waylandInhibitIdle(void); void waylandUninhibitIdle(void); // input module -bool waylandInputInit(void); +bool waylandInputInit(bool allowNoInput); void waylandInputFree(void); void waylandGrabKeyboard(void); void waylandGrabPointer(void); diff --git a/client/include/interface/displayserver.h b/client/include/interface/displayserver.h index de8e7e8f..650c0c18 100644 --- a/client/include/interface/displayserver.h +++ b/client/include/interface/displayserver.h @@ -116,6 +116,7 @@ typedef struct LG_DSInitParams bool borderless; bool maximize; bool largeCursorDot; + bool allowNoInput; // if true the renderer requires an OpenGL context bool opengl; diff --git a/client/src/main.c b/client/src/main.c index e512df40..093ac002 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -1288,6 +1288,7 @@ static int lg_run(void) .borderless = g_params.borderless, .maximize = g_params.maximize, .largeCursorDot = g_params.largeCursorDot, + .allowNoInput = strcmp(g_params.transport, "test") == 0, .opengl = needsOpenGL, .jitRender = g_params.jitRender };