Merge pull request #514 from mahkoh/jorth/move-fullscreen
tree: allow moving fullscreen nodes
This commit is contained in:
commit
5e8f6bc8a8
2 changed files with 60 additions and 9 deletions
|
|
@ -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>);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue