fix dmenu empty selection

This commit is contained in:
Alexander Mohr 2025-05-05 20:06:32 +02:00
parent 2114403ae9
commit c040a28539
3 changed files with 69 additions and 37 deletions

View file

@ -1,15 +1,15 @@
use enigo::{Enigo, Keyboard};
use std::process::Command;
use std::thread::sleep;
use std::time::Duration;
use enigo::{Enigo, Keyboard};
use worf_lib::{config, gui, Error};
use worf_lib::config::Config;
use worf_lib::gui::{KeyBinding, ItemProvider, MenuItem, Modifier, Key};
use worf_lib::gui::{ItemProvider, Key, KeyBinding, MenuItem, Modifier};
use worf_lib::{Error, config, gui};
#[derive(Clone)]
struct PasswordProvider {
items: Vec<MenuItem<String>>
items: Vec<MenuItem<String>>,
}
impl PasswordProvider {
@ -22,14 +22,23 @@ impl PasswordProvider {
let stdout = String::from_utf8_lossy(&output.stdout);
// todo the own solution should support images.
let mut items: Vec<_>= stdout.lines().map(|line|
MenuItem::new(line.to_owned(), None, None, vec![], None, 0.0, Some(String::new()))
).collect();
let mut items: Vec<_> = stdout
.lines()
.map(|line| {
MenuItem::new(
line.to_owned(),
None,
None,
vec![],
None,
0.0,
Some(String::new()),
)
})
.collect();
gui::apply_sort(&mut items, &config.sort_order());
Self {
items
}
Self { items }
}
}
@ -52,7 +61,9 @@ fn rbw_get(name: &str, field: &str) -> String {
.output()
.expect("Failed to execute command");
String::from_utf8_lossy(&output.stdout).trim_end().to_string()
String::from_utf8_lossy(&output.stdout)
.trim_end()
.to_string()
}
fn rbw_get_user(name: &str) -> String {
@ -124,7 +135,23 @@ fn main() -> anyhow::Result<()> {
label: "<b>Alt+l</b> Sync".to_string(),
};
match gui::show(config, provider, false, None, Some(vec![type_all.clone(), type_user, type_totp, reload, urls, names, folders, totp, lock])) {
match gui::show(
config,
provider,
false,
None,
Some(vec![
type_all.clone(),
type_user,
type_totp,
reload,
urls,
names,
folders,
totp,
lock,
]),
) {
Ok(selection) => {
let mut enigo = Enigo::new(&enigo::Settings::default())?;
let id = selection.menu.label.replace("\n", "");
@ -138,9 +165,7 @@ fn main() -> anyhow::Result<()> {
}
}
}
Err(e) => {
return Err(anyhow::anyhow!(e))
}
Err(e) => return Err(anyhow::anyhow!(e)),
}
Ok(())
}

View file

@ -793,7 +793,7 @@ fn handle_key_press<T: Clone + 'static + Send>(
Some(&search_lock),
None,
meta.new_on_empty,
Some(&custom_key),
Some(custom_key),
) {
log::error!("{e}");
}
@ -953,16 +953,18 @@ where
T: Clone + Send,
{
if let Some(selected_item) = item {
send_selected_item(&ui, meta, custom_key, &selected_item);
send_selected_item(ui, meta, custom_key, &selected_item);
return Ok(());
} else if let Some(s) = ui.main_box.selected_children().into_iter().next() {
let list_items = ui.menu_rows.lock().unwrap();
let item = list_items.get(&s);
if let Some(selected_item) = item {
send_selected_item(&ui, meta, custom_key, selected_item);
if selected_item.visible {
send_selected_item(ui, meta, custom_key, selected_item);
return Ok(());
}
}
}
if new_on_empty {
let item = MenuItem {
@ -984,9 +986,13 @@ where
}
}
fn send_selected_item<T>(ui: &&UiElements<T>, meta: &MetaData<T>, custom_key: Option<&KeyBinding>, selected_item: &MenuItem<T>)
where
T: Clone + Send
fn send_selected_item<T>(
ui: &UiElements<T>,
meta: &MetaData<T>,
custom_key: Option<&KeyBinding>,
selected_item: &MenuItem<T>,
) where
T: Clone + Send,
{
close_gui(&ui.app);
if let Err(e) = meta.selected_sender.send(Ok(Selection {

View file

@ -38,6 +38,7 @@ fn main() -> anyhow::Result<()> {
Ok(())
} else {
Err(anyhow!("No mode provided"))
log::error!("No mode provided");
Ok(())
}
}