Skip to content

Commit

Permalink
Replace ashpd dependency with just zbus
Browse files Browse the repository at this point in the history
This makes our dependency tree lighter and zbus is an already existing dependency (through accesskit).

cc #7276
  • Loading branch information
tronical committed Jan 15, 2025
1 parent b8ffca0 commit 5030d66
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 27 deletions.
3 changes: 2 additions & 1 deletion internal/backends/winit/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ accesskit_winit = { version = "0.23", optional = true }
copypasta = { version = "0.10", default-features = false }

[target.'cfg(not(any(target_family = "windows", target_os = "macos", target_os = "ios", target_arch = "wasm32")))'.dependencies]
ashpd = { version = "0.9.2" }
# Use same version and executor as accesskit
zbus = { version = "4.4.0", default-features = false, features = ["async-io"] }
futures = { version = "0.3.31" }

[target.'cfg(target_os = "macos")'.dependencies]
Expand Down
2 changes: 2 additions & 0 deletions internal/backends/winit/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ mod renderer {
mod accesskit;
#[cfg(muda)]
mod muda;
#[cfg(not(use_winit_theme))]
mod xdg_color_scheme;

#[cfg(target_arch = "wasm32")]
pub(crate) mod wasm_input_helper;
Expand Down
30 changes: 4 additions & 26 deletions internal/backends/winit/winitwindowadapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -653,32 +653,10 @@ impl WinitWindowAdapter {
window_inner
.context()
.spawn_local(async move {
let Ok(settings) = ashpd::desktop::settings::Settings::new().await else { return };

let Ok(initial_color_scheme_value) = settings.color_scheme().await else { return };

let convert = |ashpd_color_scheme| match ashpd_color_scheme {
ashpd::desktop::settings::ColorScheme::NoPreference => ColorScheme::Unknown,
ashpd::desktop::settings::ColorScheme::PreferDark => ColorScheme::Dark,
ashpd::desktop::settings::ColorScheme::PreferLight => ColorScheme::Light,
};

if let Some(window) = self_weak.upgrade() {
window.set_color_scheme(convert(initial_color_scheme_value));
}

let Ok(mut color_scheme_stream) = settings.receive_color_scheme_changed().await
else {
return;
};

loop {
use futures::stream::StreamExt;

let Some(new_scheme) = color_scheme_stream.next().await else { break };
if let Some(window) = self_weak.upgrade() {
window.set_color_scheme(convert(new_scheme));
}
if let Err(err) =
crate::xdg_color_scheme::watch(self_weak).await
{
i_slint_core::debug_log!("Error watching for xdg color schemes: {}", err);
}
})
.ok()
Expand Down
55 changes: 55 additions & 0 deletions internal/backends/winit/xdg_color_scheme.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0

use std::rc::Weak;

use i_slint_core::items::ColorScheme;

use crate::WinitWindowAdapter;

fn xdg_color_scheme_to_slint(value: zbus::zvariant::OwnedValue) -> ColorScheme {
match value.downcast_ref::<u32>() {
Ok(1) => ColorScheme::Dark,
Ok(2) => ColorScheme::Light,
_ => ColorScheme::Unknown,
}
}

pub async fn watch(window_weak: Weak<WinitWindowAdapter>) -> zbus::Result<()> {
let connection = zbus::Connection::session().await?;
let settings_proxy: zbus::Proxy = zbus::proxy::Builder::new(&connection)
.interface("org.freedesktop.portal.Settings")?
.path("/org/freedesktop/portal/desktop")?
.destination("org.freedesktop.portal.Desktop")?
.build()
.await?;

let initial_value: zbus::zvariant::OwnedValue =
settings_proxy.call("Read", &("org.freedesktop.appearance", "color-scheme")).await?;

if let Some(window) = window_weak.upgrade() {
window.set_color_scheme(xdg_color_scheme_to_slint(initial_value));
}

use futures::stream::StreamExt;

let mut color_scheme_stream = settings_proxy
.receive_signal_with_args(
"SettingChanged",
&[(0, "org.freedesktop.appearance"), (1, "color-scheme")],
)
.await?
.map(|message| {
let (_, _, scheme): (String, String, zbus::zvariant::OwnedValue) =
message.body().deserialize().ok()?;
Some(scheme)
});

while let Some(Some(new_scheme)) = color_scheme_stream.next().await {
if let Some(window) = window_weak.upgrade() {
window.set_color_scheme(xdg_color_scheme_to_slint(new_scheme));
}
}

Ok(())
}

0 comments on commit 5030d66

Please sign in to comment.