From 8e96e49c76337b868fd48f8e55abbb5595de3a83 Mon Sep 17 00:00:00 2001 From: drendog Date: Sun, 7 Dec 2025 01:39:17 +0100 Subject: [PATCH] refactor: remove facade and use trait contract to reduce indirection --- crates/adapters/src/lib.rs | 2 +- crates/adapters/src/wayland/facade.rs | 29 --------- crates/adapters/src/wayland/mod.rs | 2 +- crates/adapters/src/wayland/ops.rs | 22 +++++++ crates/adapters/src/wayland/shell_adapter.rs | 31 ++++++++++ crates/composition/src/event_loop.rs | 8 +-- crates/composition/src/shell.rs | 65 ++++++++------------ 7 files changed, 83 insertions(+), 76 deletions(-) delete mode 100644 crates/adapters/src/wayland/facade.rs create mode 100644 crates/adapters/src/wayland/ops.rs diff --git a/crates/adapters/src/lib.rs b/crates/adapters/src/lib.rs index ee48f61..6f24536 100644 --- a/crates/adapters/src/lib.rs +++ b/crates/adapters/src/lib.rs @@ -7,7 +7,7 @@ pub(crate) mod wayland; pub use rendering::femtovg::popup_window::PopupWindow; pub use wayland::config::{MultiSurfaceConfig, ShellSurfaceConfig, WaylandSurfaceConfig}; -pub use wayland::facade::ShellSystemFacade; +pub use wayland::ops::WaylandSystemOps; pub use wayland::shell_adapter::WaylandShellSystem; pub use wayland::surfaces::app_state::AppState; pub use wayland::surfaces::popup_manager::PopupManager; diff --git a/crates/adapters/src/wayland/facade.rs b/crates/adapters/src/wayland/facade.rs deleted file mode 100644 index e14512c..0000000 --- a/crates/adapters/src/wayland/facade.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::errors::Result; -use crate::wayland::shell_adapter::WaylandShellSystem; -use slint_interpreter::ComponentInstance; - -pub struct ShellSystemFacade { - inner: WaylandShellSystem, -} - -impl ShellSystemFacade { - pub fn new(inner: WaylandShellSystem) -> Self { - Self { inner } - } - - pub fn inner_ref(&self) -> &WaylandShellSystem { - &self.inner - } - - pub fn inner_mut(&mut self) -> &mut WaylandShellSystem { - &mut self.inner - } - - pub fn component_instance(&self) -> Result<&ComponentInstance> { - self.inner.component_instance() - } - - pub fn run(&mut self) -> Result<()> { - self.inner.run() - } -} diff --git a/crates/adapters/src/wayland/mod.rs b/crates/adapters/src/wayland/mod.rs index 6daee68..5eeab7f 100644 --- a/crates/adapters/src/wayland/mod.rs +++ b/crates/adapters/src/wayland/mod.rs @@ -1,8 +1,8 @@ pub(crate) mod config; pub(crate) mod event_handling; -pub(crate) mod facade; pub(crate) mod globals; pub(crate) mod managed_proxies; +pub mod ops; pub(crate) mod outputs; pub(crate) mod shell_adapter; pub(crate) mod surfaces; diff --git a/crates/adapters/src/wayland/ops.rs b/crates/adapters/src/wayland/ops.rs new file mode 100644 index 0000000..22b10d3 --- /dev/null +++ b/crates/adapters/src/wayland/ops.rs @@ -0,0 +1,22 @@ +use crate::errors::Result; +use crate::wayland::config::ShellSurfaceConfig; +use crate::wayland::surfaces::app_state::AppState; +use layer_shika_domain::value_objects::output_handle::OutputHandle; +use slint_interpreter::ComponentInstance; +use smithay_client_toolkit::reexports::calloop::LoopHandle; + +pub trait WaylandSystemOps { + fn run(&mut self) -> Result<()>; + + fn spawn_surface(&mut self, config: &ShellSurfaceConfig) -> Result>; + + fn despawn_surface(&mut self, name: &str) -> Result<()>; + + fn app_state(&self) -> &AppState; + + fn app_state_mut(&mut self) -> &mut AppState; + + fn event_loop_handle(&self) -> LoopHandle<'static, AppState>; + + fn component_instance(&self) -> Result<&ComponentInstance>; +} diff --git a/crates/adapters/src/wayland/shell_adapter.rs b/crates/adapters/src/wayland/shell_adapter.rs index db22a0d..32b8376 100644 --- a/crates/adapters/src/wayland/shell_adapter.rs +++ b/crates/adapters/src/wayland/shell_adapter.rs @@ -2,6 +2,7 @@ use crate::wayland::{ config::{LayerSurfaceConfig, ShellSurfaceConfig, WaylandSurfaceConfig}, globals::context::GlobalContext, managed_proxies::ManagedWlPointer, + ops::WaylandSystemOps, outputs::{OutputManager, OutputManagerContext}, surfaces::layer_surface::{SurfaceCtx, SurfaceSetupParams}, surfaces::popup_manager::{PopupContext, PopupManager}, @@ -756,3 +757,33 @@ impl ShellSystemPort for WaylandShellSystem { }) } } + +impl WaylandSystemOps for WaylandShellSystem { + fn run(&mut self) -> Result<()> { + WaylandShellSystem::run(self) + } + + fn spawn_surface(&mut self, config: &ShellSurfaceConfig) -> Result> { + WaylandShellSystem::spawn_surface(self, config) + } + + fn despawn_surface(&mut self, name: &str) -> Result<()> { + WaylandShellSystem::despawn_surface(self, name) + } + + fn app_state(&self) -> &AppState { + WaylandShellSystem::app_state(self) + } + + fn app_state_mut(&mut self) -> &mut AppState { + WaylandShellSystem::app_state_mut(self) + } + + fn event_loop_handle(&self) -> LoopHandle<'static, AppState> { + WaylandShellSystem::event_loop_handle(self) + } + + fn component_instance(&self) -> Result<&ComponentInstance> { + WaylandShellSystem::component_instance(self) + } +} diff --git a/crates/composition/src/event_loop.rs b/crates/composition/src/event_loop.rs index 74cf279..7482658 100644 --- a/crates/composition/src/event_loop.rs +++ b/crates/composition/src/event_loop.rs @@ -4,7 +4,7 @@ use layer_shika_adapters::platform::calloop::{ EventSource, Generic, Interest, Mode, PostAction, RegistrationToken, TimeoutAction, Timer, channel, }; -use layer_shika_adapters::{AppState, ShellSystemFacade}; +use layer_shika_adapters::{AppState, WaylandSystemOps}; use std::cell::RefCell; use std::os::unix::io::AsFd; use std::rc::Weak; @@ -15,11 +15,11 @@ pub trait FromAppState<'a> { } pub struct EventLoopHandleBase { - system: Weak>, + system: Weak>, } impl EventLoopHandleBase { - pub fn new(system: Weak>) -> Self { + pub fn new(system: Weak>) -> Self { Self { system } } @@ -29,7 +29,7 @@ impl EventLoopHandleBase { F: FnMut(S::Event, &mut S::Metadata, &mut AppState) -> R + 'static, { let system = self.system.upgrade().ok_or(Error::SystemDropped)?; - let loop_handle = system.borrow().inner_ref().event_loop_handle(); + let loop_handle = system.borrow().event_loop_handle(); loop_handle.insert_source(source, callback).map_err(|e| { Error::Adapter( diff --git a/crates/composition/src/shell.rs b/crates/composition/src/shell.rs index b6ad30e..3df18af 100644 --- a/crates/composition/src/shell.rs +++ b/crates/composition/src/shell.rs @@ -12,7 +12,7 @@ use layer_shika_adapters::platform::slint_interpreter::{ CompilationResult, Compiler, ComponentInstance, Value, }; use layer_shika_adapters::{ - AppState, ShellSurfaceConfig, ShellSystemFacade, SurfaceState, WaylandSurfaceConfig, + AppState, ShellSurfaceConfig, SurfaceState, WaylandSurfaceConfig, WaylandSystemOps, }; use layer_shika_domain::config::SurfaceConfig; use layer_shika_domain::entities::output_registry::OutputRegistry; @@ -223,7 +223,7 @@ type OutputConnectedHandler = Box; type OutputDisconnectedHandler = Box; pub struct Shell { - inner: Rc>, + inner: Rc>, surfaces: HashMap, surface_handles: HashMap, compilation_result: Rc, @@ -397,8 +397,7 @@ impl Shell { ); let inner = layer_shika_adapters::WaylandShellSystem::new(&wayland_config)?; - let facade = ShellSystemFacade::new(inner); - let inner_rc = Rc::new(RefCell::new(facade)); + let inner_rc: Rc> = Rc::new(RefCell::new(inner)); let (sender, receiver) = channel::channel(); @@ -458,8 +457,7 @@ impl Shell { .collect::>>()?; let inner = layer_shika_adapters::WaylandShellSystem::new_multi(&shell_configs)?; - let facade = ShellSystemFacade::new(inner); - let inner_rc = Rc::new(RefCell::new(facade)); + let inner_rc: Rc> = Rc::new(RefCell::new(inner)); let (sender, receiver) = channel::channel(); @@ -492,7 +490,7 @@ impl Shell { } fn setup_popup_command_handler(&self, receiver: channel::Channel) -> Result<()> { - let loop_handle = self.inner.borrow().inner_ref().event_loop_handle(); + let loop_handle = self.inner.borrow().event_loop_handle(); let control = self.control(); loop_handle @@ -586,8 +584,8 @@ impl Shell { config: wayland_config, }; - let mut facade = self.inner.borrow_mut(); - let handles = facade.inner_mut().spawn_surface(&shell_config)?; + let mut system = self.inner.borrow_mut(); + let handles = system.spawn_surface(&shell_config)?; let surface_handle = SurfaceHandle::new(); self.surface_handles @@ -613,8 +611,8 @@ impl Shell { self.surfaces.remove(&surface_name); - let mut facade = self.inner.borrow_mut(); - facade.inner_mut().despawn_surface(&surface_name)?; + let mut system = self.inner.borrow_mut(); + system.despawn_surface(&surface_name)?; log::info!( "Despawned surface '{}' with handle {:?}", @@ -666,8 +664,7 @@ impl Shell { })); } - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); system .app_state() @@ -685,8 +682,7 @@ impl Shell { where F: FnMut(&str, &ComponentInstance), { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for name in self.surfaces.keys() { for surface in system.app_state().surfaces_by_name(name) { @@ -699,8 +695,7 @@ impl Shell { where F: FnOnce(&ComponentInstance) -> R, { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); let window = system .app_state() .get_output_by_handle(handle) @@ -716,8 +711,7 @@ impl Shell { where F: FnMut(OutputHandle, &ComponentInstance), { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for (handle, surface) in system.app_state().outputs_with_handles() { f(handle, surface.component_instance()); } @@ -746,8 +740,7 @@ impl Shell { let control = self.control(); let handler = Rc::new(handler); - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for surface in system.app_state().surfaces_by_name(surface_name) { let handler_rc = Rc::clone(&handler); @@ -788,8 +781,7 @@ impl Shell { let control = self.control(); let handler = Rc::new(handler); - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for surface in system.app_state().surfaces_by_name(surface_name) { let handler_rc = Rc::clone(&handler); @@ -819,8 +811,7 @@ impl Shell { { let control = self.control(); let handler = Rc::new(handler); - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for surface in system.app_state().all_outputs() { let handler_rc = Rc::clone(&handler); @@ -849,8 +840,7 @@ impl Shell { { let control = self.control(); let handler = Rc::new(handler); - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for surface in system.app_state().all_outputs() { let handler_rc = Rc::clone(&handler); @@ -876,8 +866,7 @@ impl Shell { where F: Fn(&ComponentInstance, LayerSurfaceHandle<'_>), { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); if self.surfaces.contains_key(surface_name) { for surface in system.app_state().surfaces_by_name(surface_name) { @@ -891,8 +880,7 @@ impl Shell { where F: Fn(&ComponentInstance, LayerSurfaceHandle<'_>), { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for surface in system.app_state().all_outputs() { let surface_handle = LayerSurfaceHandle::from_window_state(surface); @@ -901,20 +889,17 @@ impl Shell { } pub fn output_registry(&self) -> OutputRegistry { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); system.app_state().output_registry().clone() } pub fn get_output_info(&self, handle: OutputHandle) -> Option { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); system.app_state().get_output_info(handle).cloned() } pub fn all_output_info(&self) -> Vec { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); system.app_state().all_output_info().cloned().collect() } } @@ -931,8 +916,7 @@ impl ShellRuntime for Shell { where F: FnMut(&ComponentInstance), { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); if self.surfaces.contains_key(name) { for surface in system.app_state().surfaces_by_name(name) { @@ -945,8 +929,7 @@ impl ShellRuntime for Shell { where F: FnMut(&str, &ComponentInstance), { - let facade = self.inner.borrow(); - let system = facade.inner_ref(); + let system = self.inner.borrow(); for name in self.surfaces.keys() { for surface in system.app_state().surfaces_by_name(name) {