Shellhost
This commit is contained in:
parent
7a45982064
commit
31b355c727
7 changed files with 89 additions and 6 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1089,6 +1089,7 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
|
||||||
name = "roftl"
|
name = "roftl"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
"cairo-rs",
|
"cairo-rs",
|
||||||
"cairo-sys-rs",
|
"cairo-sys-rs",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
|
|
|
@ -23,3 +23,4 @@ freedesktop_entry_parser = "1.2.0"
|
||||||
mlua = { version = "0.6", features = ["lua54", "vendored"] }
|
mlua = { version = "0.6", features = ["lua54", "vendored"] }
|
||||||
nix = "0.23.0"
|
nix = "0.23.0"
|
||||||
fuse-rust = "0.3.0"
|
fuse-rust = "0.3.0"
|
||||||
|
anyhow = "1.0.44"
|
||||||
|
|
6
sh/hello_world.sh
Executable file
6
sh/hello_world.sh
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "hello, world"
|
||||||
|
#read hi
|
||||||
|
#echo "Said hi $hi"
|
||||||
|
#read
|
|
@ -24,6 +24,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
.add_source(sources::Window::new())
|
.add_source(sources::Window::new())
|
||||||
.add_source(sources::Apps::new())
|
.add_source(sources::Apps::new())
|
||||||
.add_source(sources::LuaHost::new())
|
.add_source(sources::LuaHost::new())
|
||||||
|
.add_source(sources::ShellHost::new())
|
||||||
.with_matcher(FuseMatcher::new());
|
.with_matcher(FuseMatcher::new());
|
||||||
|
|
||||||
debug!{"Source roftl sources"}
|
debug!{"Source roftl sources"}
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
use std::{collections::HashMap, sync::{Arc, Mutex, atomic::{AtomicUsize, Ordering}}, usize};
|
|
||||||
|
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use rayon::{iter::{IndexedParallelIterator, IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelIterator}, slice::ParallelSliceMut};
|
use rayon::prelude::*;
|
||||||
|
|
||||||
use super::matcher::PrefixMatcher;
|
use super::matcher::PrefixMatcher;
|
||||||
|
|
||||||
|
@ -63,8 +61,7 @@ impl Roftl {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn source(&mut self) {
|
pub fn source(&mut self) {
|
||||||
self.entries = self
|
self.entries = self.sources
|
||||||
.sources
|
|
||||||
.par_iter_mut()
|
.par_iter_mut()
|
||||||
.flat_map(|s| s.entries())
|
.flat_map(|s| s.entries())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -9,3 +9,6 @@ pub use apps::Apps;
|
||||||
|
|
||||||
mod luahost;
|
mod luahost;
|
||||||
pub use luahost::LuaHost;
|
pub use luahost::LuaHost;
|
||||||
|
|
||||||
|
mod shellhost;
|
||||||
|
pub use shellhost::ShellHost;
|
||||||
|
|
74
src/sources/shellhost.rs
Normal file
74
src/sources/shellhost.rs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
use std::{os::unix::prelude::CommandExt, path::PathBuf, process::{Command, Stdio}};
|
||||||
|
use log::{debug, error};
|
||||||
|
use nix::unistd::{getpid, setpgid};
|
||||||
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
|
use crate::roftl::{Entry, Source, Action};
|
||||||
|
|
||||||
|
pub struct ShellHost {
|
||||||
|
scripts: Vec<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ShellHost {
|
||||||
|
pub fn new() -> Box<ShellHost> {
|
||||||
|
Box::new(ShellHost{ scripts: vec![] })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Source for ShellHost {
|
||||||
|
fn name(&self) -> &'static str {
|
||||||
|
"sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn entries(&mut self) -> Vec<Entry> {
|
||||||
|
// TODO read from config
|
||||||
|
let script_path = "/home/armin/dev/incubator/roftl/sh";
|
||||||
|
|
||||||
|
// TODO make robust if path does not exist
|
||||||
|
let scripts: Vec<PathBuf> = WalkDir::new(script_path).into_iter()
|
||||||
|
.map(|e| e.unwrap().path().to_path_buf())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut entries: Vec<Entry> = vec![];
|
||||||
|
for (idx, script) in scripts.iter().enumerate() {
|
||||||
|
entries.push(
|
||||||
|
Entry {
|
||||||
|
source: self.name(),
|
||||||
|
name: script.file_stem().unwrap().to_str().unwrap().into(),
|
||||||
|
description: "".into(),
|
||||||
|
identifier: idx as u64
|
||||||
|
});
|
||||||
|
}
|
||||||
|
self.scripts = scripts;
|
||||||
|
entries
|
||||||
|
}
|
||||||
|
|
||||||
|
fn action(&self, entry: &Entry, action: Action) {
|
||||||
|
|
||||||
|
let script: &PathBuf = self.scripts.get(entry.identifier as usize).unwrap();
|
||||||
|
debug!{"Got script {:?}", script};
|
||||||
|
|
||||||
|
let mut command = Command::new("xfce4-terminal");
|
||||||
|
let args = vec!["-x", script.to_str().unwrap()];
|
||||||
|
command.args(&args);
|
||||||
|
|
||||||
|
let _ = run_bg(command);
|
||||||
|
debug!{"Executed {:?}", script};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run_bg(mut command: Command) {
|
||||||
|
command.stdout(Stdio::null()).stderr(Stdio::null());
|
||||||
|
unsafe {
|
||||||
|
command.pre_exec(|| {
|
||||||
|
let pid = getpid();
|
||||||
|
if let Err(_) = setpgid(pid, pid) {
|
||||||
|
error!{"Failed to set pgid of child process with pid {}", pid};
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
debug!{"Running command {:?}", command}
|
||||||
|
command.spawn().unwrap();
|
||||||
|
}
|
Loading…
Reference in a new issue