azalea_shell/service/
brightness.rs1use 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 SystemBrightness(f64),
17}
18
19#[derive(Clone, Debug)]
20pub enum Output {
21 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 let _ = self.tx.send_async(brightness_percent).await;
71 }
72 }
73 }
74}