2024-02-21 17:34:42 -05:00
|
|
|
use ashpd::desktop::settings::{ColorScheme, Contrast};
|
|
|
|
|
use ashpd::desktop::Color;
|
|
|
|
|
use iced::futures::{self, select, FutureExt, SinkExt, StreamExt};
|
2025-03-14 11:56:21 -04:00
|
|
|
use iced_futures::stream;
|
2024-03-01 20:21:52 -05:00
|
|
|
use tracing::error;
|
2024-02-21 17:34:42 -05:00
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
pub enum Desktop {
|
|
|
|
|
Accent(Color),
|
|
|
|
|
ColorScheme(ColorScheme),
|
|
|
|
|
Contrast(Contrast),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn desktop_settings() -> iced_futures::Subscription<Desktop> {
|
2024-10-16 20:36:46 -04:00
|
|
|
iced_futures::Subscription::run_with_id(
|
|
|
|
|
std::any::TypeId::of::<Desktop>(),
|
|
|
|
|
stream::channel(10, |mut tx| {
|
|
|
|
|
async move {
|
|
|
|
|
let mut attempts = 0;
|
|
|
|
|
loop {
|
|
|
|
|
let Ok(settings) = ashpd::desktop::settings::Settings::new().await else {
|
|
|
|
|
error!("Failed to create the settings proxy");
|
|
|
|
|
#[cfg(feature = "tokio")]
|
|
|
|
|
::tokio::time::sleep(::tokio::time::Duration::from_secs(
|
|
|
|
|
2_u64.pow(attempts),
|
|
|
|
|
))
|
2024-05-22 13:21:01 -04:00
|
|
|
.await;
|
2024-10-16 20:36:46 -04:00
|
|
|
#[cfg(not(feature = "tokio"))]
|
|
|
|
|
{
|
2025-03-14 11:56:21 -04:00
|
|
|
futures::future::pending::<()>().await;
|
2024-10-16 20:36:46 -04:00
|
|
|
unreachable!();
|
|
|
|
|
}
|
|
|
|
|
attempts += 1;
|
|
|
|
|
continue;
|
|
|
|
|
};
|
2024-02-21 17:34:42 -05:00
|
|
|
|
2024-10-16 20:36:46 -04:00
|
|
|
match settings.color_scheme().await {
|
|
|
|
|
Ok(color_scheme) => {
|
|
|
|
|
let _ = tx.send(Desktop::ColorScheme(color_scheme)).await;
|
|
|
|
|
}
|
|
|
|
|
Err(err) => error!("Failed to get the color scheme {err:?}"),
|
|
|
|
|
};
|
|
|
|
|
match settings.contrast().await {
|
|
|
|
|
Ok(contrast) => {
|
|
|
|
|
let _ = tx.send(Desktop::Contrast(contrast)).await;
|
|
|
|
|
}
|
|
|
|
|
Err(err) => error!("Failed to get the contrast {err:?}"),
|
|
|
|
|
};
|
2024-05-22 13:21:01 -04:00
|
|
|
|
2024-10-16 20:36:46 -04:00
|
|
|
let mut color_scheme_stream =
|
|
|
|
|
settings.receive_color_scheme_changed().await.ok();
|
|
|
|
|
if color_scheme_stream.is_none() {
|
|
|
|
|
error!("Failed to receive color scheme changes");
|
|
|
|
|
}
|
2024-05-22 13:21:01 -04:00
|
|
|
|
2024-10-16 20:36:46 -04:00
|
|
|
let mut contrast_stream = settings.receive_contrast_changed().await.ok();
|
|
|
|
|
if contrast_stream.is_none() {
|
|
|
|
|
error!("Failed to receive contrast changes");
|
2024-05-22 13:21:01 -04:00
|
|
|
}
|
2024-03-01 20:32:55 -05:00
|
|
|
|
2024-10-16 20:36:46 -04:00
|
|
|
loop {
|
|
|
|
|
if color_scheme_stream.is_none() && contrast_stream.is_none() {
|
|
|
|
|
break;
|
2024-02-21 17:34:42 -05:00
|
|
|
}
|
2024-10-16 20:36:46 -04:00
|
|
|
let next_color_scheme = async {
|
|
|
|
|
if let Some(s) = color_scheme_stream.as_mut() {
|
|
|
|
|
return s.next().await;
|
|
|
|
|
}
|
|
|
|
|
futures::future::pending().await
|
|
|
|
|
};
|
2024-05-22 13:21:01 -04:00
|
|
|
|
2024-10-16 20:36:46 -04:00
|
|
|
let next_contrast = async {
|
|
|
|
|
if let Some(s) = contrast_stream.as_mut() {
|
|
|
|
|
return s.next().await;
|
2024-05-22 13:21:01 -04:00
|
|
|
}
|
2024-10-16 20:36:46 -04:00
|
|
|
futures::future::pending().await
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
select! {
|
|
|
|
|
s = next_color_scheme.fuse() => {
|
|
|
|
|
if let Some(s) = s {
|
|
|
|
|
_ = tx.send(Desktop::ColorScheme(s)).await;
|
|
|
|
|
} else {
|
|
|
|
|
color_scheme_stream = None;
|
|
|
|
|
}
|
|
|
|
|
},
|
2024-05-22 13:21:01 -04:00
|
|
|
|
2024-10-16 20:36:46 -04:00
|
|
|
c = next_contrast.fuse() => {
|
|
|
|
|
if let Some(c) = c {
|
|
|
|
|
_ = tx.send(Desktop::Contrast(c)).await;
|
|
|
|
|
} else {
|
|
|
|
|
contrast_stream = None;
|
|
|
|
|
}
|
2024-05-22 13:21:01 -04:00
|
|
|
}
|
2024-10-16 20:36:46 -04:00
|
|
|
};
|
|
|
|
|
// Reset the attempts counter if we successfully received a change
|
|
|
|
|
attempts = 0;
|
|
|
|
|
}
|
2024-05-22 13:21:01 -04:00
|
|
|
}
|
2024-02-21 17:34:42 -05:00
|
|
|
}
|
2024-10-16 20:36:46 -04:00
|
|
|
}),
|
|
|
|
|
)
|
2024-02-21 17:34:42 -05:00
|
|
|
}
|