1
0
Fork 0
forked from wry/wry

tree: restack floaters and popups on demand

This commit is contained in:
Julian Orth 2024-03-03 15:39:04 +01:00
parent 911591973e
commit 386d74f926
6 changed files with 52 additions and 6 deletions

View file

@ -34,7 +34,7 @@ pub struct FloatNode {
pub state: Rc<State>,
pub visible: Cell<bool>,
pub position: Cell<Rect>,
pub display_link: Cell<Option<LinkedNode<Rc<dyn StackedNode>>>>,
pub display_link: RefCell<Option<LinkedNode<Rc<dyn StackedNode>>>>,
pub workspace_link: Cell<Option<LinkedNode<Rc<dyn StackedNode>>>>,
pub workspace: CloneCell<Rc<WorkspaceNode>>,
pub child: CloneCell<Option<Rc<dyn ToplevelNode>>>,
@ -103,7 +103,7 @@ impl FloatNode {
state: state.clone(),
visible: Cell::new(ws.stacked_visible()),
position: Cell::new(position),
display_link: Cell::new(None),
display_link: RefCell::new(None),
workspace_link: Cell::new(None),
workspace: CloneCell::new(ws.clone()),
child: CloneCell::new(Some(child.clone())),
@ -117,14 +117,13 @@ impl FloatNode {
attention_requested: Cell::new(false),
});
floater.pull_child_properties();
floater
.display_link
.set(Some(state.root.stacked.add_last(floater.clone())));
*floater.display_link.borrow_mut() = Some(state.root.stacked.add_last(floater.clone()));
floater
.workspace_link
.set(Some(ws.stacked.add_last(floater.clone())));
child.tl_set_parent(floater.clone());
child.tl_set_visible(floater.visible.get());
child.tl_restack_popups();
floater.schedule_layout();
floater
}
@ -389,6 +388,16 @@ impl FloatNode {
.cnode_child_attention_request_changed(self, false);
}
}
fn restack(&self) {
if let Some(dl) = &*self.display_link.borrow() {
self.state.root.stacked.add_last_existing(&dl);
if let Some(tl) = self.child.get() {
tl.tl_restack_popups();
}
self.state.tree_changed();
}
}
}
impl Debug for FloatNode {
@ -496,6 +505,7 @@ impl Node for FloatNode {
let pos = self.position.get();
match seat_data.op_type {
OpType::Move => {
self.restack();
seat_data.dist_hor = seat_data.x;
seat_data.dist_ver = seat_data.y;
}
@ -579,7 +589,7 @@ impl ContainingNode for FloatNode {
fn cnode_remove_child2(self: Rc<Self>, _child: &dyn Node, _preserve_focus: bool) {
self.discard_child_properties();
self.child.set(None);
self.display_link.set(None);
self.display_link.borrow_mut().take();
self.workspace_link.set(None);
}