From 27591216c6e677d4d7af2b83ba5f278577ef21e8 Mon Sep 17 00:00:00 2001 From: DataTriny Date: Fri, 22 May 2026 23:42:41 +0200 Subject: [PATCH] fix: Watch the IsEnabled property to lazily activate on Unix --- platforms/unix/src/context.rs | 46 +++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/platforms/unix/src/context.rs b/platforms/unix/src/context.rs index 3249aa27..2503178c 100644 --- a/platforms/unix/src/context.rs +++ b/platforms/unix/src/context.rs @@ -21,7 +21,7 @@ use tokio::{ }; #[cfg(feature = "tokio")] use tokio_stream::{StreamExt, wrappers::UnboundedReceiverStream}; -use zbus::{Connection, connection::Builder}; +use zbus::{Connection, connection::Builder, proxy::PropertyChanged}; use crate::{ adapter::{AdapterState, Callback, Message}, @@ -135,6 +135,33 @@ fn deactivate_adapter(entry: &mut AdapterEntry) { } } +async fn bus_after_status_change( + change: Option>, + session_bus: &Connection, + executor: &Executor<'_>, +) -> zbus::Result> { + let enabled = match change { + Some(change) => change.get().await?, + None => false, + }; + if enabled { + map_or_ignoring_broken_pipe(Bus::new(session_bus, executor).await, None, Some) + } else { + Ok(None) + } +} + +fn sync_adapters(adapters: &mut [AdapterEntry], atspi_bus: &Option) { + let active = atspi_bus.is_some(); + for entry in adapters { + if active { + activate_adapter(entry); + } else { + deactivate_adapter(entry); + } + } +} + async fn run_event_loop( executor: &Executor<'_>, session_bus: Connection, @@ -151,7 +178,7 @@ async fn run_event_loop( ); let status = StatusProxy::new(&session_bus).await?; - let changes = status.receive_screen_reader_enabled_changed().await.fuse(); + let changes = status.receive_is_enabled_changed().await.fuse(); pin!(changes); #[cfg(not(feature = "tokio"))] @@ -166,19 +193,8 @@ async fn run_event_loop( loop { select! { change = changes.next() => { - atspi_bus = None; - if let Some(change) = change { - if change.get().await? { - atspi_bus = map_or_ignoring_broken_pipe(Bus::new(&session_bus, executor).await, None, Some)?; - } - } - for entry in &mut adapters { - if atspi_bus.is_some() { - activate_adapter(entry); - } else { - deactivate_adapter(entry); - } - } + atspi_bus = bus_after_status_change(change, &session_bus, executor).await?; + sync_adapters(&mut adapters, &atspi_bus); } message = messages.next() => { if let Some(message) = message {