diff --git a/applets/cosmic-applet-power-battery/src/backlight.rs b/applets/cosmic-applet-power-battery/src/backlight.rs index 5683c62a..479f3563 100644 --- a/applets/cosmic-applet-power-battery/src/backlight.rs +++ b/applets/cosmic-applet-power-battery/src/backlight.rs @@ -1,3 +1,6 @@ +// TODO: use udev to monitor for brightness changes? +// How should key bindings be handled? Need something like gnome-settings-daemon? + use std::{ fs::{self, File}, io::{self, Read}, @@ -5,17 +8,33 @@ use std::{ str::FromStr, }; +#[zbus::dbus_proxy( + default_service = "org.freedesktop.login1", + interface = "org.freedesktop.login1.Session" +)] +trait LogindSession { + fn set_brightness(&self, subsystem: &str, name: &str, brightness: u32) -> zbus::Result<()>; +} + struct Backlight(PathBuf); impl Backlight { - fn brightness(&self) -> Option { + fn brightness(&self) -> Option { self.prop("brightness") } - fn max_brightness(&self) -> Option { + fn max_brightness(&self) -> Option { self.prop("max_brightness") } + async fn set_brightness( + &self, + session: &LogindSessionProxy<'_>, + value: u32, + ) -> zbus::Result<()> { + session.set_brightness("backlight", "", value).await // XXX + } + fn prop(&self, name: &str) -> Option { let mut file = File::open(&self.0.join(name)).ok()?; let mut s = String::new(); @@ -39,3 +58,5 @@ fn backlight() -> io::Result> { } Ok(best_backlight) } + +// TODO: keyboard backlight diff --git a/applets/cosmic-applet-power-battery/src/main.rs b/applets/cosmic-applet-power-battery/src/main.rs index 0fe43062..955cb826 100644 --- a/applets/cosmic-applet-power-battery/src/main.rs +++ b/applets/cosmic-applet-power-battery/src/main.rs @@ -1,7 +1,7 @@ use futures::prelude::*; use gtk4::{glib, prelude::*}; use relm4::{ComponentParts, ComponentSender, RelmApp, SimpleComponent, WidgetPlus}; -use std::time::Duration; +use std::{process::Command, time::Duration}; mod backlight; mod upower; @@ -164,6 +164,11 @@ impl SimpleComponent for AppModel { gtk4::Button { set_label: "Power Settings...", + connect_clicked => move |_| { + // XXX open subpanel + let _ = Command::new("cosmic-settings").spawn(); + // TODO hide + } } } }