88 lines
2.5 KiB
Rust
88 lines
2.5 KiB
Rust
extern crate clap;
|
|
|
|
mod cli;
|
|
mod config;
|
|
mod fs;
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
use std::path::PathBuf;
|
|
use std::process::Command;
|
|
use std::{thread, time};
|
|
|
|
#[derive(Deserialize, Serialize)]
|
|
pub struct Config {
|
|
resume_file: PathBuf,
|
|
idle_level: i32,
|
|
dim_speed: u64,
|
|
resume_speed: u64,
|
|
}
|
|
|
|
fn transition(w_brightness: i32, speed: time::Duration) {
|
|
let c_brightness = get_brightness();
|
|
println!("Transitioning from {}% to {}%", c_brightness, w_brightness);
|
|
|
|
if c_brightness < w_brightness {
|
|
for n in c_brightness..w_brightness {
|
|
if n != c_brightness {
|
|
set_brightness(n);
|
|
thread::sleep(speed);
|
|
}
|
|
}
|
|
} else {
|
|
for n in (w_brightness..c_brightness).rev() {
|
|
if n != c_brightness {
|
|
set_brightness(n);
|
|
thread::sleep(speed);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn set_brightness(brightness: i32) {
|
|
Command::new("light")
|
|
.args(&["-S", &brightness.to_string()])
|
|
.spawn()
|
|
.expect("Failed to execute command 'light'");
|
|
}
|
|
|
|
fn get_brightness() -> i32 {
|
|
let output = Command::new("light")
|
|
.arg("-G")
|
|
.output()
|
|
.expect("Failed to execute command 'light'");
|
|
|
|
let string = String::from_utf8_lossy(&output.stdout);
|
|
let float: f32 = string.trim().parse().unwrap();
|
|
float.round() as i32
|
|
}
|
|
|
|
fn main() {
|
|
let args = cli::get_args();
|
|
let conf: Config;
|
|
|
|
if args.is_present("config") {
|
|
let config_path = PathBuf::from(args.value_of("config").unwrap());
|
|
conf = config::load_user(config_path);
|
|
} else {
|
|
conf = config::load_xdg();
|
|
}
|
|
let dim_speed = time::Duration::from_millis(conf.dim_speed);
|
|
let resume_speed = time::Duration::from_millis(conf.resume_speed);
|
|
|
|
if args.is_present("dim") {
|
|
let current_brightness = get_brightness().to_string();
|
|
match fs::write(&conf.resume_file, current_brightness) {
|
|
Ok(()) => println!("Current brightness written to resume file"),
|
|
Err(err) => eprintln!("Error writing brightness to resume file: {}", err),
|
|
}
|
|
transition(conf.idle_level, dim_speed);
|
|
}
|
|
if args.is_present("resume") {
|
|
let old_brightness: i32 = fs::read(&conf.resume_file).unwrap().parse().unwrap();
|
|
transition(old_brightness, resume_speed);
|
|
match fs::remove(&conf.resume_file) {
|
|
Ok(()) => println!("Resume file removed"),
|
|
Err(err) => eprintln!("Failed to remove resume file: {}", err),
|
|
}
|
|
}
|
|
}
|