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`.