diff --git a/screens/compositor.c b/screens/compositor.c index f6932a8..ac48cfc 100644 --- a/screens/compositor.c +++ b/screens/compositor.c @@ -272,7 +272,12 @@ static void handle_vr_event(const struct ft_event *e, void *data) { case FT_MOTION: case FT_BUTTON: if (s->pointer_focus != sc) { - wlr_seat_pointer_notify_enter(s->seat, surface, x, y); + // KWin's nested backend ignores the position in wl_pointer.enter, and wlroots + // drops a motion to the position it entered at, so KWin would keep its old + // pointer until the next move: a press right after crossing onto another + // screen landed where the pointer had been. Entering one unit off makes the + // motion below go through. + wlr_seat_pointer_notify_enter(s->seat, surface, x + 1, y); s->pointer_focus = sc; } wlr_seat_pointer_notify_motion(s->seat, t, x, y);