From 4859412126abf95c9a2dc7b7125285b0a6577a02 Mon Sep 17 00:00:00 2001 From: DeeJanuz <45082401+DeeJanuz@users.noreply.github.com> Date: Tue, 29 Sep 2026 23:14:09 -0600 Subject: [PATCH] Put the first click after crossing onto a screen where the pointer is KWin's nested backend ignores the position in wl_pointer.enter, and wlroots drops a motion to the position it entered at, so KWin kept its old pointer until the next move. Co-Authored-By: Claude Opus 5.5 --- screens/compositor.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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);