Started wofi selection

timeout_old
Tassilo Horn 4 years ago
parent d773db3b61
commit eccc0c5c3c
  1. 46
      src/util.rs

@ -1,3 +1,6 @@
use std::io::Write;
use std::process as proc;
pub fn is_debug() -> bool { pub fn is_debug() -> bool {
true true
} }
@ -5,3 +8,46 @@ pub fn is_debug() -> bool {
pub fn get_swayr_socket_path() -> String { pub fn get_swayr_socket_path() -> String {
format!("/run/user/{}/swayr-sock", users::get_current_uid()) format!("/run/user/{}/swayr-sock", users::get_current_uid())
} }
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();
for c in choices.iter() {
map.insert(format!("{}", c), c);
}
let mut wofi = proc::Command::new("wofi")
.arg("--show=dmenu")
.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");
for k in map.keys() {
stdin
.write_all(format!("{}\n", k).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);
// FIXME: Remove trailing \n from choice.
//println!("choice: {:?}", choice);
map.get(&*choice).copied()
}
#[test]
fn test_wofi_select() {
let choices = vec!["a", "b", "c"];
let choice = wofi_select("Choose wisely", &choices);
println!("choice: {:?}", choice);
assert!(choice.is_some());
assert!(choices.contains(choice.unwrap()));
}

Loading…
Cancel
Save