2019-07-31 00:42:03 +02:00
|
|
|
use crate::color::Color;
|
2019-09-06 21:54:04 +02:00
|
|
|
use crate::widgets::bar_widget::{BarWidget, BarWidgetImpl};
|
2019-10-05 21:41:09 +02:00
|
|
|
use crate::widget::WaitContext;
|
2019-07-31 00:42:03 +02:00
|
|
|
|
2019-07-31 10:26:12 +02:00
|
|
|
use std::fs::OpenOptions;
|
|
|
|
|
use std::io::{Error, ErrorKind};
|
|
|
|
|
use std::io::{Read, Write};
|
|
|
|
|
use std::path::{Path, PathBuf};
|
2019-07-31 00:42:03 +02:00
|
|
|
|
|
|
|
|
pub struct Backlight {
|
|
|
|
|
device_path: PathBuf,
|
|
|
|
|
cur_brightness: u64,
|
|
|
|
|
max_brightness: u64,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn read_file_as_u64(path: &Path) -> Result<u64, Error> {
|
2019-07-31 10:26:12 +02:00
|
|
|
let mut file = OpenOptions::new().read(true).open(path)?;
|
2019-07-31 00:42:03 +02:00
|
|
|
let mut str = String::new();
|
|
|
|
|
file.read_to_string(&mut str)?;
|
|
|
|
|
str.pop();
|
2019-07-31 10:26:12 +02:00
|
|
|
str.parse::<u64>()
|
|
|
|
|
.map_err(|_e| Error::new(ErrorKind::Other, "unable to parse value"))
|
2019-07-31 00:42:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn write_file_as_u64(path: &Path, value: u64) -> Result<(), Error> {
|
2019-07-31 10:26:12 +02:00
|
|
|
let mut file = OpenOptions::new().write(true).open(path)?;
|
2019-07-31 00:42:03 +02:00
|
|
|
file.write_fmt(format_args!("{}", value))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Backlight {
|
|
|
|
|
pub fn update(&mut self) -> Result<(), Error> {
|
|
|
|
|
self.cur_brightness = read_file_as_u64(self.device_path.join("brightness").as_path())?;
|
|
|
|
|
self.max_brightness = read_file_as_u64(self.device_path.join("max_brightness").as_path())?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn sync(&mut self) -> Result<(), Error> {
|
2019-07-31 10:26:12 +02:00
|
|
|
write_file_as_u64(
|
|
|
|
|
self.device_path.join("brightness").as_path(),
|
|
|
|
|
self.cur_brightness,
|
|
|
|
|
)?;
|
2019-07-31 00:42:03 +02:00
|
|
|
self.update()?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn brightness(&self) -> f32 {
|
|
|
|
|
if self.cur_brightness > self.max_brightness {
|
|
|
|
|
// what.
|
2019-08-04 14:11:21 +02:00
|
|
|
return 1.0;
|
2019-07-31 00:42:03 +02:00
|
|
|
}
|
|
|
|
|
|
2019-08-04 14:11:21 +02:00
|
|
|
(self.cur_brightness as f32 / self.max_brightness as f32)
|
2019-07-31 00:42:03 +02:00
|
|
|
}
|
|
|
|
|
|
2019-09-06 21:54:04 +02:00
|
|
|
pub fn set(&mut self, val: f32) -> Result<(), Error> {
|
|
|
|
|
self.cur_brightness = (self.max_brightness as f32 * val) as u64;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-31 00:42:03 +02:00
|
|
|
pub fn add(&mut self, diff: f32) -> Result<(), Error> {
|
2019-08-04 14:11:21 +02:00
|
|
|
let inc = (self.max_brightness as f32 * diff) as i64;
|
2019-07-31 00:42:03 +02:00
|
|
|
|
|
|
|
|
self.cur_brightness = if self.cur_brightness as i64 + inc < 1 {
|
|
|
|
|
1
|
|
|
|
|
} else if self.cur_brightness as i64 + inc > self.max_brightness as i64 {
|
|
|
|
|
self.max_brightness
|
|
|
|
|
} else {
|
|
|
|
|
(self.cur_brightness as i64 + inc) as u64
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-06 21:54:04 +02:00
|
|
|
pub fn new(font_size: f32, length: u32) -> Result<Box<BarWidget>, Error> {
|
2019-07-31 10:26:12 +02:00
|
|
|
let devices = Path::new("/sys/class/backlight").read_dir()?;
|
2019-07-31 00:42:03 +02:00
|
|
|
|
2019-07-31 10:26:12 +02:00
|
|
|
let first_device = match devices.take(1).next() {
|
|
|
|
|
Some(v) => match v {
|
|
|
|
|
Ok(v) => v,
|
|
|
|
|
Err(_) => return Err(Error::new(ErrorKind::Other, "no backlight device")),
|
|
|
|
|
},
|
|
|
|
|
None => return Err(Error::new(ErrorKind::Other, "no backlight device")),
|
|
|
|
|
};
|
|
|
|
|
let mut dev = Backlight {
|
2019-07-31 00:42:03 +02:00
|
|
|
device_path: first_device.path(),
|
|
|
|
|
cur_brightness: 0,
|
|
|
|
|
max_brightness: 0,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
dev.update()?;
|
|
|
|
|
|
2019-09-06 21:54:04 +02:00
|
|
|
Ok(BarWidget::new_simple(font_size, length, Box::new(dev)))
|
2019-07-31 00:42:03 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-06 21:54:04 +02:00
|
|
|
impl BarWidgetImpl for Backlight {
|
2019-10-05 21:41:09 +02:00
|
|
|
fn wait(&mut self, _: &mut WaitContext) {}
|
2019-09-06 21:54:04 +02:00
|
|
|
fn name(&self) -> &str {
|
|
|
|
|
"backlight"
|
2019-07-31 00:42:03 +02:00
|
|
|
}
|
2019-09-06 21:54:04 +02:00
|
|
|
fn value(&self) -> f32 {
|
|
|
|
|
self.brightness()
|
|
|
|
|
}
|
|
|
|
|
fn color(&self) -> Color {
|
|
|
|
|
Color::new(1.0, 1.0, 1.0, 1.0)
|
|
|
|
|
}
|
|
|
|
|
fn inc(&mut self, inc: f32) {
|
|
|
|
|
self.add(inc).unwrap();
|
|
|
|
|
match self.sync() {
|
|
|
|
|
Ok(val) => val,
|
|
|
|
|
Err(err) => {
|
|
|
|
|
eprintln!("Error while trying to change brightness: {}", err);
|
|
|
|
|
()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fn set(&mut self, val: f32) {
|
|
|
|
|
self.set(val).unwrap();
|
|
|
|
|
match self.sync() {
|
|
|
|
|
Ok(val) => val,
|
|
|
|
|
Err(err) => {
|
|
|
|
|
eprintln!("Error while trying to change brightness: {}", err);
|
|
|
|
|
()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fn toggle(&mut self) {
|
|
|
|
|
self.cur_brightness = if self.cur_brightness == 1 {
|
|
|
|
|
self.max_brightness
|
2019-07-31 00:42:03 +02:00
|
|
|
} else {
|
2019-09-06 21:54:04 +02:00
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
match self.sync() {
|
|
|
|
|
Ok(val) => val,
|
|
|
|
|
Err(err) => {
|
|
|
|
|
eprintln!("Error while trying to change brightness: {}", err);
|
|
|
|
|
()
|
2019-07-31 10:26:12 +02:00
|
|
|
}
|
2019-07-31 00:42:03 +02:00
|
|
|
}
|
|
|
|
|
}
|
2019-07-31 10:26:12 +02:00
|
|
|
}
|