Terminal app execution

This commit is contained in:
Armin Friedl 2021-10-25 14:00:42 +02:00
parent 42907b8982
commit 0f4117b436

View file

@ -1,4 +1,4 @@
use std::{os::unix::prelude::CommandExt, process::{Child, Command, Stdio}}; use std::{os::unix::prelude::CommandExt, process::{Command, Stdio}};
use freedesktop_entry_parser as parser; use freedesktop_entry_parser as parser;
use log::{debug, error}; use log::{debug, error};
@ -11,6 +11,7 @@ use crate::roftl::{Action, Entry, Source};
struct App { struct App {
name: String, name: String,
command: String, command: String,
terminal: bool
} }
fn with_term<'a>(term_cmd: &'a Option<String>, exec: &'a str,) { fn with_term<'a>(term_cmd: &'a Option<String>, exec: &'a str,) {
@ -25,10 +26,10 @@ fn with_term<'a>(term_cmd: &'a Option<String>, exec: &'a str,) {
} }
} }
pub fn parse_command_string<'a>(exec: &'a str) -> (String, Vec<&'a str>) { pub fn parse_command_string<'a>(exec: &'a str) -> (String, Vec<String>) {
let mut iter = exec.split(' '); let mut iter = exec.split(' ');
let cmd = iter.next().expect("Empty Exec").to_owned(); let cmd = iter.next().expect("Empty Exec").to_owned();
let args = iter.collect(); let args = iter.map(|arg| arg.to_owned()).collect();
(cmd, args) (cmd, args)
} }
@ -49,13 +50,24 @@ pub fn run_bg(mut command: Command) {
} }
impl App { impl App {
pub fn run(&self, term_cmd: &Option<String>) { pub fn run(&self) {
debug!("Exec: `{}`", self.command); debug!("Exec: `{}`", self.command);
let(cmd, args) = parse_command_string(&self.command); let (cmd, mut args) = parse_command_string(&self.command);
if self.terminal {
debug!("Running `{} {}` in terminal ", cmd, args.join(" "));
let mut command = Command::new("xfce4-terminal");
args.insert(0, cmd);
args.insert(0, "-x".into());
command.args(&args);
let _ = run_bg(command);
} else {
debug!("Running `{} {}`", cmd, args.join(" ")); debug!("Running `{} {}`", cmd, args.join(" "));
let mut command = Command::new(&cmd); let mut command = Command::new(&cmd);
command.args(&args); command.args(&args);
let _ = run_bg(command); let _ = run_bg(command);
}
} }
} }
@ -77,7 +89,8 @@ impl From<&App> for Entry
struct AppBuilder<'a> { struct AppBuilder<'a> {
name: Option<&'a str>, name: Option<&'a str>,
exec: Option<&'a str>, exec: Option<&'a str>,
hidden: Option<&'a str> hidden: Option<&'a str>,
terminal: Option<&'a str>
} }
impl<'a> AppBuilder<'a> impl<'a> AppBuilder<'a>
@ -92,6 +105,7 @@ impl<'a> AppBuilder<'a>
App { App {
name: self.name.unwrap().into(), name: self.name.unwrap().into(),
command: strip_entry_args(self.exec.unwrap()).into(), command: strip_entry_args(self.exec.unwrap()).into(),
terminal: self.terminal.map_or(false, |term| term.parse().unwrap_or(false))
}) })
} }
} }
@ -126,7 +140,7 @@ impl Source for Apps {
fn entries(&mut self) -> Vec<Entry> { fn entries(&mut self) -> Vec<Entry> {
let paths = vec![ let paths = vec![
"/usr/share/applications/", "/usr/share/applications/",
"~/.local/share/applications/", "/home/armin/.local/share/applications/",
"/var/lib/snapd/desktop/applications", "/var/lib/snapd/desktop/applications",
"/var/lib/flatpak/exports/share/applications" "/var/lib/flatpak/exports/share/applications"
]; ];
@ -153,6 +167,7 @@ impl Source for Apps {
"Exec" => app_builder.exec = attr.value, "Exec" => app_builder.exec = attr.value,
"NoDisplay" => app_builder.hidden = attr.value, "NoDisplay" => app_builder.hidden = attr.value,
"Hidden" => app_builder.hidden = attr.value, "Hidden" => app_builder.hidden = attr.value,
"Terminal" => app_builder.terminal = attr.value,
_ => () _ => ()
} }
} }
@ -179,6 +194,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())); app.run();
} }
} }