diff --git a/src/backend/wayland/wl_handlers.c b/src/backend/wayland/wl_handlers.c index 3136751..99a426a 100644 --- a/src/backend/wayland/wl_handlers.c +++ b/src/backend/wayland/wl_handlers.c @@ -176,18 +176,23 @@ handle_pointer_button(struct wl_listener *listener, void *data) wl_list_insert(&wl_state.toplevel_list, &view->link); } } else { - /* No toplevel surface — check if a WINGs dialog frame_buf was clicked */ - struct wl_frame_buf *hit = frame_buf_hit(wl_state.pointer_x, - wl_state.pointer_y); - if (hit) { - /* Walk up to the parent frame to find the WWindow */ - WNativeWindow lookup = hit->parent_id ? hit->parent_id : hit->id; - WObjDescriptor *desc = - wm_backend->context_find(lookup, WM_CTX_CLIENT_WIN); - if (desc && desc->parent_type == WCLASS_WINDOW) { - WWindow *wwin = (WWindow *)desc->parent; - WScreen *scr = wScreenWithNumber(0); - wSetFocusTo(scr, wwin); + double _sx, _sy; + struct wl_toplevel_view *_tv = NULL; + view_surface_at(wl_state.pointer_x, wl_state.pointer_y, + &_sx, &_sy, &_tv); + if (!_tv) { + /* No toplevel surface — check if a WINGs dialog frame_buf was clicked */ + struct wl_frame_buf *hit = frame_buf_hit(wl_state.pointer_x, + wl_state.pointer_y); + if (hit) { + WNativeWindow lookup = hit->parent_id ? hit->parent_id : hit->id; + WObjDescriptor *desc = + wm_backend->context_find(lookup, WM_CTX_CLIENT_WIN); + if (desc && desc->parent_type == WCLASS_WINDOW) { + WWindow *wwin = (WWindow *)desc->parent; + WScreen *scr = wScreenWithNumber(0); + wSetFocusTo(scr, wwin); + } } } } @@ -213,12 +218,25 @@ handle_pointer_button(struct wl_listener *listener, void *data) wev.u.button.x = wl_state.pointer_x - fb->x; wev.u.button.y = wl_state.pointer_y - fb->y; } else { - WScreen *scr0 = wScreenWithNumber(0); - WNativeWindow root = scr0 ? scr0->root_win : (WNativeWindow)0x0FFFFFFF; - wev.window = root; - wev.u.button.window = root; - wev.u.button.x = wl_state.pointer_x; - wev.u.button.y = wl_state.pointer_y; + /* No frame buffer — check if the click landed on an XDG toplevel + * (WINGs dialog, popup, etc.) and use its view ID as the window. */ + double _sx, _sy; + struct wl_toplevel_view *_tv = NULL; + view_surface_at(wl_state.pointer_x, wl_state.pointer_y, + &_sx, &_sy, &_tv); + if (_tv) { + wev.window = _tv->id; + wev.u.button.window = _tv->id; + wev.u.button.x = (int)_sx; + wev.u.button.y = (int)_sy; + } else { + WScreen *scr0 = wScreenWithNumber(0); + WNativeWindow root = scr0 ? scr0->root_win : (WNativeWindow)0x0FFFFFFF; + wev.window = root; + wev.u.button.window = root; + wev.u.button.x = wl_state.pointer_x; + wev.u.button.y = wl_state.pointer_y; + } } wev.u.button.time = ev->time_msec; wev.u.button.x_root = wl_state.pointer_x;