From 571565c28ee42da0a2f2b67633ea0133f5a5e744 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 13 Feb 2026 12:57:05 -0800 Subject: [PATCH] dbus: Use `calloop` async executor New version of callop has a fix for this, so we're no longer blocked from using it. --- src/dbus/a11y_keyboard_monitor.rs | 11 +++++------ src/dbus/name_owners.rs | 14 +++++++++----- src/state.rs | 6 +++--- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/dbus/a11y_keyboard_monitor.rs b/src/dbus/a11y_keyboard_monitor.rs index c40be081..d09fdac9 100644 --- a/src/dbus/a11y_keyboard_monitor.rs +++ b/src/dbus/a11y_keyboard_monitor.rs @@ -1,6 +1,5 @@ // https://gitlab.gnome.org/GNOME/mutter/-/blob/main/data/dbus-interfaces/org.freedesktop.a11y.xml -use futures_executor::ThreadPool; use smithay::{ backend::input::KeyState, input::keyboard::{KeysymHandle, ModifiersState}, @@ -72,7 +71,7 @@ impl Clients { #[derive(Debug)] pub struct A11yKeyboardMonitorState { - executor: ThreadPool, + executor: calloop::futures::Scheduler<()>, clients: Arc>, active_virtual_mods: HashSet, conn: Arc>, @@ -80,7 +79,7 @@ pub struct A11yKeyboardMonitorState { } impl A11yKeyboardMonitorState { - pub fn new(executor: &ThreadPool) -> Self { + pub fn new(executor: &calloop::futures::Scheduler<()>) -> Self { let clients = Arc::new(Mutex::new(Clients::default())); let clients_clone = clients.clone(); let conn_cell = Arc::new(OnceLock::new()); @@ -88,7 +87,7 @@ impl A11yKeyboardMonitorState { let name_owners_cell = Arc::new(OnceLock::new()); let name_owners_cell_clone = name_owners_cell.clone(); let executor_clone = executor.clone(); - executor.spawn_ok(async move { + let _ = executor.schedule(async move { match serve(clients_clone, &executor_clone).await { Ok((conn, name_owners)) => { conn_cell_clone.set(conn).unwrap(); @@ -186,7 +185,7 @@ impl A11yKeyboardMonitorState { unichar, keysym.raw_code().raw() as u16, ); - self.executor.spawn_ok(async { + let _ = self.executor.schedule(async { let _ = future.await; }); } @@ -314,7 +313,7 @@ impl KeyboardMonitor { async fn serve( clients: Arc>, - executor: &ThreadPool, + executor: &calloop::futures::Scheduler<()>, ) -> zbus::Result<(zbus::Connection, NameOwners)> { let conn = zbus::Connection::session().await?; let name_owners = NameOwners::new(&conn, executor).await?; diff --git a/src/dbus/name_owners.rs b/src/dbus/name_owners.rs index fe3591b5..a2715c73 100644 --- a/src/dbus/name_owners.rs +++ b/src/dbus/name_owners.rs @@ -2,9 +2,10 @@ //! //! Compare to Mutter's `MetaDbusAccessChecker` -use futures_executor::ThreadPool; -use futures_util::stream::FusedStream; -use futures_util::{StreamExt, stream::FuturesUnordered}; +use futures_util::{ + StreamExt, + stream::{FusedStream, FuturesUnordered}, +}; use std::{ collections::{HashMap, HashSet}, future::{Future, poll_fn}, @@ -94,7 +95,10 @@ fn update_task(inner: Weak>) -> impl Future { pub struct NameOwners(Arc>); impl NameOwners { - pub async fn new(connection: &zbus::Connection, executor: &ThreadPool) -> zbus::Result { + pub async fn new( + connection: &zbus::Connection, + executor: &calloop::futures::Scheduler<()>, + ) -> zbus::Result { let dbus = fdo::DBusProxy::new(connection).await?; let stream = dbus.receive_name_owner_changed().await?; @@ -126,7 +130,7 @@ impl NameOwners { })); if enforce { - executor.spawn_ok(update_task(Arc::downgrade(&inner))); + let _ = executor.schedule(update_task(Arc::downgrade(&inner))); } Ok(NameOwners(inner)) diff --git a/src/state.rs b/src/state.rs index af0d1e2e..cfd38eda 100644 --- a/src/state.rs +++ b/src/state.rs @@ -32,7 +32,6 @@ use crate::{ use anyhow::Context; use calloop::RegistrationToken; use cosmic_comp_config::output::comp::{OutputConfig, OutputState}; -use futures_executor::ThreadPool; use i18n_embed::{ DesktopLanguageRequester, fluent::{FluentLanguageLoader, fluent_language_loader}, @@ -234,7 +233,7 @@ pub struct Common { pub display_handle: DisplayHandle, pub event_loop_handle: LoopHandle<'static, State>, pub event_loop_signal: LoopSignal, - pub async_executor: ThreadPool, + pub async_executor: calloop::futures::Scheduler<()>, pub popups: PopupManager, pub shell: Arc>, @@ -727,7 +726,8 @@ impl State { ); let workspace_state = WorkspaceState::new(dh, client_not_sandboxed); - let async_executor = ThreadPool::builder().pool_size(1).create().unwrap(); + let (source, async_executor) = calloop::futures::executor().unwrap(); + handle.insert_source(source, |_, _, _| {}).unwrap(); if let Err(err) = crate::dbus::init(&handle) { tracing::warn!(?err, "Failed to initialize dbus handlers");