fix(input): pointer clamping

- Reduces the max clamp value by 1, since it previously ended up 1 pixel off screen. Fixes #981.
- Moves clamping to before  `new_under`, since it previously ignored any motion that goes off screen, causing issues in some fullscreen clients. Fixes #1286.
This commit is contained in:
Vukašin Vojinović 2025-12-19 18:56:56 +01:00 committed by Victoria Brekenfeld
parent bb05037db2
commit 9e143da814

View file

@ -23,7 +23,7 @@ use crate::{
},
zoom::ZoomState,
},
utils::{float::NextDown, prelude::*, quirks::workspace_overview_is_open},
utils::{prelude::*, quirks::workspace_overview_is_open},
wayland::{
handlers::{screencopy::SessionHolder, xwayland_keyboard_grab::XWaylandGrabSeat},
protocols::screencopy::{BufferConstraints, CursorSessionRef},
@ -356,6 +356,16 @@ impl State {
.cloned()
.unwrap_or(current_output.clone());
let output_geometry = output.geometry();
position.x = position.x.clamp(
output_geometry.loc.x as f64,
(output_geometry.loc.x + output_geometry.size.w - 1) as f64,
);
position.y = position.y.clamp(
output_geometry.loc.y as f64,
(output_geometry.loc.y + output_geometry.size.h - 1) as f64,
);
let new_under = State::surface_under(position, &output, &shell)
.map(|(target, pos)| (target, pos.as_logical()));
@ -482,17 +492,6 @@ impl State {
}
}
let output_geometry = output.geometry();
position.x = position.x.clamp(
output_geometry.loc.x as f64,
((output_geometry.loc.x + output_geometry.size.w) as f64).next_lower(), // FIXME: Replace with f64::next_down when stable
);
position.y = position.y.clamp(
output_geometry.loc.y as f64,
((output_geometry.loc.y + output_geometry.size.h) as f64).next_lower(), // FIXME: Replace with f64::next_down when stable
);
// If confined, don't move pointer if it would go outside surface or region
if pointer_confined {
if let Some((surface, surface_loc)) = &under {