use crate::ported::bindings::wm::{get_connected_xrandr_outputs, XrandrOutput};
use crate::ported::commands::lemonbar::get_argparser;
pub struct LemonbarInstance {
pub screen_name: String,
pub width: i64,
}
pub fn build_bar_command(
bar_command: &str,
screen: &XrandrOutput,
height: &str,
extra: &[String],
) -> Vec<String> {
let mut cmd = vec![
bar_command.to_string(),
"-g".to_string(),
format!("{}x{}+{}+{}", screen.width, height, screen.x, screen.y),
];
cmd.extend_from_slice(extra);
cmd
}
pub fn render<F>(
bars: &[(String, i64)], mode: &str,
mut render_fn: F,
) -> Vec<(String, Vec<u8>)>
where
F: FnMut(&str, i64, &str) -> String,
{
let mut out: Vec<(String, Vec<u8>)> = Vec::with_capacity(bars.len());
for (output, width) in bars {
let rendered = render_fn(mode, *width, output);
let mut buf = rendered.into_bytes();
buf.push(b'\n');
out.push((output.clone(), buf));
}
out
}
pub fn update<F>(
modes_slot: &mut String,
new_mode: &str,
bars: &[(String, i64)],
render_fn: F,
) -> Vec<(String, Vec<u8>)>
where
F: FnMut(&str, i64, &str) -> String,
{
*modes_slot = new_mode.to_string();
render(bars, modes_slot, render_fn)
}
pub fn main() {
let parser = get_argparser();
let _ = parser;
let _outputs = get_connected_xrandr_outputs(&());
}
#[cfg(test)]
mod tests {
use super::*;
fn fake_screen() -> XrandrOutput {
XrandrOutput {
name: "HDMI-1".to_string(),
primary: true,
width: 1920,
height: 1080,
x: 0,
y: 0,
}
}
#[test]
fn build_bar_command_assembles_geometry() {
let s = fake_screen();
let cmd = build_bar_command("lemonbar", &s, "24", &[]);
assert_eq!(cmd, vec![
"lemonbar".to_string(),
"-g".to_string(),
"1920x24+0+0".to_string(),
]);
}
#[test]
fn build_bar_command_appends_extra_args() {
let s = fake_screen();
let extra = vec!["-B".to_string(), "#000000".to_string()];
let cmd = build_bar_command("lemonbar", &s, "30", &extra);
assert_eq!(cmd, vec![
"lemonbar".to_string(),
"-g".to_string(),
"1920x30+0+0".to_string(),
"-B".to_string(),
"#000000".to_string(),
]);
}
#[test]
fn render_emits_one_payload_per_bar_with_newline() {
let bars = vec![
("HDMI-1".to_string(), 100_i64),
("DP-1".to_string(), 200_i64),
];
let out = render(&bars, "default", |mode, width, matcher| {
format!("[{mode}:{width}:{matcher}]")
});
assert_eq!(out.len(), 2);
assert_eq!(out[0].0, "HDMI-1");
assert_eq!(out[0].1, b"[default:100:HDMI-1]\n");
assert_eq!(out[1].0, "DP-1");
assert_eq!(out[1].1, b"[default:200:DP-1]\n");
}
#[test]
fn update_sets_new_mode_and_renders() {
let mut mode = "default".to_string();
let bars = vec![("X".to_string(), 50_i64)];
let out = update(&mut mode, "resize", &bars, |m, w, mi| {
format!("m={m},w={w},mi={mi}")
});
assert_eq!(mode, "resize");
assert_eq!(out[0].1, b"m=resize,w=50,mi=X\n");
}
}