Compare commits
8 Commits
ee79a10968
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| bee2189ae5 | |||
| 3b2c74c01e | |||
| b21a06b622 | |||
| 4fcbf23210 | |||
| b124148b0b | |||
| b9935c991f | |||
| f51bbf62d9 | |||
| 376db0eeb4 |
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -208,6 +208,7 @@ dependencies = [
|
|||||||
"glob",
|
"glob",
|
||||||
"i3monkit",
|
"i3monkit",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
|
"regex",
|
||||||
"structopt",
|
"structopt",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -27,3 +27,4 @@ chrono = "0.4"
|
|||||||
chrono-tz = "0.5"
|
chrono-tz = "0.5"
|
||||||
glob = "0.3.1"
|
glob = "0.3.1"
|
||||||
thiserror = "1.0.40"
|
thiserror = "1.0.40"
|
||||||
|
regex = "1.9.1"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use chrono::NaiveTime;
|
use chrono::NaiveTime;
|
||||||
use i3monkit::{ColorRGB, Header, I3Protocol, WidgetCollection};
|
use i3monkit::{widgets::VolumeWidget, ColorRGB, Header, I3Protocol, WidgetCollection};
|
||||||
use i3xs::widgets::{
|
use i3xs::widgets::{
|
||||||
cpu::CpuWidget,
|
cpu::CpuWidget,
|
||||||
datetime::{DateTimeWidget, TimeColor},
|
datetime::{DateTimeWidget, TimeColor},
|
||||||
@@ -27,6 +27,8 @@ fn main() {
|
|||||||
// Realtime read/write rate for a any active disks
|
// Realtime read/write rate for a any active disks
|
||||||
bar.push(AllDiskSpeedWidget::new(6));
|
bar.push(AllDiskSpeedWidget::new(6));
|
||||||
|
|
||||||
|
bar.push(VolumeWidget::new("default", "Master", 0));
|
||||||
|
|
||||||
let mut dt = DateTimeWidget::new("%m/%d %H:%M");
|
let mut dt = DateTimeWidget::new("%m/%d %H:%M");
|
||||||
dt.set_colors(vec![
|
dt.set_colors(vec![
|
||||||
TimeColor {
|
TimeColor {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
use chrono::NaiveTime;
|
use chrono::NaiveTime;
|
||||||
use i3monkit::{ColorRGB, Header, I3Protocol, WidgetCollection};
|
use i3monkit::{widgets::VolumeWidget, ColorRGB, Header, I3Protocol, WidgetCollection};
|
||||||
use i3xs::widgets::{
|
use i3xs::widgets::{
|
||||||
cpu::CpuWidget,
|
cpu::CpuWidget,
|
||||||
datetime::{DateTimeWidget, TimeColor},
|
datetime::{DateTimeWidget, TimeColor},
|
||||||
|
disk::AllDiskSpeedWidget,
|
||||||
network::AllNetworkSpeedWidget,
|
network::AllNetworkSpeedWidget,
|
||||||
power::PowerSupply,
|
power::PowerSupply,
|
||||||
};
|
};
|
||||||
@@ -26,7 +27,8 @@ fn main() {
|
|||||||
// Realtime read/write rate for a any active disks
|
// Realtime read/write rate for a any active disks
|
||||||
bar.push(AllDiskSpeedWidget::new(6));
|
bar.push(AllDiskSpeedWidget::new(6));
|
||||||
|
|
||||||
let mut dt = DateTimeWidget::tz("%H:%M %Z", chrono_tz::Europe::London);
|
// Setup time in Amsterdam widget with end of day warnings
|
||||||
|
let mut dt = DateTimeWidget::tz("%H:%M %Z", chrono_tz::Europe::Amsterdam);
|
||||||
dt.set_colors(vec![
|
dt.set_colors(vec![
|
||||||
TimeColor {
|
TimeColor {
|
||||||
start: NaiveTime::from_hms_opt(0, 0, 0).unwrap(),
|
start: NaiveTime::from_hms_opt(0, 0, 0).unwrap(),
|
||||||
@@ -47,6 +49,8 @@ fn main() {
|
|||||||
]);
|
]);
|
||||||
bar.push(dt);
|
bar.push(dt);
|
||||||
|
|
||||||
|
bar.push(VolumeWidget::new("default", "Master", 0));
|
||||||
|
|
||||||
let mut dt = DateTimeWidget::new("%m/%d %H:%M");
|
let mut dt = DateTimeWidget::new("%m/%d %H:%M");
|
||||||
dt.set_colors(vec![
|
dt.set_colors(vec![
|
||||||
TimeColor {
|
TimeColor {
|
||||||
@@ -67,6 +71,8 @@ fn main() {
|
|||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
bar.push(dt);
|
bar.push(dt);
|
||||||
|
let dt_utc = DateTimeWidget::tz("UTC %H:%M", chrono::offset::Utc);
|
||||||
|
bar.push(dt_utc);
|
||||||
|
|
||||||
// Then start updating the status bar
|
// Then start updating the status bar
|
||||||
bar.update_loop(I3Protocol::new(Header::new(1), std::io::stdout()));
|
bar.update_loop(I3Protocol::new(Header::new(1), std::io::stdout()));
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
use std::{
|
use std::{collections::vec_deque::VecDeque, io::Result, time::SystemTime};
|
||||||
collections::vec_deque::VecDeque,
|
|
||||||
fs::File,
|
|
||||||
io::{BufRead, BufReader, Error, ErrorKind, Result},
|
|
||||||
path::PathBuf,
|
|
||||||
time::SystemTime,
|
|
||||||
};
|
|
||||||
|
|
||||||
use i3monkit::{Block, Widget, WidgetUpdate};
|
use i3monkit::{Block, Widget, WidgetUpdate};
|
||||||
|
|
||||||
@@ -158,7 +152,6 @@ impl Widget for DiskSpeedWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct AllDiskSpeedWidget {
|
pub struct AllDiskSpeedWidget {
|
||||||
num_samples: usize,
|
|
||||||
disks: Vec<DiskSpeedWidget>,
|
disks: Vec<DiskSpeedWidget>,
|
||||||
}
|
}
|
||||||
impl AllDiskSpeedWidget {
|
impl AllDiskSpeedWidget {
|
||||||
@@ -171,7 +164,7 @@ impl AllDiskSpeedWidget {
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
AllDiskSpeedWidget { num_samples, disks }
|
AllDiskSpeedWidget { disks }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ use std::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use i3monkit::{Block, Widget, WidgetUpdate};
|
use i3monkit::{Block, Widget, WidgetUpdate};
|
||||||
|
use regex::Regex;
|
||||||
|
|
||||||
use crate::spark;
|
use crate::spark;
|
||||||
|
|
||||||
const NETWORK_PATH_PREFIX: &str = "/sys/class/net";
|
const NETWORK_PATH_PREFIX: &str = "/sys/class/net";
|
||||||
const NETWORK_STAT_SUFFIX: &str = "statistics/dummy";
|
const NETWORK_STAT_SUFFIX: &str = "statistics/dummy";
|
||||||
const DEVICE_PREFIX: &str = "enp";
|
|
||||||
|
|
||||||
struct TransferStat {
|
struct TransferStat {
|
||||||
rx: u64,
|
rx: u64,
|
||||||
@@ -175,18 +175,18 @@ impl Widget for NetworkSpeedWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct AllNetworkSpeedWidget {
|
pub struct AllNetworkSpeedWidget {
|
||||||
num_samples: usize,
|
|
||||||
nics: Vec<NetworkSpeedWidget>,
|
nics: Vec<NetworkSpeedWidget>,
|
||||||
}
|
}
|
||||||
impl AllNetworkSpeedWidget {
|
impl AllNetworkSpeedWidget {
|
||||||
pub fn new(num_samples: usize) -> Self {
|
pub fn new(num_samples: usize) -> Self {
|
||||||
|
let dev_pat = Regex::new("(enp|eno).*").expect("bad re");
|
||||||
let nics = std::fs::read_dir(NETWORK_PATH_PREFIX)
|
let nics = std::fs::read_dir(NETWORK_PATH_PREFIX)
|
||||||
.expect(&format!("couldn't list {NETWORK_PATH_PREFIX}"))
|
.expect(&format!("couldn't list {NETWORK_PATH_PREFIX}"))
|
||||||
.filter_map(|dir| {
|
.filter_map(|dir| {
|
||||||
let d = dir.unwrap();
|
let d = dir.unwrap();
|
||||||
let p = d.file_name();
|
let p = d.file_name();
|
||||||
let p = p.to_string_lossy();
|
let p = p.to_string_lossy();
|
||||||
if p.starts_with(DEVICE_PREFIX) {
|
if dev_pat.is_match(&p) {
|
||||||
Some(NetworkSpeedWidget::new(&p, num_samples))
|
Some(NetworkSpeedWidget::new(&p, num_samples))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@@ -194,7 +194,7 @@ impl AllNetworkSpeedWidget {
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
AllNetworkSpeedWidget { num_samples, nics }
|
AllNetworkSpeedWidget { nics }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,14 @@ impl PowerSupply {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect::<Result<_, _>>()?;
|
.collect::<Result<_, _>>()?;
|
||||||
|
// Skip things that aren't battery powered
|
||||||
|
if !values
|
||||||
|
.get("POWER_SUPPLY_TYPE")
|
||||||
|
.map(|t| t == &"Battery")
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let cap: u32 = values
|
let cap: u32 = values
|
||||||
.get("POWER_SUPPLY_CAPACITY")
|
.get("POWER_SUPPLY_CAPACITY")
|
||||||
.unwrap_or(&"0")
|
.unwrap_or(&"0")
|
||||||
|
|||||||
Reference in New Issue
Block a user