diff --git a/src/roftl.rs b/src/roftl.rs index 666f671..c89d865 100644 --- a/src/roftl.rs +++ b/src/roftl.rs @@ -35,7 +35,7 @@ pub struct Roftl { sources: Vec, matcher: MatcherRef, entries: Vec, - narrow_map: Mutex> + narrow_map: Vec } impl Roftl { @@ -44,7 +44,7 @@ impl Roftl { sources: vec![], matcher: PrefixMatcher::new(), entries: vec![], - narrow_map: Mutex::default() + narrow_map: vec![] } } @@ -72,14 +72,13 @@ impl Roftl { debug!("Entries {:?}", self.entries); } - pub fn narrow(&self, input: &str) -> Vec<(&Entry, Vec)> { - let count = Arc::new(AtomicUsize::new(0)); - self.narrow_map.lock().unwrap().clear(); - + pub fn narrow(&mut self, input: &str) -> Vec<(&Entry, Vec)> { let mut scored_entries: Vec<(f64, usize, &Entry, Vec)> = self.entries .par_iter() .enumerate() .filter_map(|(idx, entry)| { + if input.is_empty() { return Some((0.0, idx, entry, vec![])) } + let match_result = self.matcher.try_match(&entry.name, input); return match_result.map(|(score, indices)| (score, idx, entry, indices) ) }) @@ -88,11 +87,10 @@ impl Roftl { scored_entries .par_sort_by(|e1, e2| e1.0.partial_cmp(&e2.0).unwrap()); - scored_entries - .par_iter() - .for_each(|se| { - self.narrow_map.lock().unwrap().insert(count.fetch_add(1, Ordering::Relaxed), se.1); - }); + self.narrow_map.clear(); + for se in &scored_entries { + self.narrow_map.push(se.1) + } scored_entries .par_iter() @@ -100,11 +98,10 @@ impl Roftl { .collect() } - pub fn action(&self, entry_id: usize, action: Action) { - debug!{"NarrowMap {:?}", self.narrow_map.lock().unwrap()}; - - let real_id = *self.narrow_map.lock().unwrap().get(&entry_id).unwrap(); - let entry = self.entries.get(real_id).unwrap(); + pub fn action(&self, selection_id: usize, action: Action) { + let entry_id = self.narrow_map[selection_id]; + let entry = &self.entries[entry_id]; + debug!{"Got entry {:?} for id {} ", entry, entry_id}; let source = self .sources @@ -112,6 +109,6 @@ impl Roftl { .find(|&s| s.name().eq(entry.source)) .unwrap(); - source.action(entry, action); + source.action(&entry, action); } } diff --git a/src/sources/apps.rs b/src/sources/apps.rs index 1cd7b2d..d613836 100644 --- a/src/sources/apps.rs +++ b/src/sources/apps.rs @@ -1,7 +1,7 @@ use std::{os::unix::prelude::CommandExt, process::{Command, Stdio}}; use freedesktop_entry_parser as parser; -use log::{debug, error}; +use log::{debug, error, trace}; use walkdir::WalkDir; use nix::unistd::{getpid, setpgid}; @@ -14,18 +14,6 @@ struct App { terminal: bool } -fn with_term<'a>(term_cmd: &'a Option, exec: &'a str,) { - if let Some(term) = term_cmd { - let mut args: Vec<&str> = - term.split(' ').chain(exec.split(' ')).collect(); - let term = args.remove(0).to_owned(); - } else { - let term = std::env::var("TERM").unwrap(); - let mut args: Vec<&str> = exec.split(' ').collect(); - args.insert(0, "-e"); - } -} - pub fn parse_command_string<'a>(exec: &'a str) -> (String, Vec) { let mut iter = exec.split(' '); let cmd = iter.next().expect("Empty Exec").to_owned(); @@ -38,7 +26,7 @@ pub fn run_bg(mut command: Command) { unsafe { command.pre_exec(|| { let pid = getpid(); - if let Err(e) = setpgid(pid, pid) { + if let Err(_) = setpgid(pid, pid) { error!{"Failed to set pgid of child process with pid {}", pid}; } Ok(()) @@ -122,13 +110,13 @@ impl Apps { } fn strip_entry_args(exec: &str) -> String { - debug!{"Stripping {}", exec} + trace!{"Stripping {}", exec} let iter = exec.split(' '); let result = iter.filter(|item| !item.starts_with('%')) .collect::>() .join(" "); - debug!{"Stripped into {}", result} + trace!{"Stripped into {}", result} result } @@ -183,7 +171,7 @@ impl Source for Apps { } - debug!{"Got desktop entries: {:?}", entries} + trace!{"Got desktop entries: {:?}", entries} entries } @@ -191,7 +179,7 @@ impl Source for Apps { fn action(&self, entry: &Entry, action: Action) { debug!{"Got desktop entry {:?} for action", entry} debug!{"Desktop entry has id {}", entry.identifier} - debug!{"Apps has entries {:?}", self.entries} + trace!{"Apps has entries {:?}", self.entries} let app = self.entries.get(entry.identifier as usize).unwrap(); debug!{"Doing primary action {} for {}", app.name, app.command} app.run();