diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 062c5f6..475274b 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -6341,6 +6341,13 @@ handle_pointer_button(struct wl_listener *listener, void *data) W_WL_EnqueueEvent(wmscr, &wev, target); } + /* Refresh pointer focus before delivering button event. + * The last wl_update_pointer_focus call was during the most recent + * motion event. If no motion happened since then, the XWayland + * surface might not have pointer focus, causing + * wlr_seat_pointer_notify_button to be a no-op. */ + wl_update_pointer_focus(ev->time_msec); + wlr_seat_pointer_notify_button(wl_state.seat, ev->time_msec, ev->button, ev->state); wlr_seat_pointer_notify_frame(wl_state.seat);