1
0
Fork 0
forked from wry/wry

tree: allow moving fullscreen nodes with mouse in window-management mode

This commit is contained in:
Julian Orth 2025-07-17 17:17:54 +02:00
parent aaf38b193f
commit 066b382943

View file

@ -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<dyn PointerOwner> = 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<WlSeatGlobal>,
parent: Rc<dyn ContainingNode>,
tl: &Rc<dyn ToplevelNode>,
);
) {
let _ = seat;
let _ = parent;
let _ = tl;
}
fn on_drop(&self, seat: &Rc<WlSeatGlobal>, tl: &Rc<dyn ToplevelNode>) {
let _ = seat;
let _ = tl;
}
}
struct ToplevelGrabPointerOwner<T> {
@ -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<WlSeatGlobal>, tl: &Rc<dyn ToplevelNode>) {
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<WlSeatGlobal>);