diff --git a/WINGs/wview_wl.c b/WINGs/wview_wl.c index 8b57fd4..db98784 100644 --- a/WINGs/wview_wl.c +++ b/WINGs/wview_wl.c @@ -9,6 +9,7 @@ #include "WINGsP.h" #include +#include /* Synthetic window IDs for Wayland views (distinct from frame buffer IDs) */ #define WL_VIEW_ID_BASE 0x20000000 @@ -44,6 +45,7 @@ void (*W_DragIconHideFn)(void) = NULL; /* Drag cursor feedback — called during drag loop when the view under the * cursor changes. accepted=True means the view accepts the drop. */ void (*W_DragCursorFeedbackFn)(Bool accepted) = NULL; +void (*W_SetCursorImageFn)(const char *name) = NULL; extern void wl_view_destroy_backing_impl(unsigned long id); @@ -165,8 +167,11 @@ void W_UnregisterBacking(WNativeWindow id) static void *wl_screen_init(W_Screen *scr) { - (void)scr; - return scr; /* use scr as token */ + /* Store cursor names as WMNativeCursor — cast back in wl_set_cursor */ + scr->textCursor = (WMNativeCursor)(uintptr_t)"xterm"; + scr->defaultCursor = (WMNativeCursor)(uintptr_t)"left_ptr"; + scr->invisibleCursor = (WMNativeCursor)(uintptr_t)"none"; + return scr; } static void wl_screen_fini(void *vctx) @@ -497,8 +502,11 @@ static void wl_set_cursor(void *vctx, W_View *view, WMNativeCursor cursor) { (void)vctx; (void)view; - (void)cursor; - /* WMNativeCursor is managed by wlroots seat */ + if (!cursor) return; + if (!W_SetCursorImageFn) return; + const char *name = (const char *)(uintptr_t)cursor; + if (strcmp(name, "none") == 0) name = "default"; + W_SetCursorImageFn(name); } static void wl_redisplay(void *vctx, W_View *view) diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 5eb2b6c..89d86f6 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -467,6 +467,10 @@ wl_display_open(const char *name) extern void *W_GetFrameBufImage(unsigned long id); W_GetFrameBufImageFn = W_GetFrameBufImage; + extern void (*W_SetCursorImageFn)(const char *name); + extern void wl_set_cursor_image(const char *name); + W_SetCursorImageFn = wl_set_cursor_image; + extern int (*W_WLPointerGrabFn)(WNativeWindow, WNativeWindow, unsigned int, int, int, unsigned long); extern void (*W_WLPointerUngrabFn)(unsigned long);