diff --git a/src/ifs/wl_seat/pointer_owner.rs b/src/ifs/wl_seat/pointer_owner.rs index 792a7e5b..04f77197 100644 --- a/src/ifs/wl_seat/pointer_owner.rs +++ b/src/ifs/wl_seat/pointer_owner.rs @@ -18,7 +18,7 @@ use { tree::{ ContainerNode, ContainerSplit, ContainingNode, FindTreeUsecase, FoundNode, Node, PlaceholderNode, TddType, ToplevelNode, WorkspaceDragDestination, WorkspaceNode, - WsMoveConfig, move_ws_to_output, + WsMoveConfig, move_ws_to_output, toplevel_set_workspace, }, utils::{clonecell::CloneCell, smallmap::SmallMap}, }, @@ -963,10 +963,17 @@ impl SimplePointerOwnerUsecase for WindowManagementUsecase { let (mut dx, mut dy) = pos.translate(x, y); let owner: Rc = if button == BTN_LEFT { seat.pointer_cursor.set_known(KnownCursor::Move); - Rc::new(ToplevelGrabPointerOwner { - tl, - usecase: MoveToplevelGrabPointerOwner { dx, dy }, - }) + if tl.tl_data().is_fullscreen.get() { + Rc::new(ToplevelGrabPointerOwner { + tl, + usecase: MoveFullscreenToplevelGrabPointerOwner, + }) + } else { + Rc::new(ToplevelGrabPointerOwner { + tl, + usecase: MoveToplevelGrabPointerOwner { dx, dy }, + }) + } } else if button == BTN_RIGHT { let mut top = false; let mut right = false; @@ -1032,7 +1039,16 @@ trait WindowManagementGrabUsecase { seat: &Rc, parent: Rc, tl: &Rc, - ); + ) { + let _ = seat; + let _ = parent; + let _ = tl; + } + + fn on_drop(&self, seat: &Rc, tl: &Rc) { + let _ = seat; + let _ = tl; + } } struct ToplevelGrabPointerOwner { @@ -1049,6 +1065,7 @@ where return; } self.tl.node_seat_state().remove_pointer_grab(seat); + self.usecase.on_drop(seat, &self.tl); self.grab_node_removed(seat); } @@ -1156,6 +1173,32 @@ impl WindowManagementGrabUsecase for ResizeToplevelGrabPointerOwner { } } +struct MoveFullscreenToplevelGrabPointerOwner; + +impl WindowManagementGrabUsecase for MoveFullscreenToplevelGrabPointerOwner { + const BUTTON: u32 = BTN_LEFT; + + fn on_drop(&self, seat: &Rc, tl: &Rc) { + let data = tl.tl_data(); + if !data.is_fullscreen.get() { + return; + } + let output = 'output: { + let (x, y) = seat.pointer_cursor.position_int(); + let outputs = seat.state.root.outputs.lock(); + for output in outputs.values() { + let pos = output.global.pos.get(); + if pos.contains(x, y) { + break 'output output.clone(); + } + } + return; + }; + let ws = output.ensure_workspace(); + toplevel_set_workspace(&seat.state, tl.clone(), &ws); + } +} + trait UiDragUsecase: 'static { fn node_seat_state(&self) -> &NodeSeatState; fn left_button_up(&self, seat: &Rc);