You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.4 KiB

use crate::window;
use std::io::Write;
use std::process as proc;
pub fn is_debug() -> bool {
true
}
pub fn get_swayr_socket_path() -> String {
let wayland_display = std::env::var("WAYLAND_DISPLAY");
format!(
"/run/user/{}/swayr-{}.sock",
users::get_current_uid(),
match wayland_display {
Ok(val) => val,
Err(_e) => {
eprintln!("Couldn't get WAYLAND_DISPLAY!");
String::from("unknown")
}
}
)
}
pub fn swaymsg(args: Vec<&str>) -> String {
let mut cmd = proc::Command::new("swaymsg");
for a in args {
cmd.arg(a);
}
let output = cmd.output().expect("Error running swaymsg!");
String::from_utf8(output.stdout).unwrap()
}
pub fn select_window<'a>(windows: &'a Vec<window::Window>) -> Option<&'a window::Window<'a>> {
wofi_select("Select window", windows)
}
pub fn wofi_select<'a, 'b, TS>(prompt: &'a str, choices: &'b Vec<TS>) -> Option<&'b TS>
where
TS: std::fmt::Display + Sized,
{
let mut map: std::collections::HashMap<String, &TS> = std::collections::HashMap::new();
let mut strs: Vec<String> = vec![];
for c in choices {
let s = format!("{}", c);
strs.push(String::from(s.as_str()));
map.insert(s, c);
}
let mut wofi = proc::Command::new("wofi")
.arg("--show=dmenu")
.arg("--allow-markup")
.arg("--allow-images")
.arg("--insensitive")
.arg("--cache-file=/dev/null")
.arg("--prompt")
.arg(prompt)
.stdin(proc::Stdio::piped())
.stdout(proc::Stdio::piped())
.spawn()
.expect("Error running wofi!");
{
let stdin = wofi.stdin.as_mut().expect("Failed to open wofi stdin");
let wofi_input = strs.join("\n");
println!("Wofi input:\n{}", wofi_input);
stdin
.write_all(wofi_input.as_bytes())
.expect("Failed to write to wofi stdin");
}
let output = wofi.wait_with_output().expect("Failed to read stdout");
let choice = String::from_utf8_lossy(&output.stdout);
let mut choice = String::from(choice);
choice.pop(); // Remove trailing \n from choice.
map.get(&choice).copied()
}
#[test]
#[ignore = "interactive test requiring user input"]
fn test_wofi_select() {
let choices = vec!["a", "b", "c"];
let choice = wofi_select("Choose wisely", &choices);
assert!(choice.is_some());
assert!(choices.contains(choice.unwrap()));
}