Improve sysinfo module

main
Tassilo Horn 3 years ago
parent 2b9d4bf198
commit 96201e5fba
  1. 64
      swayrbar/src/module/sysinfo.rs

@ -28,9 +28,18 @@ use sysinfo::SystemExt;
const NAME: &str = "sysinfo"; const NAME: &str = "sysinfo";
struct State {
cpu_usage: f32,
mem_usage: f64,
load_avg_1: f64,
load_avg_5: f64,
load_avg_15: f64,
}
pub struct BarModuleSysInfo { pub struct BarModuleSysInfo {
config: config::ModuleConfig, config: config::ModuleConfig,
system: Mutex<si::System>, system: Mutex<si::System>,
state: Mutex<State>,
} }
struct OnceRefresher { struct OnceRefresher {
@ -86,11 +95,37 @@ fn get_load_average(
} }
} }
fn refresh_state(sys: &mut si::System, state: &mut State) {
let updater = OnceRefresher::new();
state.cpu_usage = get_cpu_usage(sys, &updater);
state.mem_usage = get_memory_usage(sys, &updater);
state.load_avg_1 = get_load_average(sys, LoadAvg::One, &updater);
state.load_avg_5 = get_load_average(sys, LoadAvg::Five, &updater);
state.load_avg_15 = get_load_average(sys, LoadAvg::Fifteen, &updater);
}
fn get_text(fmt: &str, html_escape: bool, state: &State) -> String {
format_placeholders!(fmt, html_escape, {
"cpu_usage" => state.cpu_usage,
"mem_usage" => state.mem_usage,
"load_avg_1" => state.load_avg_1,
"load_avg_5" => state.load_avg_5,
"load_avg_15" => state.load_avg_15,
})
}
impl BarModuleFn for BarModuleSysInfo { impl BarModuleFn for BarModuleSysInfo {
fn create(config: config::ModuleConfig) -> Box<dyn BarModuleFn> { fn create(config: config::ModuleConfig) -> Box<dyn BarModuleFn> {
Box::new(BarModuleSysInfo { Box::new(BarModuleSysInfo {
config, config,
system: Mutex::new(si::System::new_all()), system: Mutex::new(si::System::new_all()),
state: Mutex::new(State {
cpu_usage: 0.0,
mem_usage: 0.0,
load_avg_1: 0.0,
load_avg_5: 0.0,
load_avg_15: 0.0,
}),
}) })
} }
@ -111,24 +146,17 @@ impl BarModuleFn for BarModuleSysInfo {
} }
fn build(&self) -> s::Block { fn build(&self) -> s::Block {
let updater = OnceRefresher::new(); let mut sys = self.system.lock().expect("Could not lock state.");
let mut state = self.state.lock().expect("Could not lock state.");
refresh_state(&mut sys, &mut state);
s::Block { s::Block {
name: Some(NAME.to_owned()), name: Some(NAME.to_owned()),
instance: Some(self.config.instance.clone()), instance: Some(self.config.instance.clone()),
full_text: { full_text: get_text(
let mut sys = self.system.lock().unwrap(); &self.config.format,
format_placeholders!(&self.config.format, self.config.is_html_escape(),
self.config.is_html_escape(), { &state,
"cpu_usage" => get_cpu_usage(&mut sys, &updater), ),
"mem_usage" => get_memory_usage(&mut sys, &updater),
"load_avg_1" => get_load_average(&mut sys,
LoadAvg::One, &updater),
"load_avg_5" => get_load_average(&mut sys,
LoadAvg::Five, &updater),
"load_avg_15" => get_load_average(&mut sys,
LoadAvg::Fifteen, &updater),
})
},
align: Some(s::Align::Left), align: Some(s::Align::Left),
markup: Some(s::Markup::Pango), markup: Some(s::Markup::Pango),
short_text: None, short_text: None,
@ -146,8 +174,8 @@ impl BarModuleFn for BarModuleSysInfo {
} }
} }
fn subst_args<'a>(&'a self, _cmd: &'a [String]) -> Option<Vec<String>> { fn subst_args<'a>(&'a self, cmd: &'a [String]) -> Option<Vec<String>> {
// TOOD: Set a State we can refer to here. let state = self.state.lock().expect("Could not lock state.");
todo!() Some(cmd.iter().map(|arg| get_text(arg, false, &state)).collect())
} }
} }

Loading…
Cancel
Save