filter drun menu better and make some commands actually run

This commit is contained in:
Alexander Mohr 2025-04-19 19:52:01 +02:00
parent ddf95551fd
commit 437763f51f
5 changed files with 82 additions and 15 deletions

54
Cargo.lock generated
View file

@ -391,6 +391,12 @@ dependencies = [
"regex",
]
[[package]]
name = "env_home"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe"
[[package]]
name = "env_logger"
version = "0.11.8"
@ -410,6 +416,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
dependencies = [
"libc",
"windows-sys 0.59.0",
]
[[package]]
name = "field-offset"
version = "0.3.6"
@ -970,6 +986,12 @@ version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]]
name = "linux-raw-sys"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
[[package]]
name = "log"
version = "0.4.27"
@ -1259,6 +1281,19 @@ dependencies = [
"semver",
]
[[package]]
name = "rustix"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
dependencies = [
"bitflags 2.9.0",
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.59.0",
]
[[package]]
name = "ryu"
version = "1.0.20"
@ -1534,6 +1569,18 @@ version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "which"
version = "7.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d643ce3fd3e5b54854602a080f34fb10ab75e0b813ee32d00ca2b44fa74762"
dependencies = [
"either",
"env_home",
"rustix",
"winsafe",
]
[[package]]
name = "winapi"
version = "0.3.9"
@ -1656,6 +1703,12 @@ dependencies = [
"memchr",
]
[[package]]
name = "winsafe"
version = "0.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]]
name = "worf"
version = "0.1.0"
@ -1679,6 +1732,7 @@ dependencies = [
"strsim 0.11.1",
"thiserror",
"toml",
"which",
]
[[package]]

View file

@ -41,3 +41,4 @@ libc = "0.2.171"
freedesktop-file-parser = "0.1.3"
strsim = "0.11.1"
dirs = "6.0.0"
which = "7.0.3"

View file

@ -32,10 +32,12 @@ layerrule = blur, worf
because worf is build on GTK4 instead of GTK3 there will be differences in the look and feel.
* Configuration files are not 100% compatible, Worf is using toml files instead, for most part this only means strings have to be quoted
* Color files are not supported
* `mode` dropped, use show
* `D` argument dropped. Arguments are the same as config in worf, no need to have have this flag.
## Dropped configuration options
## Dropped arguments
* `mode`, use show
* `D`, arguments are the same as config in worf, no need to have have this flag.
### Dropped configuration options
* stylesheet -> use style instead
* color / colors -> GTK4 does not support color files

View file

@ -42,17 +42,30 @@ pub fn d_run(config: &Config) -> anyhow::Result<()> {
f.entry.hidden.is_none_or(|hidden| !hidden)
&& f.entry.no_display.is_none_or(|no_display| !no_display)
}) {
let (action, working_dir) = match &file.entry.entry_type {
EntryType::Application(app) => (app.exec.clone(), app.path.clone()),
_ => (None, None),
};
let Some(name) = lookup_name_with_locale(
&locale_variants,
&file.entry.name.variants,
&file.entry.name.default,
) else {
log::debug!("Skipping desktop entry without name {file:?}");
log::warn!("Skipping desktop entry without name {file:?}");
continue;
};
let (action, working_dir) = match &file.entry.entry_type {
EntryType::Application(app) => (app.exec.clone(), app.path.clone()),
_ => (None, None),
};
let cmd_exists = action.as_ref().map(|a| {
a.split(' ')
.next()
.map(|cmd| cmd.replace("\"", ""))
.map(|cmd| {
PathBuf::from(&cmd).exists() || which::which(&cmd).is_ok()
})}).flatten().unwrap_or(false);
if !cmd_exists {
log::warn!("Skipping desktop entry for {name:?} because action {action:?} does not exist");
continue;
};
@ -174,11 +187,8 @@ fn create_file_if_not_exists(path: &PathBuf) -> anyhow::Result<()> {
}
fn spawn_fork(cmd: &str, working_dir: Option<&String>) -> anyhow::Result<()> {
// todo probably remove arguments?
// todo support working dir
// todo fix actions
// todo fix actions ??
// todo graphical disk map icon not working
// Unix-like systems (Linux, macOS)
let parts = cmd.split(' ').collect::<Vec<_>>();
if parts.is_empty() {
@ -189,7 +199,7 @@ fn spawn_fork(cmd: &str, working_dir: Option<&String>) -> anyhow::Result<()> {
env::set_current_dir(dir)?;
}
let exec = parts[0];
let exec = parts[0].replace("\"", "");
let args: Vec<_> = parts
.iter()
.skip(1)

View file

@ -8,7 +8,7 @@ fn main() -> anyhow::Result<()> {
env_logger::Builder::new()
// todo change to error as default
.parse_filters(&env::var("RUST_LOG").unwrap_or_else(|_| "debug".to_owned()))
.parse_filters(&env::var("RUST_LOG").unwrap_or_else(|_| "error".to_owned()))
.init();
let args = config::parse_args();