From bc6d1de673a974e742caa39b3873af91a03b0c55 Mon Sep 17 00:00:00 2001 From: Alexander Mohr Date: Fri, 2 May 2025 02:22:21 +0200 Subject: [PATCH] run via execpve --- Cargo.lock | 19 +++++++++++++++++++ Cargo.toml | 1 + src/lib/gui.rs | 2 +- src/lib/mode.rs | 10 ++++++++-- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ca2cbc..250064d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,6 +135,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "clap" version = "3.2.25" @@ -891,6 +897,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "nix" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537bc3c4a347b87fd52ac6c03a02ab1302962cfd93373c5d7a112cdc337854cc" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nom" version = "1.2.4" @@ -1480,6 +1498,7 @@ dependencies = [ "libc", "log", "meval", + "nix", "rayon", "regex", "serde", diff --git a/Cargo.toml b/Cargo.toml index 30c5517..70dec6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,3 +46,4 @@ which = "7.0.3" meval = "0.2.0" tree_magic_mini = "3.1.6" rayon = "1.10.0" +nix = { version = "0.30.0", features = ["process"] } diff --git a/src/lib/gui.rs b/src/lib/gui.rs index 12d598e..bc90e8b 100644 --- a/src/lib/gui.rs +++ b/src/lib/gui.rs @@ -960,7 +960,7 @@ fn percent_or_absolute(value: &str, base_value: i32) -> Option { pub fn sort_menu_items_alphabetically_honor_initial_score(items: &mut [MenuItem]) { let special_score = items.len() as f64; let mut regular_score = 0.0; - items.sort_by(|l, r| l.label.cmp(&r.label)); + items.sort_by(|l, r| r.label.cmp(&l.label)); for item in items.iter_mut() { if item.initial_sort_score == 0.0 { diff --git a/src/lib/mode.rs b/src/lib/mode.rs index 0a10c0a..b504aa7 100644 --- a/src/lib/mode.rs +++ b/src/lib/mode.rs @@ -11,6 +11,7 @@ use std::io::Read; use std::path::{Path, PathBuf}; use std::time::Instant; use std::{env, fs, io}; +use std::ffi::CString; #[derive(Debug, Deserialize, Serialize, Clone)] struct DRunCache { @@ -532,7 +533,7 @@ impl ItemProvider for DMenuProvider { (false, self.items.clone()) } - fn get_sub_elements(&mut self, _: &MenuItem) -> (bool, std::option::Option>>) { + fn get_sub_elements(&mut self, _: &MenuItem) -> (bool, Option>>) { (false, None) } } @@ -822,7 +823,12 @@ fn update_run_cache_and_run( } if let Some(action) = selection_result.action { - spawn_fork(&action, selection_result.working_dir.as_ref()) + let program = CString::new(action).unwrap(); + let args = [program.clone()]; + + // This replaces the current process image + nix::unistd::execvp(&program, &args).map_err(|e| Error::RunFailed(e.to_string()))?; + Ok(()) } else { Err(Error::MissingAction) }