Rémi Bernon (@rbernon) commented about dlls/winewayland.drv/wayland_pointer.c:
{ TRACE("surface=%p hwnd=%p\n", surface, surface->hwnd); process_wayland.pointer.surface = surface;
process_wayland.pointer.enter_serial = serial;
/* The cursor is undefined at every enter, so we set it again with
* the latest information we have. */
wl_pointer_set_cursor(process_wayland.pointer.wl_pointer,
process_wayland.pointer.enter_serial,
surface->cursor.wl_surface,
surface->cursor.hotspot_x,
surface->cursor.hotspot_y);
Do we have to set the cursor here? Could it wait until `SetCursor` is called instead? Fwiw it should be called on every window/cursor change now, and I think it would save you the need to keep the window cursor surface around, unless it is required after `wl_pointer_set_cursor`.