From dfa2580bdc4dac8d878d1d5db6f882afec77cb1d Mon Sep 17 00:00:00 2001 From: Florian Finkernagel Date: Tue, 8 Apr 2025 08:59:32 +0200 Subject: [PATCH] refactor CompositorInterface.subscribe_event_loop to separate concerns --- src/compositors.rs | 45 +++++++++++++++++++++++++++-------------- src/compositors/niri.rs | 29 +++++++++----------------- src/compositors/sway.rs | 15 ++++---------- 3 files changed, 44 insertions(+), 45 deletions(-) diff --git a/src/compositors.rs b/src/compositors.rs index 407440b..e6ce740 100644 --- a/src/compositors.rs +++ b/src/compositors.rs @@ -66,11 +66,28 @@ impl Compositor { // } // } -pub trait CompositorInterface: Send + Sync { - fn request_visible_workspaces(&mut self) -> Vec; - fn subscribe_event_loop(self, tx: Sender, waker: Arc); +/// abstract 'sending back workspace change events' +pub (self) struct EventSender { + tx: Sender, + waker: Arc, } +impl EventSender { + fn new(tx: Sender, waker: Arc) -> Self { + EventSender { tx, waker } + } + + fn send(&self, workspace: WorkspaceVisible) { + self.tx.send(workspace).unwrap(); + self.waker.wake().unwrap(); + } +} +pub (self) trait CompositorInterface: Send + Sync { + fn request_visible_workspaces(&mut self) -> Vec; + fn subscribe_event_loop(self, event_sender: EventSender); +} + + pub struct ConnectionTask { tx: Sender, waker: Arc, @@ -96,14 +113,15 @@ impl ConnectionTask { tx: Sender, waker: Arc, ) { + let event_sender = EventSender::new(tx, waker); spawn(move || match composer { Compositor::Sway => { let composer_interface = sway::SwayConnectionTask::new(); - composer_interface.subscribe_event_loop(tx, waker); + composer_interface.subscribe_event_loop(event_sender); } Compositor::Niri => { let composer_interface = niri::NiriConnectionTask::new(); - composer_interface.subscribe_event_loop(tx, waker); + composer_interface.subscribe_event_loop(event_sender); } }); } @@ -127,16 +145,13 @@ impl ConnectionTask { } pub fn request_visible_workspaces(&mut self) { - for workspace in self - .interface - .request_visible_workspaces() - .into_iter() - { - self.tx.send(WorkspaceVisible { - output: workspace.output, - workspace_name: workspace.workspace_name, - }) - .unwrap(); + for workspace in self.interface.request_visible_workspaces().into_iter() { + self.tx + .send(WorkspaceVisible { + output: workspace.output, + workspace_name: workspace.workspace_name, + }) + .unwrap(); self.waker.wake().unwrap(); } diff --git a/src/compositors/niri.rs b/src/compositors/niri.rs index dbb3ab8..efc04bb 100644 --- a/src/compositors/niri.rs +++ b/src/compositors/niri.rs @@ -1,7 +1,5 @@ -use std::sync::{mpsc::Sender, Arc}; -use super::{CompositorInterface, WorkspaceVisible}; -use mio::Waker; +use super::{CompositorInterface, WorkspaceVisible, EventSender}; use niri_ipc::{socket::Socket, Event, Request, Response}; pub struct NiriConnectionTask {} @@ -29,7 +27,7 @@ impl NiriConnectionTask { } } impl CompositorInterface for NiriConnectionTask { - fn request_visible_workspaces(&mut self) -> Vec{ + fn request_visible_workspaces(&mut self) -> Vec { if let Ok((Ok(Response::Workspaces(workspaces)), _)) = Socket::connect() .expect("failed to connect to niri socket") .send(Request::Workspaces) @@ -37,20 +35,17 @@ impl CompositorInterface for NiriConnectionTask { return workspaces .into_iter() .filter(|w| w.is_active) - .map(|workspace| { - WorkspaceVisible { - output: workspace.output.unwrap_or_else(String::new), - workspace_name: workspace.name.unwrap_or_else(String::new), - } + .map(|workspace| WorkspaceVisible { + output: workspace.output.unwrap_or_else(String::new), + workspace_name: workspace.name.unwrap_or_else(String::new), }) - .collect() - } else - { + .collect(); + } else { panic!("unable to retrieve niri workspaces") } } - fn subscribe_event_loop(self, tx: Sender, waker: Arc) { + fn subscribe_event_loop(self, event_sender: EventSender) { if let Ok((Ok(Response::Handled), mut callback)) = Socket::connect() .expect("failed to connect to niri socket") .send(Request::EventStream) @@ -58,14 +53,10 @@ impl CompositorInterface for NiriConnectionTask { while let Ok(event) = callback() { if let Event::WorkspaceActivated { id, focused: _ } = event { let (workspace_name, output) = self.query_workspace(id); - - tx.send(WorkspaceVisible { + event_sender.send(WorkspaceVisible { output, workspace_name, - }) - .unwrap(); - - waker.wake().unwrap(); + }); } } } else { diff --git a/src/compositors/sway.rs b/src/compositors/sway.rs index 64748aa..3657105 100644 --- a/src/compositors/sway.rs +++ b/src/compositors/sway.rs @@ -1,7 +1,4 @@ -use std::sync::{mpsc::Sender, Arc}; - -use super::{CompositorInterface, WorkspaceVisible}; -use mio::Waker; +use super::{CompositorInterface, WorkspaceVisible, EventSender}; use swayipc::{Connection, Event, EventType, WorkspaceChange}; pub struct SwayConnectionTask { @@ -30,7 +27,7 @@ impl CompositorInterface for SwayConnectionTask { .collect() } - fn subscribe_event_loop(self, tx: Sender, waker: Arc) { + fn subscribe_event_loop(self, event_sender: EventSender) { let event_stream = self.sway_conn.subscribe([EventType::Workspace]).unwrap(); for event_result in event_stream { let event = event_result.unwrap(); @@ -39,14 +36,10 @@ impl CompositorInterface for SwayConnectionTask { }; if let WorkspaceChange::Focus = workspace_event.change { let current_workspace = workspace_event.current.unwrap(); - - tx.send(WorkspaceVisible { + event_sender.send(WorkspaceVisible { output: current_workspace.output.unwrap(), workspace_name: current_workspace.name.unwrap(), - }) - .unwrap(); - - waker.wake().unwrap(); + }); } } }