From b56c1a1b0aef64a3f9a3564eeb81a7dba36d4acf Mon Sep 17 00:00:00 2001 From: kossLAN Date: Tue, 9 Jun 2026 20:33:24 -0400 Subject: [PATCH] cursor_user: ensure cursor position is on live output --- src/cursor_user.rs | 2 ++ src/ifs/wl_seat.rs | 19 +++++++++++++++++++ src/tasks/connector.rs | 5 +++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/cursor_user.rs b/src/cursor_user.rs index dc3df528..82dbcf92 100644 --- a/src/cursor_user.rs +++ b/src/cursor_user.rs @@ -414,6 +414,8 @@ impl CursorUser { x = x.apply_fract(x_tmp); y = y.apply_fract(y_tmp); } + let x_int = x.round_down(); + let y_int = y.round_down(); if self.software_cursor() && let Some(cursor) = self.cursor.get() { diff --git a/src/ifs/wl_seat.rs b/src/ifs/wl_seat.rs index c37b8b2d..978ce7c3 100644 --- a/src/ifs/wl_seat.rs +++ b/src/ifs/wl_seat.rs @@ -534,6 +534,25 @@ impl WlSeatGlobal { self.cursor_user_group.latest_output() } + pub(crate) fn handle_output_disconnected( + self: &Rc, + output: &Rc, + target: &Rc, + ) { + let old_output = self.pointer_cursor.output().id; + let old_position = self.pointer_cursor.position_int(); + self.cursor_user_group.output_disconnected(output, target); + let new_output = self.pointer_cursor.output().id; + let new_position = self.pointer_cursor.position_int(); + if old_output == new_output && old_position == new_position { + return; + } + self.pos_time_usec.set(self.state.now_usec()); + self.changes.or_assign(CHANGE_CURSOR_MOVED); + self.pointer_stack_modified.set(true); + self.apply_changes(); + } + pub fn get_keyboard_node(&self) -> Rc { self.keyboard_node.get() } diff --git a/src/tasks/connector.rs b/src/tasks/connector.rs index 16362e44..c9d3247a 100644 --- a/src/tasks/connector.rs +++ b/src/tasks/connector.rs @@ -388,8 +388,9 @@ impl ConnectorHandler { for group in on.ext_workspace_groups.lock().drain_values() { group.handle_destroyed(); } - for seat in self.state.globals.seats.lock().values() { - seat.cursor_group().output_disconnected(&on, &target); + let seats: Vec<_> = self.state.globals.seats.lock().values().cloned().collect(); + for seat in seats { + seat.handle_output_disconnected(&on, &target); } for item in on.tray_items.iter() { item.destroy_node();