From 5419c2a93af31d12a437fad4f4434b934169e8bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christina=20S=C3=B8rensen?= Date: Tue, 26 Mar 2024 10:12:48 +0100 Subject: [PATCH] feat: add `-c,--change` command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christina Sørensen --- Cargo.lock | 2 +- src/cli/command.rs | 9 ++++++++- src/main.rs | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68e25d0..49b4f79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -177,7 +177,7 @@ checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lir" -version = "0.1.0" +version = "0.0.1" dependencies = [ "clap", "clap_complete", diff --git a/src/cli/command.rs b/src/cli/command.rs index fbf9a45..f0bba68 100644 --- a/src/cli/command.rs +++ b/src/cli/command.rs @@ -16,7 +16,14 @@ pub fn build_cli() -> Command { .author(crate_authors!("\n")) //.arg(arg!(--init ... "Init config.yaml")) .arg( - arg!(-p --percentage [percentage] "Set brightness by percentage") + arg!(-p --percentage "Set brightness by percentage.") + .required(false) + .value_parser(value_parser!(i32)), + ) + .arg( + arg!(change: -c --change "Change brightness by percentage.") + .required(false) + .allow_hyphen_values(true) .value_parser(value_parser!(i32)), ) } diff --git a/src/main.rs b/src/main.rs index 81a8542..74c9f97 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,6 +25,18 @@ fn get_max_brightness() -> std::io::Result { .expect("max brightnesss does not cleanly parse as i32")) } +fn get_current_brightness() -> std::io::Result { + let mut current_brightness_file = + File::open("/sys/class/backlight/intel_backlight/brightness")?; + let mut current_brightness_buffer = String::new(); + // POP removes trailing newline + current_brightness_file.read_to_string(&mut current_brightness_buffer)?; + current_brightness_buffer.pop(); + Ok(current_brightness_buffer + .parse::() + .expect("max brightnesss does not cleanly parse as i32")) +} + fn set_brightness_percentage(brightness: i32) -> std::io::Result<()> { let percentage = (get_max_brightness().expect("max brightnesss does not cleanly parse as i32") / 100) @@ -37,6 +49,31 @@ fn set_brightness_percentage(brightness: i32) -> std::io::Result<()> { Ok(()) } +/// Changes the brightness by percentage relative to max brightness +fn change_brightness_percentage(brightness: i32) -> std::io::Result<()> { + let max_brightness = get_max_brightness()?; + let current_brightness = get_current_brightness()?; + let delta_brightness = (max_brightness / 100) * brightness.abs(); + + trace!("{}", delta_brightness); + trace!("{}", brightness); + trace!("{}", max_brightness); + trace!("{}", current_brightness); + + let mut new_brightness = current_brightness + delta_brightness * brightness.signum(); + + if new_brightness > max_brightness { + new_brightness = max_brightness; + } + trace!("{}", new_brightness); + fs::write( + "/sys/class/backlight/intel_backlight/brightness", + new_brightness.to_string(), + )?; + + Ok(()) +} + fn main() -> std::io::Result<()> { pretty_env_logger::init(); @@ -44,6 +81,8 @@ fn main() -> std::io::Result<()> { if let Some(brightness) = matches.get_one::("percentage") { set_brightness_percentage(*brightness)?; + } else if let Some(brightness) = matches.get_one::("change") { + change_brightness_percentage(*brightness)?; } else { set_brightness_percentage( get_max_brightness().expect("max brightnesss does not cleanly parse as i32"),