pure Wayland build: conditionally compile wl_xdisplay.c/wl_xwayland.c behind USE_XWAYLAND, add stubs in wl_stubs.c, guard XWayland handler registration in wl_backend.c

This commit is contained in:
Window Maker 2026-06-05 19:55:28 +02:00
parent b546e9505d
commit 31b621bbd2
3 changed files with 21 additions and 11 deletions

View File

@ -185,7 +185,6 @@ wmaker_SOURCES += \
backend/wayland/wl_screen.c \
backend/wayland/wl_shm.c \
backend/wayland/wl_wings.c \
backend/wayland/wl_xdisplay.c \
backend/wayland/wl_stubs.c \
backend/wayland/wl_clipboard.c \
backend/wayland/wl_dnd.c \
@ -202,7 +201,6 @@ wmaker_SOURCES += \
backend/wayland/wl_output_mgmt.c \
backend/wayland/wl_output.c \
backend/wayland/wl_xdg.c \
backend/wayland/wl_xwayland.c \
backend/wayland/wl_dock.c \
backend/wayland/wl_layer_shell.c \
backend/wayland/wl_handlers.c \
@ -211,6 +209,7 @@ wmaker_SOURCES += \
backend/wayland/wl_input_fwd.c
endif
if USE_NESTED_FUNC
wmaker_SOURCES += misc.c \
xmodifier.c
@ -240,11 +239,12 @@ AM_CPPFLAGS = $(DFLAGS) \
-I$(srcdir)/backend/wayland \
@HEADER_SEARCH_PATH@
if USE_XWAYLAND
wmaker_SOURCES += backend/wayland/wl_xdisplay.c backend/wayland/wl_xwayland.c
AM_CPPFLAGS += -DUSE_XWAYLAND
endif
wmaker_LDADD = \
$(top_builddir)/WINGs/libWINGs.la\
$(top_builddir)/WINGs/libWUtil.la\

View File

@ -223,9 +223,11 @@ static void handle_layer_shell_new_surface(struct wl_listener *listener, void *d
extern void handle_xdg_new_toplevel(struct wl_listener *listener, void *data);
extern void handle_new_toplevel_decoration(struct wl_listener *listener, void *data);
extern void handle_virtual_pointer_new(struct wl_listener *listener, void *data);
#ifdef USE_XWAYLAND
extern void handle_xwayland_new_surface(struct wl_listener *listener, void *data);
extern void handle_xwayland_ready(struct wl_listener *listener, void *data);
extern void handle_xwayland_server_destroy(struct wl_listener *listener, void *data);
#endif
extern void wm_dock_create(WScreen *scr);
extern void handle_backend_new_input(struct wl_listener *listener, void *data);
extern void handle_backend_new_output(struct wl_listener *listener, void *data);
@ -877,17 +879,14 @@ wl_display_open(const char *name)
* The ready signal fires once Xwayland's socket accepts connections. */
wl_state.xwayland = wlr_xwayland_create(wl_state.display,
wl_state.compositor, false);
#ifdef USE_XWAYLAND
if (wl_state.xwayland) {
/* Wire server destroy signal to detect early failure (e.g. stale
* display lock → Xwayland exits before ready fires). */
if (wl_state.xwayland->server) {
wl_state.xwayland_server_destroy_listener.notify =
handle_xwayland_server_destroy;
wl_signal_add(&wl_state.xwayland->server->events.destroy,
&wl_state.xwayland_server_destroy_listener);
}
/* Wire ready signal BEFORE new_surface so Display* is set before
* any X11 window events arrive. */
wl_state.xwayland_ready_listener.notify = handle_xwayland_ready;
wl_signal_add(&wl_state.xwayland->events.ready,
&wl_state.xwayland_ready_listener);
@ -895,9 +894,6 @@ wl_display_open(const char *name)
wl_signal_add(&wl_state.xwayland->events.new_surface,
&wl_state.xwayland_new_surface_listener);
wlr_xwayland_set_seat(wl_state.xwayland, wl_state.seat);
/* display_name may already be set (display number reserved by wlroots
* synchronously); set DISPLAY early as a best-effort so that any
* code between here and the ready signal can still find the socket. */
if (wl_state.xwayland->display_name) {
setenv("DISPLAY", wl_state.xwayland->display_name, 1);
wwarning("wl_backend: XWayland starting DISPLAY=%s (eager mode)",
@ -908,6 +904,7 @@ wl_display_open(const char *name)
} else {
wwarning("wl_backend: XWayland unavailable (X11 clients will not work)");
}
#endif
/* periodic timer to drive client frame callbacks at ~60 fps.
* Using a timer avoids the swapchain/allocator complexity of the full

View File

@ -49,6 +49,19 @@ void wl_client_set_maximized(WNativeWindow win, int maximized);
void wl_client_send_protocol(WWindow *wwin, unsigned long protocol, unsigned long timestamp);
void wl_client_kill_impl(WWindow *wwin);
char *wl_get_command_for_window(WNativeWindow win, int elements);
struct _XDisplay;
typedef struct _XDisplay Display;
/* XWayland wrapper stubs — real implementations in wl_xdisplay.c / wl_xwayland.c */
void wl_xdisplay_flush(void) {}
void wl_xdisplay_sync(int d) { (void)d; }
unsigned long wl_xdisplay_intern_atom(const char *n) { (void)n; return 0; }
Display *wl_get_x_display(void) { return NULL; }
RImage *wl_xwayland_capture_snapshot(WScreen *s, struct wlr_xwayland_surface *xw) { (void)s; (void)xw; return NULL; }
float wl_xwayland_get_window_opacity(WNativeWindow cw) { (void)cw; return 1.0f; }
RContext *wl_create_rcontext(int screen_number, RContextAttributes *attribs)
{ (void)screen_number; return RCreateContextWayland(1920, 1080, attribs); }
#if USE_XWAYLAND
void wl_client_message_forward(WMEvent *event, WNativeWindow target_win);
void wl_client_send_key(WNativeWindow win, unsigned int keycode, unsigned int modifiers, int grabbed);