1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-09-15 19:26:58 +02:00

Merge pull request #1089 from JakeStanger/fix/gtk-launch-zombie

fix: opening programs via `launcher` and `menu` leaving zombie processes
This commit is contained in:
Jake Stanger 2025-07-14 21:45:40 +01:00 committed by GitHub
commit 622ca3cc4f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 6 deletions

View file

@ -3,9 +3,10 @@ use color_eyre::{Help, Report, Result};
use std::collections::HashMap; use std::collections::HashMap;
use std::env; use std::env;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::process::{Command, Stdio}; use std::process::Stdio;
use std::sync::Arc; use std::sync::Arc;
use tokio::io::{AsyncBufReadExt, BufReader}; use tokio::io::{AsyncBufReadExt, BufReader};
use tokio::process::Command;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use tracing::{debug, error}; use tracing::{debug, error};
use walkdir::{DirEntry, WalkDir}; use walkdir::{DirEntry, WalkDir};
@ -325,20 +326,24 @@ fn files(dir: &Path) -> Vec<PathBuf> {
} }
/// Starts a `.desktop` file with the provided formatted command. /// Starts a `.desktop` file with the provided formatted command.
pub fn open_program(file_name: &str, str: &str) { pub async fn open_program(file_name: &str, launch_command: &str) {
let expanded = str.replace("{app_name}", file_name); let expanded = launch_command.replace("{app_name}", file_name);
let launch_command_parts: Vec<&str> = expanded.split_whitespace().collect(); let launch_command_parts: Vec<&str> = expanded.split_whitespace().collect();
debug!("running {launch_command_parts:?}");
if let Err(err) = Command::new(launch_command_parts[0]) if let Err(err) = Command::new(launch_command_parts[0])
.args(&launch_command_parts[1..]) .args(&launch_command_parts[1..])
.stdin(Stdio::null())
.stdout(Stdio::null()) .stdout(Stdio::null())
.stderr(Stdio::null()) .stderr(Stdio::null())
.kill_on_drop(true)
.spawn() .spawn()
{ {
error!( error!(
"{:?}", "{:?}",
Report::new(err) Report::new(err)
.wrap_err("Failed to run launch command.") .wrap_err("Failed to run launch command.")
.suggestion("Perhaps the applications file is invalid?") .suggestion("Perhaps the desktop file is invalid or orphaned?")
); );
} }
} }

View file

@ -388,7 +388,7 @@ impl Module<gtk::Box> for LauncherModule {
if let ItemEvent::OpenItem(app_id) = event { if let ItemEvent::OpenItem(app_id) = event {
match desktop_files.find(&app_id).await { match desktop_files.find(&app_id).await {
Ok(Some(file)) => { Ok(Some(file)) => {
open_program(&file.file_name, &launch_command_str); open_program(&file.file_name, &launch_command_str).await;
} }
Ok(None) => warn!("Could not find applications file for {}", app_id), Ok(None) => warn!("Could not find applications file for {}", app_id),
Err(err) => error!("Failed to find parse file for {}: {}", app_id, err), Err(err) => error!("Failed to find parse file for {}: {}", app_id, err),

View file

@ -100,7 +100,13 @@ where
let tx = tx.clone(); let tx = tx.clone();
button.connect_clicked(move |_button| { button.connect_clicked(move |_button| {
open_program(&file_name, &command); // TODO: this needs refactoring to call open from the controller
let file_name = file_name.clone();
let command = command.clone();
glib::spawn_future_local(async move {
open_program(&file_name, &command).await
});
sub_menu.hide(); sub_menu.hide();
tx.send_spawn(ModuleUpdateEvent::ClosePopup); tx.send_spawn(ModuleUpdateEvent::ClosePopup);