diff --git a/src/Makefile.am b/src/Makefile.am index 25ac63a..9bf746f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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\ diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 38bd4f2..bb807b8 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -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 diff --git a/src/backend/wayland/wl_stubs.c b/src/backend/wayland/wl_stubs.c index 185b9d6..70a12d2 100644 --- a/src/backend/wayland/wl_stubs.c +++ b/src/backend/wayland/wl_stubs.c @@ -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);