App execution
This commit is contained in:
parent
48879aadd8
commit
42907b8982
3 changed files with 87 additions and 8 deletions
24
Cargo.lock
generated
24
Cargo.lock
generated
|
@ -110,7 +110,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "42dcfbd723aa6eff9f024cfd5ad08b11144d79b2d8d37b4a31a006ceab255c77"
|
checksum = "42dcfbd723aa6eff9f024cfd5ad08b11144d79b2d8d37b4a31a006ceab255c77"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"nix",
|
"nix 0.22.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -801,6 +801,19 @@ dependencies = [
|
||||||
"memoffset",
|
"memoffset",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.23.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f305c2c2e4c39a82f7bf0bf65fb557f9070ce06781d4f2454295cc34b1c43188"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"cc",
|
||||||
|
"cfg-if 1.0.0",
|
||||||
|
"libc",
|
||||||
|
"memoffset",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nom"
|
name = "nom"
|
||||||
version = "6.2.1"
|
version = "6.2.1"
|
||||||
|
@ -1077,6 +1090,7 @@ dependencies = [
|
||||||
"fuzzy-matcher",
|
"fuzzy-matcher",
|
||||||
"log",
|
"log",
|
||||||
"mlua",
|
"mlua",
|
||||||
|
"nix 0.23.0",
|
||||||
"rayon",
|
"rayon",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
"winit",
|
"winit",
|
||||||
|
@ -1141,7 +1155,7 @@ dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"memmap2",
|
"memmap2",
|
||||||
"nix",
|
"nix 0.22.0",
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
"wayland-client",
|
"wayland-client",
|
||||||
"wayland-cursor",
|
"wayland-cursor",
|
||||||
|
@ -1358,7 +1372,7 @@ dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"downcast-rs",
|
"downcast-rs",
|
||||||
"libc",
|
"libc",
|
||||||
"nix",
|
"nix 0.22.0",
|
||||||
"scoped-tls",
|
"scoped-tls",
|
||||||
"wayland-commons",
|
"wayland-commons",
|
||||||
"wayland-scanner",
|
"wayland-scanner",
|
||||||
|
@ -1371,7 +1385,7 @@ version = "0.29.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "93d6377fc0efc620da05cb78c5dc846420940e7b2c471aa2faf59c58e063c2b7"
|
checksum = "93d6377fc0efc620da05cb78c5dc846420940e7b2c471aa2faf59c58e063c2b7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nix",
|
"nix 0.22.0",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"wayland-sys",
|
"wayland-sys",
|
||||||
|
@ -1383,7 +1397,7 @@ version = "0.29.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bf9197a26e00b5e282b57ea9b620e4305ea5682f55f0b1ad862e388abf2d2bb5"
|
checksum = "bf9197a26e00b5e282b57ea9b620e4305ea5682f55f0b1ad862e388abf2d2bb5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nix",
|
"nix 0.22.0",
|
||||||
"wayland-client",
|
"wayland-client",
|
||||||
"xcursor",
|
"xcursor",
|
||||||
]
|
]
|
||||||
|
|
|
@ -21,3 +21,4 @@ fuzzy-matcher = "0.3.7"
|
||||||
walkdir = "2.3.2"
|
walkdir = "2.3.2"
|
||||||
freedesktop_entry_parser = "1.2.0"
|
freedesktop_entry_parser = "1.2.0"
|
||||||
mlua = { version = "0.6", features = ["lua54", "vendored"] }
|
mlua = { version = "0.6", features = ["lua54", "vendored"] }
|
||||||
|
nix = "0.23.0"
|
|
@ -1,6 +1,9 @@
|
||||||
|
use std::{os::unix::prelude::CommandExt, process::{Child, Command, Stdio}};
|
||||||
|
|
||||||
use freedesktop_entry_parser as parser;
|
use freedesktop_entry_parser as parser;
|
||||||
use log::debug;
|
use log::{debug, error};
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
use nix::unistd::{getpid, setpgid};
|
||||||
|
|
||||||
use crate::roftl::{Action, Entry, Source};
|
use crate::roftl::{Action, Entry, Source};
|
||||||
|
|
||||||
|
@ -10,6 +13,52 @@ struct App {
|
||||||
command: String,
|
command: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn with_term<'a>(term_cmd: &'a Option<String>, 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<&'a str>) {
|
||||||
|
let mut iter = exec.split(' ');
|
||||||
|
let cmd = iter.next().expect("Empty Exec").to_owned();
|
||||||
|
let args = iter.collect();
|
||||||
|
(cmd, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run_bg(mut command: Command) {
|
||||||
|
command.stdout(Stdio::null()).stderr(Stdio::null());
|
||||||
|
unsafe {
|
||||||
|
command.pre_exec(|| {
|
||||||
|
let pid = getpid();
|
||||||
|
if let Err(e) = setpgid(pid, pid) {
|
||||||
|
error!{"Failed to set pgid of child process with pid {}", pid};
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
debug!{"Running command {:?}", command}
|
||||||
|
command.spawn().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
impl App {
|
||||||
|
pub fn run(&self, term_cmd: &Option<String>) {
|
||||||
|
debug!("Exec: `{}`", self.command);
|
||||||
|
let(cmd, args) = parse_command_string(&self.command);
|
||||||
|
debug!("Running `{} {}`", cmd, args.join(" "));
|
||||||
|
let mut command = Command::new(&cmd);
|
||||||
|
command.args(&args);
|
||||||
|
let _ = run_bg(command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<&App> for Entry
|
impl From<&App> for Entry
|
||||||
{
|
{
|
||||||
fn from(app: &App) -> Self {
|
fn from(app: &App) -> Self {
|
||||||
|
@ -20,6 +69,8 @@ impl From<&App> for Entry
|
||||||
identifier: 0
|
identifier: 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
|
@ -40,7 +91,7 @@ impl<'a> AppBuilder<'a>
|
||||||
Some (
|
Some (
|
||||||
App {
|
App {
|
||||||
name: self.name.unwrap().into(),
|
name: self.name.unwrap().into(),
|
||||||
command: self.exec.unwrap().into()
|
command: strip_entry_args(self.exec.unwrap()).into(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,6 +107,17 @@ impl Apps {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn strip_entry_args(exec: &str) -> String {
|
||||||
|
debug!{"Stripping {}", exec}
|
||||||
|
let iter = exec.split(' ');
|
||||||
|
let result = iter.filter(|item| !item.starts_with('%'))
|
||||||
|
.collect::<Vec<&str>>()
|
||||||
|
.join(" ");
|
||||||
|
|
||||||
|
debug!{"Stripped into {}", result}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
impl Source for Apps {
|
impl Source for Apps {
|
||||||
fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
"apps"
|
"apps"
|
||||||
|
@ -89,6 +151,7 @@ impl Source for Apps {
|
||||||
{
|
{
|
||||||
"Name" => app_builder.name = attr.value,
|
"Name" => app_builder.name = attr.value,
|
||||||
"Exec" => app_builder.exec = attr.value,
|
"Exec" => app_builder.exec = attr.value,
|
||||||
|
"NoDisplay" => app_builder.hidden = attr.value,
|
||||||
"Hidden" => app_builder.hidden = attr.value,
|
"Hidden" => app_builder.hidden = attr.value,
|
||||||
_ => ()
|
_ => ()
|
||||||
}
|
}
|
||||||
|
@ -116,5 +179,6 @@ impl Source for Apps {
|
||||||
debug!{"Apps has entries {:?}", self.entries}
|
debug!{"Apps has entries {:?}", self.entries}
|
||||||
let app = self.entries.get(entry.identifier as usize).unwrap();
|
let app = self.entries.get(entry.identifier as usize).unwrap();
|
||||||
debug!{"Doing primary action {} for {}", app.name, app.command}
|
debug!{"Doing primary action {} for {}", app.name, app.command}
|
||||||
|
app.run(&Some("/bin/bash".into()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue