mirror of
https://github.com/house-of-vanity/tmux-helper.git
synced 2026-02-04 17:57:58 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
573cb35b52 | ||
|
|
b1015ada2f | ||
|
|
e7ac12974f | ||
|
|
6e08864d99 | ||
|
|
6a9a871006 | ||
|
|
bab994fc41 | ||
|
|
fc1c2f539d |
BIN
.github/prev.png
vendored
BIN
.github/prev.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 25 KiB |
2
.github/workflows/PKGBUILD
vendored
2
.github/workflows/PKGBUILD
vendored
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Alexandr Bogomyakov (ultradesu) <ab@hexor.ru>
|
||||
|
||||
pkgname=tmux-helper
|
||||
pkgver=0.2.1
|
||||
pkgver=0.3.3
|
||||
pkgrel=1
|
||||
pkgdesc="Tmux helper"
|
||||
url="https://github.com/house-of-vanity/tmux-helper.git"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tmux-helper"
|
||||
version = "0.3.0"
|
||||
version = "0.3.3"
|
||||
description = "Utility for printing system info for tmux status line."
|
||||
authors = ["Ultra Desu <ultradesu@hexor.ru>"]
|
||||
edition = "2018"
|
||||
@@ -11,3 +11,4 @@ dbus = "*"
|
||||
chrono = "*"
|
||||
mpd = "*"
|
||||
clap = "*"
|
||||
size_format = "1.0"
|
||||
|
||||
36
README.md
36
README.md
@@ -3,14 +3,36 @@ Small app that perform system check and print TMUX friendly output.
|
||||
|
||||

|
||||
|
||||
### Features:
|
||||
1. `tmux-helper -cb` print cpu load with bar.
|
||||
2. `tmux-helper -mb` print memory usage with bar.
|
||||
3. `tmux-helper -p` show current player status using d-bus.
|
||||
|
||||
### Building
|
||||
`cargo build --release`
|
||||
or get binary on release page
|
||||
|
||||
### Customization
|
||||
Colours are hardcoded but it's easy to change it. It defined as CONST in very beginning of main.rs file.
|
||||
### Fetures
|
||||
```shell
|
||||
tmux-helper 0.3.2
|
||||
Ultra Desu <ultradesu@hexor.ru>
|
||||
Utility for printing system info for tmux status line.
|
||||
|
||||
USAGE:
|
||||
tmux-helper [FLAGS] [OPTIONS]
|
||||
|
||||
FLAGS:
|
||||
-c, --cpu Print cpu load bar.
|
||||
-h, --help Prints help information
|
||||
-m, --mem Print mem usage bar.
|
||||
-d, --mpd Show mpd player using MPD native protocol.
|
||||
-p, --mpris Show player info using MPRIS2 interface.
|
||||
-V, --version Prints version information
|
||||
|
||||
OPTIONS:
|
||||
--COLOR_END <COLOR_END> Default color using to terminate others.
|
||||
--COLOR_HIGH <COLOR_HIGH> CPU and MEM bar color while high usage.
|
||||
--COLOR_LOW <COLOR_LOW> CPU and MEM bar color while low usage.
|
||||
--COLOR_MID <COLOR_MID> CPU and MEM bar color while mid usage.
|
||||
--COLOR_TRACK_ARTIST <COLOR_TRACK_ARTIST> Color of artist name filed.
|
||||
--COLOR_TRACK_NAME <COLOR_TRACK_NAME> Color of track name filed.
|
||||
--COLOR_TRACK_TIME <COLOR_TRACK_TIME> Color of playing time field.
|
||||
-l, --localtime <localtime> Local time
|
||||
-a, --mpd-address <mpd_address> <ADDR>:<PORT> of MPD server.
|
||||
-u, --utctime <utctime> UTC time
|
||||
```
|
||||
|
||||
@@ -55,11 +55,11 @@ pub fn read() -> Config {
|
||||
.short("m")
|
||||
.long("mem")
|
||||
.help("Print mem usage bar.")
|
||||
// .conflicts_with("cpu")
|
||||
// .conflicts_with("mpris")
|
||||
// .conflicts_with("mpd")
|
||||
// .conflicts_with("localtime")
|
||||
// .conflicts_with("utctime")
|
||||
// .conflicts_with("cpu")
|
||||
// .conflicts_with("mpris")
|
||||
// .conflicts_with("mpd")
|
||||
// .conflicts_with("localtime")
|
||||
// .conflicts_with("utctime")
|
||||
.required(false),
|
||||
)
|
||||
.arg(
|
||||
@@ -67,11 +67,11 @@ pub fn read() -> Config {
|
||||
.short("p")
|
||||
.long("mpris")
|
||||
.help("Show player info using MPRIS2 interface.")
|
||||
// .conflicts_with("cpu")
|
||||
// .conflicts_with("mem")
|
||||
// .conflicts_with("localtime")
|
||||
// .conflicts_with("mpd")
|
||||
// .conflicts_with("utctime")
|
||||
// .conflicts_with("cpu")
|
||||
// .conflicts_with("mem")
|
||||
// .conflicts_with("localtime")
|
||||
// .conflicts_with("mpd")
|
||||
// .conflicts_with("utctime")
|
||||
.required(false),
|
||||
)
|
||||
.arg(
|
||||
@@ -79,11 +79,11 @@ pub fn read() -> Config {
|
||||
.short("d")
|
||||
.long("mpd")
|
||||
.help("Show mpd player using MPD native protocol.")
|
||||
// .conflicts_with("cpu")
|
||||
// .conflicts_with("mem")
|
||||
// .conflicts_with("localtime")
|
||||
// .conflicts_with("mpris")
|
||||
// .conflicts_with("utctime")
|
||||
// .conflicts_with("cpu")
|
||||
// .conflicts_with("mem")
|
||||
// .conflicts_with("localtime")
|
||||
// .conflicts_with("mpris")
|
||||
// .conflicts_with("utctime")
|
||||
.required(false),
|
||||
)
|
||||
// Options
|
||||
@@ -92,7 +92,7 @@ pub fn read() -> Config {
|
||||
.short("l")
|
||||
.long("localtime")
|
||||
.help("Local time")
|
||||
// .conflicts_with_all(&["mem", "mpris", "mpd", "cpu", "utctime"])
|
||||
// .conflicts_with_all(&["mem", "mpris", "mpd", "cpu", "utctime"])
|
||||
.takes_value(true)
|
||||
.required(false),
|
||||
)
|
||||
@@ -101,7 +101,7 @@ pub fn read() -> Config {
|
||||
.short("u")
|
||||
.long("utctime")
|
||||
.help("UTC time")
|
||||
// .conflicts_with_all(&["mem", "mpris", "mpd", "cpu", "localtime"])
|
||||
// .conflicts_with_all(&["mem", "mpris", "mpd", "cpu", "localtime"])
|
||||
.takes_value(true)
|
||||
.required(false),
|
||||
)
|
||||
|
||||
96
src/utils.rs
96
src/utils.rs
@@ -2,10 +2,11 @@ use crate::config;
|
||||
use crate::dbus::blocking::stdintf::org_freedesktop_dbus::Properties;
|
||||
use chrono::{DateTime, Local, Utc};
|
||||
use dbus::{arg, blocking::Connection};
|
||||
use mpd::Client;
|
||||
use size_format::SizeFormatterBinary;
|
||||
use std::process;
|
||||
use std::time::Duration;
|
||||
use sys_info;
|
||||
use mpd::Client;
|
||||
use std::process;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct TrackInfo {
|
||||
@@ -47,7 +48,10 @@ pub fn mem_load_bar(bar_len: i32, config: &config::Config) {
|
||||
let len =
|
||||
((memory.total - memory.avail) as f32 / (memory.total as f32) * bar_len as f32) as i32;
|
||||
to_bar(len, bar_len, 0.7, 0.9, config);
|
||||
print!("{:.0} MiB#[default]", memory.avail / 1024);
|
||||
print!(
|
||||
"{}B #[default]",
|
||||
SizeFormatterBinary::new((memory.avail * 1000) as u64)
|
||||
);
|
||||
}
|
||||
|
||||
pub fn cpu_load_bar(bar_len: i32, config: &config::Config) {
|
||||
@@ -164,46 +168,38 @@ pub fn get_time(utc: bool, format: Option<String>) {
|
||||
}
|
||||
}
|
||||
|
||||
fn shorten(line: String, max_len: usize, max_shift: usize) -> String {
|
||||
let mut new_line = String::new();
|
||||
let len = if max_len + max_shift >= line.chars().count() {
|
||||
line.chars().count()
|
||||
} else {
|
||||
max_len
|
||||
};
|
||||
if line.len() > len {
|
||||
let mut counter = 0;
|
||||
for ch in line.chars() {
|
||||
if counter == len {
|
||||
new_line.push_str("..");
|
||||
break;
|
||||
}
|
||||
new_line.push(ch);
|
||||
counter += 1;
|
||||
}
|
||||
} else {
|
||||
new_line = line;
|
||||
}
|
||||
new_line
|
||||
}
|
||||
|
||||
fn format_player(track_info: TrackInfo, config: &config::Config) {
|
||||
let mut title_len = 30;
|
||||
let mut artist_len = 30;
|
||||
let mut artist_line: String = String::new();
|
||||
let mut title_line: String = String::new();
|
||||
let mut separator: String = " — ".to_string();
|
||||
let max_shift = 6;
|
||||
let mut max_len = 30;
|
||||
if track_info.artist.chars().count() == 0 {
|
||||
separator = "".to_string();
|
||||
title_len += artist_len;
|
||||
}
|
||||
if artist_len + max_shift >= track_info.artist.chars().count() {
|
||||
artist_len = track_info.artist.chars().count()
|
||||
}
|
||||
if track_info.artist.len() > artist_len {
|
||||
let mut counter = 0;
|
||||
for ch in track_info.artist.chars() {
|
||||
if counter == artist_len {
|
||||
artist_line.push_str("..");
|
||||
break;
|
||||
}
|
||||
artist_line.push(ch);
|
||||
counter += 1;
|
||||
}
|
||||
|
||||
}
|
||||
if title_len + max_shift >= track_info.title.chars().count() {
|
||||
title_len = track_info.title.chars().count()
|
||||
}
|
||||
if track_info.title.len() > title_len {
|
||||
let mut counter = 0;
|
||||
for ch in track_info.title.chars() {
|
||||
if counter == title_len {
|
||||
title_line.push_str("..");
|
||||
break;
|
||||
}
|
||||
title_line.push(ch);
|
||||
counter += 1;
|
||||
}
|
||||
max_len = max_len * 2;
|
||||
}
|
||||
let artist_line = shorten(track_info.artist, max_len, 6);
|
||||
let title_line = shorten(track_info.title, max_len, 6);
|
||||
println!(
|
||||
"#[none]#[bold]{}{}{}#[none]{}{}{}{} {}[{}/{}] {} {}#[default]",
|
||||
config.color_track_name,
|
||||
@@ -231,7 +227,10 @@ pub fn mpris(config: &config::Config) {
|
||||
pub fn mpd(config: &config::Config) {
|
||||
let mut conn = match Client::connect(&config.mpd_server) {
|
||||
Ok(conn) => conn,
|
||||
Err(e) => {println!("Can't connect to MPD server. {}", e); process::exit(0x0001)}
|
||||
Err(e) => {
|
||||
println!("Can't connect to MPD server. {}", e);
|
||||
process::exit(0x0001)
|
||||
}
|
||||
};
|
||||
let mut track_info = TrackInfo {
|
||||
title: String::new(),
|
||||
@@ -240,6 +239,7 @@ pub fn mpd(config: &config::Config) {
|
||||
duration: String::new(),
|
||||
status: String::new(),
|
||||
};
|
||||
// println!("{:?}", conn.currentsong());
|
||||
if let Some(song) = conn.currentsong().unwrap() {
|
||||
if let Some(title) = song.title {
|
||||
track_info.title = title
|
||||
@@ -247,20 +247,24 @@ pub fn mpd(config: &config::Config) {
|
||||
if let Some(artist) = song.tags.get("Artist") {
|
||||
track_info.artist = artist.to_string()
|
||||
}
|
||||
// if there is no tags and title.
|
||||
if track_info.artist == track_info.title {
|
||||
if let Some(name) = song.name {
|
||||
track_info.title = name
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(time) = conn.status().unwrap().time {
|
||||
track_info.position = time.0.num_seconds().to_string();
|
||||
track_info.duration = time.1.num_seconds().to_string()
|
||||
track_info.position = format_time(time.0.num_seconds() as i64);
|
||||
track_info.duration = format_time(time.1.num_seconds() as i64);
|
||||
}
|
||||
let status = match conn.status() {
|
||||
Ok(status) => {
|
||||
match status.state {
|
||||
Ok(status) => match status.state {
|
||||
mpd::State::Play => "▶".to_string(),
|
||||
mpd::State::Pause => "⏸".to_string(),
|
||||
mpd::State::Stop => "⏹".to_string(),
|
||||
}
|
||||
}
|
||||
Err(_) => {"⏹".to_string()},
|
||||
},
|
||||
Err(_) => "⏹".to_string(),
|
||||
};
|
||||
track_info.status = status;
|
||||
format_player(track_info, config)
|
||||
|
||||
Reference in New Issue
Block a user