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::{
|
tree::{
|
||||||
ContainerNode, ContainerSplit, ContainingNode, FindTreeUsecase, FoundNode, Node,
|
ContainerNode, ContainerSplit, ContainingNode, FindTreeUsecase, FoundNode, Node,
|
||||||
PlaceholderNode, TddType, ToplevelNode, WorkspaceDragDestination, WorkspaceNode,
|
PlaceholderNode, TddType, ToplevelNode, WorkspaceDragDestination, WorkspaceNode,
|
||||||
WsMoveConfig, move_ws_to_output,
|
WsMoveConfig, move_ws_to_output, toplevel_set_workspace,
|
||||||
},
|
},
|
||||||
utils::{clonecell::CloneCell, smallmap::SmallMap},
|
utils::{clonecell::CloneCell, smallmap::SmallMap},
|
||||||
},
|
},
|
||||||
|
|
@ -963,10 +963,17 @@ impl SimplePointerOwnerUsecase for WindowManagementUsecase {
|
||||||
let (mut dx, mut dy) = pos.translate(x, y);
|
let (mut dx, mut dy) = pos.translate(x, y);
|
||||||
let owner: Rc<dyn PointerOwner> = if button == BTN_LEFT {
|
let owner: Rc<dyn PointerOwner> = if button == BTN_LEFT {
|
||||||
seat.pointer_cursor.set_known(KnownCursor::Move);
|
seat.pointer_cursor.set_known(KnownCursor::Move);
|
||||||
Rc::new(ToplevelGrabPointerOwner {
|
if tl.tl_data().is_fullscreen.get() {
|
||||||
tl,
|
Rc::new(ToplevelGrabPointerOwner {
|
||||||
usecase: MoveToplevelGrabPointerOwner { dx, dy },
|
tl,
|
||||||
})
|
usecase: MoveFullscreenToplevelGrabPointerOwner,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Rc::new(ToplevelGrabPointerOwner {
|
||||||
|
tl,
|
||||||
|
usecase: MoveToplevelGrabPointerOwner { dx, dy },
|
||||||
|
})
|
||||||
|
}
|
||||||
} else if button == BTN_RIGHT {
|
} else if button == BTN_RIGHT {
|
||||||
let mut top = false;
|
let mut top = false;
|
||||||
let mut right = false;
|
let mut right = false;
|
||||||
|
|
@ -1032,7 +1039,16 @@ trait WindowManagementGrabUsecase {
|
||||||
seat: &Rc<WlSeatGlobal>,
|
seat: &Rc<WlSeatGlobal>,
|
||||||
parent: Rc<dyn ContainingNode>,
|
parent: Rc<dyn ContainingNode>,
|
||||||
tl: &Rc<dyn ToplevelNode>,
|
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> {
|
struct ToplevelGrabPointerOwner<T> {
|
||||||
|
|
@ -1049,6 +1065,7 @@ where
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
self.tl.node_seat_state().remove_pointer_grab(seat);
|
self.tl.node_seat_state().remove_pointer_grab(seat);
|
||||||
|
self.usecase.on_drop(seat, &self.tl);
|
||||||
self.grab_node_removed(seat);
|
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 {
|
trait UiDragUsecase: 'static {
|
||||||
fn node_seat_state(&self) -> &NodeSeatState;
|
fn node_seat_state(&self) -> &NodeSeatState;
|
||||||
fn left_button_up(&self, seat: &Rc<WlSeatGlobal>);
|
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>) {
|
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() {
|
let old_ws = match tl.tl_data().workspace.get() {
|
||||||
Some(ws) => ws,
|
Some(ws) => ws,
|
||||||
_ => return,
|
_ => return,
|
||||||
|
|
@ -973,6 +970,17 @@ pub fn toplevel_set_workspace(state: &Rc<State>, tl: Rc<dyn ToplevelNode>, ws: &
|
||||||
if old_ws.id == ws.id {
|
if old_ws.id == ws.id {
|
||||||
return;
|
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() {
|
let cn = match tl.tl_data().parent.get() {
|
||||||
Some(cn) => cn,
|
Some(cn) => cn,
|
||||||
_ => return,
|
_ => return,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue