From 4e717ecef880cd04501472bf162fe2bbccc59628 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 29 Apr 2022 17:57:11 +0200 Subject: [PATCH] autocommit 2022-04-29 17:57:11 CEST --- src/ifs/wl_surface/xdg_surface/xdg_popup.rs | 4 ++++ src/ifs/wl_surface/xwindow.rs | 4 ++++ src/tree/float.rs | 20 +++++++++++--------- src/tree/stacked.rs | 1 + src/tree/toplevel.rs | 9 +++++++-- src/tree/workspace.rs | 15 ++++++++++++--- 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/ifs/wl_surface/xdg_surface/xdg_popup.rs b/src/ifs/wl_surface/xdg_surface/xdg_popup.rs index 66cfa65b..381a6fd7 100644 --- a/src/ifs/wl_surface/xdg_surface/xdg_popup.rs +++ b/src/ifs/wl_surface/xdg_surface/xdg_popup.rs @@ -328,6 +328,10 @@ impl Node for XdgPopup { impl StackedNode for XdgPopup { stacked_node_impl!(); + fn stacked_set_visible(&self, visible: bool) { + self.xdg.set_visible(visible); + } + fn stacked_absolute_position_constrains_input(&self) -> bool { false } diff --git a/src/ifs/wl_surface/xwindow.rs b/src/ifs/wl_surface/xwindow.rs index e7c22607..85e92ad8 100644 --- a/src/ifs/wl_surface/xwindow.rs +++ b/src/ifs/wl_surface/xwindow.rs @@ -443,6 +443,10 @@ impl ToplevelNode for Xwindow { impl StackedNode for Xwindow { stacked_node_impl!(); + + fn stacked_set_visible(&self, visible: bool) { + self.tl_set_visible(visible); + } } #[derive(Debug, Error)] diff --git a/src/tree/float.rs b/src/tree/float.rs index 2f92e75e..b007aa28 100644 --- a/src/tree/float.rs +++ b/src/tree/float.rs @@ -96,7 +96,7 @@ impl FloatNode { let floater = Rc::new(FloatNode { id: state.node_ids.next(), state: state.clone(), - visible: Cell::new(true), + visible: Cell::new(ws.stacked_visible()), position: Cell::new(position), display_link: Cell::new(None), workspace_link: Cell::new(None), @@ -118,6 +118,7 @@ impl FloatNode { .set(Some(ws.stacked.add_last(floater.clone()))); child.clone().tl_set_workspace(ws); child.tl_set_parent(floater.clone()); + child.tl_set_visible(floater.visible.get()); floater.schedule_layout(); floater } @@ -321,14 +322,7 @@ impl FloatNode { self.workspace_link .set(Some(ws.stacked.add_last(self.clone()))); self.workspace.set(ws.clone()); - } - - pub fn set_visible(&self, visible: bool) { - self.visible.set(visible); - if let Some(child) = self.child.get() { - child.tl_set_visible(visible); - } - self.seat_state.set_visible(self, visible); + self.stacked_set_visible(ws.stacked_visible()); } } @@ -520,4 +514,12 @@ impl ContainingNode for FloatNode { impl StackedNode for FloatNode { stacked_node_impl!(); + + fn stacked_set_visible(&self, visible: bool) { + self.visible.set(visible); + if let Some(child) = self.child.get() { + child.tl_set_visible(visible); + } + self.seat_state.set_visible(self, visible); + } } diff --git a/src/tree/stacked.rs b/src/tree/stacked.rs index 5e0b7d19..8dd7528b 100644 --- a/src/tree/stacked.rs +++ b/src/tree/stacked.rs @@ -4,6 +4,7 @@ pub trait StackedNode: Node { fn stacked_as_node(&self) -> &dyn Node; fn stacked_into_node(self: Rc) -> Rc; fn stacked_into_dyn(self: Rc) -> Rc; + fn stacked_set_visible(&self, visible: bool); fn stacked_absolute_position_constrains_input(&self) -> bool { true diff --git a/src/tree/toplevel.rs b/src/tree/toplevel.rs index 75dee8a3..257637e2 100644 --- a/src/tree/toplevel.rs +++ b/src/tree/toplevel.rs @@ -14,6 +14,7 @@ use { rc::Rc, }, }; +use crate::ifs::wl_seat::collect_kb_foci2; tree_id!(ToplevelNodeId); @@ -265,6 +266,10 @@ impl ToplevelData { kb_foci = collect_kb_foci(container.clone()); container.tl_set_visible(false); } + for stacked in ws.stacked.iter() { + collect_kb_foci2(stacked.deref().clone().stacked_into_node(), &mut kb_foci); + stacked.stacked_set_visible(false); + } *data = Some(FullscreenedData { placeholder, workspace: ws.clone(), @@ -308,8 +313,8 @@ impl ToplevelData { _ => {} } fd.workspace.fullscreen.take(); - if let Some(container) = fd.workspace.container.get() { - container.tl_set_visible(node.tl_as_node().node_visible()); + if node.node_visible() { + fd.workspace.set_visible(true); } if fd.placeholder.is_destroyed() { state.map_tiled(node); diff --git a/src/tree/workspace.rs b/src/tree/workspace.rs index 9d68d718..889dec4c 100644 --- a/src/tree/workspace.rs +++ b/src/tree/workspace.rs @@ -38,10 +38,14 @@ impl WorkspaceNode { container.clone().tl_change_extents(&pos); container.clone().tl_set_workspace(self); container.tl_set_parent(self.clone()); - container.tl_set_visible(self.visible.get() && self.fullscreen.get().is_none()); + container.tl_set_visible(self.stacked_visible()); self.container.set(Some(container.clone())); } + pub fn stacked_visible(&self) -> bool { + self.visible.get() && self.fullscreen.get().is_none() + } + pub fn change_extents(&self, rect: &Rect) { self.position.set(*rect); if let Some(c) = self.container.get() { @@ -53,8 +57,13 @@ impl WorkspaceNode { self.visible.set(visible); if let Some(fs) = self.fullscreen.get() { fs.tl_set_visible(visible); - } else if let Some(container) = self.container.get() { - container.tl_set_visible(visible); + } else { + if let Some(container) = self.container.get() { + container.tl_set_visible(visible); + } + for stacked in self.stacked.iter() { + stacked.stacked_set_visible(visible); + } } self.seat_state.set_visible(self, visible); }