azalea_shell/service/
brightness.rs

1use brightness::{Brightness, BrightnessDevice};
2use futures_lite::StreamExt;
3use tokio::sync::broadcast;
4
5#[derive(azalea_derive::StaticServiceManager)]
6pub struct Service {
7    tx: flume::Sender<f64>,
8}
9
10#[derive(Clone, Default)]
11pub struct Init {}
12
13#[derive(Clone, Debug)]
14pub enum Input {
15    /// Default sink brightness
16    SystemBrightness(f64),
17}
18
19#[derive(Clone, Debug)]
20pub enum Output {
21    /// Default sink brightness
22    SystemBrightness(f64),
23}
24
25impl azalea_service::Service for Service {
26    type Init = Init;
27    type Input = Input;
28    type Event = ();
29    type Output = Output;
30
31    const DISABLE_EVENTS: bool = true;
32
33    async fn new(
34        _init: Self::Init,
35        _: flume::Sender<Self::Input>,
36        output_sender: broadcast::Sender<Self::Output>,
37    ) -> Self {
38        let mut devices: Vec<BrightnessDevice> = brightness::brightness_devices()
39            .filter_map(|dev| dev.ok())
40            .collect()
41            .await;
42
43        if let Some(dev) = devices.first() {
44            let brightness = dev.get().await.unwrap_or(0);
45            drop(output_sender.send(Output::SystemBrightness(brightness as f64 / 100.)));
46        }
47
48        let (tx, rx) = flume::unbounded();
49
50        relm4::spawn(async move {
51            while let Ok(brightness_percent) = rx.recv_async().await {
52                for dev in &mut devices {
53                    drop(dev.set((brightness_percent * 100.) as u32).await);
54                }
55            }
56        });
57
58        Self { tx }
59    }
60
61    async fn message(
62        &mut self,
63        input: Self::Input,
64        output_sender: &broadcast::Sender<Self::Output>,
65    ) {
66        match input {
67            Input::SystemBrightness(brightness_percent) => {
68                drop(output_sender.send(Output::SystemBrightness(brightness_percent)));
69                // TODO: Debounce
70                let _ = self.tx.send_async(brightness_percent).await;
71            }
72        }
73    }
74}