diff --git a/README.md b/README.md
index b4f6748..99b6161 100644
--- a/README.md
+++ b/README.md
@@ -12,9 +12,9 @@ It supports various modes:
* DRun
* File
* Ssh
+* Run
* // WebSearch
* // Emoji
-* // Run
* Auto
Auto mode tries to detect the desired mode automatically, i.e. `ssh`, `?` (for web search), `emoji`, `/` or `~` (for file).
@@ -22,7 +22,6 @@ Auto mode tries to detect the desired mode automatically, i.e. `ssh`, `?` (for w
## Not finished
-* [ ] run
* [ ] key support
* [ ] full config support
* [ ] web search mode
diff --git a/src/lib/desktop.rs b/src/lib/desktop.rs
index c86f87b..9a2d538 100644
--- a/src/lib/desktop.rs
+++ b/src/lib/desktop.rs
@@ -4,13 +4,13 @@ use freedesktop_file_parser::DesktopFile;
use rayon::prelude::*;
use regex::Regex;
use std::collections::HashMap;
+use std::os::unix::fs::PermissionsExt;
use std::os::unix::prelude::CommandExt;
use std::path::Path;
use std::path::PathBuf;
use std::process::{Command, Stdio};
use std::time::Instant;
use std::{env, fs, io};
-use std::os::unix::fs::PermissionsExt;
/// Returns a regex with supported image extensions
/// # Panics
@@ -281,9 +281,9 @@ pub fn create_file_if_not_exists(path: &PathBuf) -> Result<(), Error> {
}
}
-
/// Check if the given dir entry is an executable
-pub fn is_executable(entry: &PathBuf) -> bool {
+#[must_use]
+pub fn is_executable(entry: &Path) -> bool {
if let Ok(metadata) = entry.metadata() {
let permissions = metadata.permissions();
metadata.is_file() && (permissions.mode() & 0o111 != 0)
diff --git a/src/lib/gui.rs b/src/lib/gui.rs
index bc90e8b..e543ce3 100644
--- a/src/lib/gui.rs
+++ b/src/lib/gui.rs
@@ -1,5 +1,4 @@
use std::collections::HashMap;
-use std::ops::{Deref, DerefMut};
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use std::thread;
@@ -23,7 +22,7 @@ use gtk4::prelude::{
use gtk4::{
Align, EventControllerKey, Expander, FlowBox, FlowBoxChild, GestureClick, Image, Label,
ListBox, ListBoxRow, NaturalWrapMode, Ordering, PolicyType, ScrolledWindow, SearchEntry,
- Widget, gdk,
+ Widget, gdk, glib,
};
use gtk4::{Application, ApplicationWindow, CssProvider, Orientation};
use gtk4_layer_shell::{Edge, KeyboardMode, LayerShell};
@@ -217,7 +216,6 @@ fn build_ui(
});
let provider_clone = Arc::clone(&meta.item_provider);
-
let get_provider_elements = thread::spawn(move || {
log::debug!("getting items");
provider_clone.lock().unwrap().get_elements(None)
@@ -239,8 +237,6 @@ fn build_ui(
menu_rows: Arc::new(Mutex::new(HashMap::new())),
});
- let window_show = Instant::now();
-
// handle keys as soon as possible
setup_key_event_handler(&ui_elements, &meta);
@@ -260,8 +256,6 @@ fn build_ui(
ui_elements.window.set_namespace(Some("worf"));
}
- let window_done = Instant::now();
-
if let Some(location) = config.location() {
for anchor in location {
ui_elements.window.set_anchor(anchor.into(), true);
@@ -293,26 +287,14 @@ fn build_ui(
let wait_for_items = Instant::now();
let (_changed, provider_elements) = get_provider_elements.join().unwrap();
log::debug!("got items after {:?}", wait_for_items.elapsed());
- {
- let mut lock = ui_elements.menu_rows.lock().unwrap();
- build_ui_from_menu_items(&ui_elements, &meta, &provider_elements, lock.deref_mut());
- }
-
- let items_sort = ArcMenuMap::clone(&ui_elements.menu_rows);
- ui_elements
- .main_box
- .set_sort_func(move |child1, child2| sort_menu_items_by_score(child1, child2, &items_sort));
+ build_ui_from_menu_items(&ui_elements, &meta, provider_elements);
+ let window_start = Instant::now();
ui_elements.window.show();
- animate_window_show(config, ui_elements.window.clone());
+ log::debug!("window show took {:?}", window_start.elapsed());
- let animation_done = Instant::now();
- log::debug!(
- "Building UI took {:?}, window show {:?}, animation {:?}",
- start.elapsed(),
- window_done - window_show,
- animation_done - window_done
- );
+ animate_window_show(config, ui_elements.window.clone());
+ log::debug!("Building UI took {:?}", start.elapsed(),);
}
fn build_main_box(config: &Config, ui_elements: &Rc>) {
@@ -343,7 +325,7 @@ fn build_main_box(config: &Config, ui_elements: &Rc(config: &Config, ui_elements: &UiElements) {
fn build_ui_from_menu_items(
ui: &Rc>,
meta: &Rc>,
- items: &Vec