From ee9bac3d7eb9590aa0b823d0212d7b943c55db5b Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 21 Jul 2025 17:09:00 +0200 Subject: [PATCH] seat: allow dragging tiles in window management mode --- src/ifs/wl_seat/pointer_owner.rs | 51 ++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/src/ifs/wl_seat/pointer_owner.rs b/src/ifs/wl_seat/pointer_owner.rs index 04f77197..ffd6154f 100644 --- a/src/ifs/wl_seat/pointer_owner.rs +++ b/src/ifs/wl_seat/pointer_owner.rs @@ -968,6 +968,14 @@ impl SimplePointerOwnerUsecase for WindowManagementUsecase { tl, usecase: MoveFullscreenToplevelGrabPointerOwner, }) + } else if tl.tl_data().float.is_none() { + Rc::new(ToplevelGrabPointerOwner { + tl: tl.clone(), + usecase: TileDragUsecase { + tl, + destination: Default::default(), + }, + }) } else { Rc::new(ToplevelGrabPointerOwner { tl, @@ -1082,6 +1090,9 @@ where } fn grab_node_removed(&self, seat: &Rc) { + if let Some(rect) = seat.ui_drag_highlight.take() { + seat.state.damage(rect); + } seat.pointer_cursor.set_known(KnownCursor::Default); seat.pointer_owner.owner.set(Rc::new(SimplePointerOwner { usecase: WindowManagementUsecase, @@ -1242,15 +1253,7 @@ where fn apply_changes(&self, seat: &Rc) { let new_highlight = self.usecase.apply_changes(seat); - let prev_highlight = seat.ui_drag_highlight.replace(new_highlight); - if prev_highlight != new_highlight { - if let Some(rect) = prev_highlight { - seat.state.damage(rect); - } - if let Some(rect) = new_highlight { - seat.state.damage(rect); - } - } + handle_ui_drag_highlight(seat, new_highlight); } fn revert_to_default(&self, seat: &Rc) { @@ -1258,6 +1261,18 @@ where } } +fn handle_ui_drag_highlight(seat: &Rc, new_highlight: Option) { + let prev_highlight = seat.ui_drag_highlight.replace(new_highlight); + if prev_highlight != new_highlight { + if let Some(rect) = prev_highlight { + seat.state.damage(rect); + } + if let Some(rect) = new_highlight { + seat.state.damage(rect); + } + } +} + struct TileDragUsecase { tl: Rc, destination: Cell>, @@ -1373,6 +1388,24 @@ impl UiDragUsecase for TileDragUsecase { } } +impl WindowManagementGrabUsecase for TileDragUsecase { + const BUTTON: u32 = BTN_LEFT; + + fn apply_changes( + &self, + seat: &Rc, + _parent: Rc, + _tl: &Rc, + ) { + let dest = UiDragUsecase::apply_changes(self, seat); + handle_ui_drag_highlight(seat, dest); + } + + fn on_drop(&self, seat: &Rc, _tl: &Rc) { + UiDragUsecase::left_button_up(self, seat); + } +} + struct WorkspaceDragUsecase { ws: Rc, destination: Cell>,