From 259340938b30422c066e6a57e6b987b3c961ae82 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 3 Jun 2022 16:47:21 +0200 Subject: [PATCH] tree: update outputs of surfaces when moving a workspace --- src/tasks/connector.rs | 2 +- src/tree/workspace.rs | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/tasks/connector.rs b/src/tasks/connector.rs index f2433b37..b1c32bc4 100644 --- a/src/tasks/connector.rs +++ b/src/tasks/connector.rs @@ -210,7 +210,6 @@ impl ConnectorHandler { } global.node.set(None); global.destroyed.set(true); - let _ = self.state.remove_global(&*global); self.state.root.outputs.remove(&self.id); self.data.connected.set(false); self.state.outputs.remove(&self.id); @@ -252,5 +251,6 @@ impl ConnectorHandler { dev.connectors.remove(&self.id); } self.state.remove_output_scale(on.preferred_scale.get()); + let _ = self.state.remove_global(&*global); } } diff --git a/src/tree/workspace.rs b/src/tree/workspace.rs index 11c38d74..1f7d2a57 100644 --- a/src/tree/workspace.rs +++ b/src/tree/workspace.rs @@ -4,13 +4,14 @@ use { ifs::{ wl_output::OutputId, wl_seat::{NodeSeatState, WlSeatGlobal}, - wl_surface::SurfaceSendPreferredScaleVisitor, + wl_surface::WlSurface, }, rect::Rect, render::Renderer, tree::{ container::ContainerNode, walker::NodeVisitor, ContainingNode, Direction, - FindTreeResult, FoundNode, Node, NodeId, OutputNode, StackedNode, ToplevelNode, + FindTreeResult, FoundNode, Node, NodeId, NodeVisitorBase, OutputNode, StackedNode, + ToplevelNode, }, utils::{ clonecell::CloneCell, @@ -46,14 +47,18 @@ impl WorkspaceNode { } pub fn set_output(&self, output: &Rc) { - let old = self.output.set(output.clone()); - if old.preferred_scale.get() != output.preferred_scale.get() { - let mut visitor = SurfaceSendPreferredScaleVisitor(output.preferred_scale.get()); - self.node_visit_children(&mut visitor); - for stacked in self.stacked.iter() { - stacked.deref().clone().node_visit(&mut visitor); + self.output.set(output.clone()); + struct OutputSetter<'a>(&'a Rc); + impl NodeVisitorBase for OutputSetter<'_> { + fn visit_surface(&mut self, node: &Rc) { + node.set_output(self.0); } } + let mut visitor = OutputSetter(output); + self.node_visit_children(&mut visitor); + for stacked in self.stacked.iter() { + stacked.deref().clone().node_visit(&mut visitor); + } } pub fn set_container(self: &Rc, container: &Rc) {