1
0
Fork 0
forked from wry/wry

Merge pull request #514 from mahkoh/jorth/move-fullscreen

tree: allow moving fullscreen nodes
This commit is contained in:
mahkoh 2025-07-17 17:30:56 +02:00 committed by GitHub
commit 5e8f6bc8a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 60 additions and 9 deletions

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>);

View file

@ -963,9 +963,6 @@ pub fn toplevel_set_floating(state: &Rc<State>, tl: Rc<dyn ToplevelNode>, floati
}
pub fn toplevel_set_workspace(state: &Rc<State>, tl: Rc<dyn ToplevelNode>, ws: &Rc<WorkspaceNode>) {
if tl.tl_data().is_fullscreen.get() {
return;
}
let old_ws = match tl.tl_data().workspace.get() {
Some(ws) => ws,
_ => return,
@ -973,6 +970,17 @@ pub fn toplevel_set_workspace(state: &Rc<State>, tl: Rc<dyn ToplevelNode>, ws: &
if old_ws.id == ws.id {
return;
}
if tl.tl_data().is_fullscreen.get() {
if let Some(old) = ws.fullscreen.get() {
old.tl_set_fullscreen(false, None);
}
if ws.fullscreen.is_some() {
return;
}
tl.clone().tl_set_fullscreen(false, None);
tl.tl_set_fullscreen(true, Some(ws.clone()));
return;
}
let cn = match tl.tl_data().parent.get() {
Some(cn) => cn,
_ => return,