Alexandre Julliard (@julliard) commented about server/queue.c:
+static int update_desktop_cursor_window( struct desktop *desktop, user_handle_t win, int x, int y ) { int updated = win != desktop->cursor.win; user_handle_t handle = desktop->cursor.handle; desktop->cursor.win = win; if (updated) { + struct thread *thread; + + if ((thread = window_thread_from_point( win, x, y ))) + { + struct thread_input *input = thread->queue->input; + if (input) handle = input->cursor_count < 0 ? 0 : input->cursor; + release_object( thread ); + } + It shouldn't be necessary to find the exact child window, they all share the same thread input.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/4068#note_48315