diff --git a/src/ifs/wl_surface/x_surface/xwindow.rs b/src/ifs/wl_surface/x_surface/xwindow.rs index b6232705..1d220953 100644 --- a/src/ifs/wl_surface/x_surface/xwindow.rs +++ b/src/ifs/wl_surface/x_surface/xwindow.rs @@ -12,7 +12,7 @@ use { state::State, tree::{ Direction, FindTreeResult, FoundNode, Node, NodeId, NodeVisitor, StackedNode, - ToplevelData, ToplevelNode, WorkspaceNode, + ToplevelData, ToplevelNode, ToplevelNodeBase, WorkspaceNode, }, utils::{clonecell::CloneCell, copyhashmap::CopyHashMap, linkedlist::LinkedNode}, wire::WlSurfaceId, @@ -357,9 +357,7 @@ impl Node for Xwindow { } } -impl ToplevelNode for Xwindow { - tl_node_impl!(); - +impl ToplevelNodeBase for Xwindow { fn tl_data(&self) -> &ToplevelData { &self.toplevel_data } @@ -410,17 +408,19 @@ impl ToplevelNode for Xwindow { .push(XWaylandEvent::Close(self.data.clone())); } - fn tl_set_visible(&self, visible: bool) { + fn tl_set_visible_impl(&self, visible: bool) { self.x.surface.set_visible(visible); - self.toplevel_data.set_visible(self, visible); } - fn tl_destroy(&self) { - self.toplevel_data.destroy_node(self); + fn tl_destroy_impl(&self) { self.display_link.borrow_mut().take(); self.x.surface.destroy_node(); } + fn tl_last_active_child(self: Rc) -> Rc { + self + } + fn tl_scanout_surface(&self) -> Option> { Some(self.x.surface.clone()) } diff --git a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs index c8ec92b4..1eaf205b 100644 --- a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs +++ b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs @@ -20,7 +20,7 @@ use { state::State, tree::{ Direction, FindTreeResult, FoundNode, Node, NodeId, NodeVisitor, ToplevelData, - ToplevelNode, ToplevelNodeId, WorkspaceNode, + ToplevelNode, ToplevelNodeBase, ToplevelNodeId, WorkspaceNode, }, utils::{ buffd::{MsgParser, MsgParserError}, @@ -453,9 +453,7 @@ impl Node for XdgToplevel { } } -impl ToplevelNode for XdgToplevel { - tl_node_impl!(); - +impl ToplevelNodeBase for XdgToplevel { fn tl_data(&self) -> &ToplevelData { &self.toplevel_data } @@ -499,13 +497,12 @@ impl ToplevelNode for XdgToplevel { self.send_close(); } - fn tl_set_visible(&self, visible: bool) { + fn tl_set_visible_impl(&self, visible: bool) { // log::info!("set_visible {}", visible); // if !visible { // log::info!("\n{:?}", Backtrace::new()); // } self.xdg.set_visible(visible); - self.toplevel_data.set_visible(self, visible); if self.xdg.base.version >= SUSPENDED_SINCE { if visible { self.states.borrow_mut().remove(&STATE_SUSPENDED); @@ -516,8 +513,7 @@ impl ToplevelNode for XdgToplevel { } } - fn tl_destroy(&self) { - self.toplevel_data.destroy_node(self); + fn tl_destroy_impl(&self) { self.xdg.destroy_node(); } @@ -544,6 +540,10 @@ impl ToplevelNode for XdgToplevel { // } // } + fn tl_last_active_child(self: Rc) -> Rc { + self + } + fn tl_scanout_surface(&self) -> Option> { Some(self.xdg.surface.clone()) } diff --git a/src/it/test_ifs/test_xdg_toplevel.rs b/src/it/test_ifs/test_xdg_toplevel.rs index 184c56f6..5ea32b13 100644 --- a/src/it/test_ifs/test_xdg_toplevel.rs +++ b/src/it/test_ifs/test_xdg_toplevel.rs @@ -7,7 +7,7 @@ use { test_transport::TestTransport, testrun::ParseFull, }, - tree::{ContainerNode, ToplevelNode}, + tree::{ContainerNode, ToplevelNodeBase}, utils::buffd::MsgParser, wire::{xdg_toplevel::*, XdgToplevelId}, }, diff --git a/src/it/tests/t0010_fullscreen_focus.rs b/src/it/tests/t0010_fullscreen_focus.rs index 3a423e62..d636a0c5 100644 --- a/src/it/tests/t0010_fullscreen_focus.rs +++ b/src/it/tests/t0010_fullscreen_focus.rs @@ -1,7 +1,7 @@ use { crate::{ it::{test_error::TestError, testrun::TestRun}, - tree::ToplevelNode, + tree::ToplevelNodeBase, }, std::rc::Rc, }; diff --git a/src/it/tests/t0014_container_scroll_focus.rs b/src/it/tests/t0014_container_scroll_focus.rs index f01d63a3..4c9ffcb2 100644 --- a/src/it/tests/t0014_container_scroll_focus.rs +++ b/src/it/tests/t0014_container_scroll_focus.rs @@ -4,7 +4,7 @@ use { test_error::{TestErrorExt, TestResult}, testrun::TestRun, }, - tree::ToplevelNode, + tree::ToplevelNodeBase, }, jay_config::Axis, std::rc::Rc, diff --git a/src/it/tests/t0015_scroll_partial.rs b/src/it/tests/t0015_scroll_partial.rs index 82400489..c6cf49b7 100644 --- a/src/it/tests/t0015_scroll_partial.rs +++ b/src/it/tests/t0015_scroll_partial.rs @@ -1,7 +1,7 @@ use { crate::{ it::{test_error::TestResult, testrun::TestRun}, - tree::ToplevelNode, + tree::ToplevelNodeBase, }, std::rc::Rc, }; diff --git a/src/macros.rs b/src/macros.rs index 618718dc..d1cdfe42 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -476,22 +476,6 @@ macro_rules! fatal { }} } -macro_rules! tl_node_impl { - () => { - fn tl_as_node(&self) -> &dyn Node { - self - } - - fn tl_into_node(self: Rc) -> Rc { - self - } - - fn tl_into_dyn(self: Rc) -> Rc { - self - } - }; -} - macro_rules! stacked_node_impl { () => { fn stacked_as_node(&self) -> &dyn Node { diff --git a/src/renderer.rs b/src/renderer.rs index 251e9c90..965c7dc5 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -15,7 +15,7 @@ use { state::State, theme::Color, tree::{ - ContainerNode, DisplayNode, FloatNode, OutputNode, PlaceholderNode, ToplevelNode, + ContainerNode, DisplayNode, FloatNode, OutputNode, PlaceholderNode, ToplevelNodeBase, WorkspaceNode, }, }, diff --git a/src/state.rs b/src/state.rs index 5e325e57..8a0faf72 100644 --- a/src/state.rs +++ b/src/state.rs @@ -42,7 +42,8 @@ use { theme::{Color, Theme}, tree::{ ContainerNode, ContainerSplit, Direction, DisplayNode, FloatNode, Node, NodeIds, - NodeVisitorBase, OutputNode, PlaceholderNode, ToplevelNode, WorkspaceNode, + NodeVisitorBase, OutputNode, PlaceholderNode, ToplevelNode, ToplevelNodeBase, + WorkspaceNode, }, utils::{ activation_token::ActivationToken, asyncevent::AsyncEvent, clonecell::CloneCell, diff --git a/src/tree/container.rs b/src/tree/container.rs index f5f0ea4e..35c0310c 100644 --- a/src/tree/container.rs +++ b/src/tree/container.rs @@ -14,7 +14,7 @@ use { text::{self, TextTexture}, tree::{ walker::NodeVisitor, ContainingNode, Direction, FindTreeResult, FoundNode, Node, - NodeId, ToplevelData, ToplevelNode, WorkspaceNode, + NodeId, ToplevelData, ToplevelNode, ToplevelNodeBase, WorkspaceNode, }, utils::{ clonecell::CloneCell, @@ -1421,9 +1421,7 @@ impl ContainingNode for ContainerNode { } } -impl ToplevelNode for ContainerNode { - tl_node_impl!(); - +impl ToplevelNodeBase for ContainerNode { fn tl_data(&self) -> &ToplevelData { &self.toplevel_data } @@ -1479,7 +1477,7 @@ impl ToplevelNode for ContainerNode { } } - fn tl_set_visible(&self, visible: bool) { + fn tl_set_visible_impl(&self, visible: bool) { if let Some(mc) = self.mono_child.get() { mc.node.tl_set_visible(visible); } else { @@ -1487,11 +1485,9 @@ impl ToplevelNode for ContainerNode { child.node.tl_set_visible(visible); } } - self.toplevel_data.set_visible(self, visible); } - fn tl_destroy(&self) { - self.toplevel_data.destroy_node(self); + fn tl_destroy_impl(&self) { mem::take(self.seats.borrow_mut().deref_mut()); let mut cn = self.child_nodes.borrow_mut(); for (_, n) in cn.drain() { diff --git a/src/tree/placeholder.rs b/src/tree/placeholder.rs index a3ca8117..4882608a 100644 --- a/src/tree/placeholder.rs +++ b/src/tree/placeholder.rs @@ -11,7 +11,7 @@ use { text::{self, TextTexture}, tree::{ Direction, FindTreeResult, FoundNode, Node, NodeId, NodeVisitor, ToplevelData, - ToplevelNode, + ToplevelNode, ToplevelNodeBase, }, utils::{errorfmt::ErrorFmt, smallmap::SmallMap}, }, @@ -145,17 +145,11 @@ impl Node for PlaceholderNode { } } -impl ToplevelNode for PlaceholderNode { - tl_node_impl!(); - +impl ToplevelNodeBase for PlaceholderNode { fn tl_data(&self) -> &ToplevelData { &self.toplevel } - fn tl_default_focus_child(&self) -> Option> { - None - } - fn tl_change_extents_impl(self: Rc, rect: &Rect) { self.toplevel.pos.set(*rect); if let Some(p) = self.toplevel.parent.get() { @@ -171,12 +165,15 @@ impl ToplevelNode for PlaceholderNode { }); } - fn tl_set_visible(&self, visible: bool) { - self.toplevel.set_visible(self, visible); + fn tl_set_visible_impl(&self, _visible: bool) { + // nothing } - fn tl_destroy(&self) { - self.toplevel.destroy_node(self); + fn tl_destroy_impl(&self) { self.destroyed.set(true); } + + fn tl_last_active_child(self: Rc) -> Rc { + self + } } diff --git a/src/tree/toplevel.rs b/src/tree/toplevel.rs index f3aa2b3f..d24869cf 100644 --- a/src/tree/toplevel.rs +++ b/src/tree/toplevel.rs @@ -28,27 +28,33 @@ use { tree_id!(ToplevelNodeId); -pub trait ToplevelNode: Node { +pub trait ToplevelNode: ToplevelNodeBase { fn tl_as_node(&self) -> &dyn Node; fn tl_into_node(self: Rc) -> Rc; fn tl_into_dyn(self: Rc) -> Rc; + fn tl_surface_active_changed(&self, active: bool); + fn tl_set_fullscreen(self: Rc, fullscreen: bool); + fn tl_title_changed(&self); + fn tl_set_parent(&self, parent: Rc); + fn tl_active_changed(&self); + fn tl_extents_changed(&self); + fn tl_set_workspace(self: Rc, ws: &Rc); + fn tl_change_extents(self: Rc, rect: &Rect); + fn tl_set_visible(&self, visible: bool); + fn tl_destroy(&self); +} - fn tl_data(&self) -> &ToplevelData; - - fn tl_default_focus_child(&self) -> Option> { - None +impl ToplevelNode for T { + fn tl_as_node(&self) -> &dyn Node { + self } - fn tl_accepts_keyboard_focus(&self) -> bool { - true + fn tl_into_node(self: Rc) -> Rc { + self } - fn tl_set_active(&self, active: bool) { - let _ = active; - } - - fn tl_on_activate(&self) { - // nothing + fn tl_into_dyn(self: Rc) -> Rc { + self } fn tl_surface_active_changed(&self, active: bool) { @@ -70,13 +76,6 @@ pub trait ToplevelNode: Node { } } - fn tl_focus_child(&self, seat: SeatId) -> Option> { - self.tl_data() - .focus_node - .get(&seat) - .or_else(|| self.tl_default_focus_child()) - } - fn tl_set_fullscreen(self: Rc, fullscreen: bool) { let data = self.tl_data(); if fullscreen { @@ -92,7 +91,7 @@ pub trait ToplevelNode: Node { let data = self.tl_data(); let title = data.title.borrow_mut(); if let Some(parent) = data.parent.get() { - parent.node_child_title_changed(self.tl_as_node(), &title); + parent.node_child_title_changed(self, &title); } if let Some(data) = data.fullscrceen_data.borrow_mut().deref() { *data.placeholder.tl_data().title.borrow_mut() = title.clone(); @@ -139,10 +138,6 @@ pub trait ToplevelNode: Node { self.tl_set_workspace_ext(ws); } - fn tl_set_workspace_ext(self: Rc, ws: &Rc) { - let _ = ws; - } - fn tl_change_extents(self: Rc, rect: &Rect) { let data = self.tl_data(); if data.is_floating.get() { @@ -152,19 +147,56 @@ pub trait ToplevelNode: Node { self.tl_change_extents_impl(rect) } - fn tl_change_extents_impl(self: Rc, rect: &Rect); + fn tl_set_visible(&self, visible: bool) { + self.tl_set_visible_impl(visible); + self.tl_data().set_visible(self, visible); + } - fn tl_close(self: Rc) { + fn tl_destroy(&self) { + self.tl_data().destroy_node(self); + self.tl_destroy_impl(); + } +} + +pub trait ToplevelNodeBase: Node { + fn tl_data(&self) -> &ToplevelData; + + fn tl_default_focus_child(&self) -> Option> { + None + } + + fn tl_accepts_keyboard_focus(&self) -> bool { + true + } + + fn tl_set_active(&self, active: bool) { + let _ = active; + } + + fn tl_on_activate(&self) { // nothing } - fn tl_set_visible(&self, visible: bool); - fn tl_destroy(&self); - - fn tl_last_active_child(self: Rc) -> Rc { - self.tl_into_dyn() + fn tl_focus_child(&self, seat: SeatId) -> Option> { + self.tl_data() + .focus_node + .get(&seat) + .or_else(|| self.tl_default_focus_child()) } + fn tl_set_workspace_ext(self: Rc, ws: &Rc) { + let _ = ws; + } + + fn tl_change_extents_impl(self: Rc, rect: &Rect); + + fn tl_close(self: Rc); + + fn tl_set_visible_impl(&self, visible: bool); + fn tl_destroy_impl(&self); + + fn tl_last_active_child(self: Rc) -> Rc; + fn tl_scanout_surface(&self) -> Option> { None }