From 5d23aaacc89fec002ac8b1a0be109bbc2c47385f Mon Sep 17 00:00:00 2001 From: Petros Amoiridis Date: Fri, 10 Feb 2023 21:11:54 +0200 Subject: [PATCH] Introduce an open function And refactor some of the older code to simplify it Co-Authored-By: Mikayla Maki --- crates/terminal/src/terminal.rs | 34 +++------------------------ crates/util/src/lib.rs | 8 +++++++ crates/workspace/src/notifications.rs | 6 +---- 3 files changed, 12 insertions(+), 36 deletions(-) diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index dd5c5fb3b0..a4f913ec77 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -32,17 +32,14 @@ use mappings::mouse::{ use procinfo::LocalProcessInfo; use settings::{AlternateScroll, Settings, Shell, TerminalBlink}; -use util::ResultExt; use std::{ cmp::min, collections::{HashMap, VecDeque}, fmt::Display, - io, ops::{Deref, Index, RangeInclusive, Sub}, - os::unix::{prelude::AsRawFd, process::CommandExt}, + os::unix::prelude::AsRawFd, path::PathBuf, - process::Command, sync::Arc, time::{Duration, Instant}, }; @@ -734,7 +731,7 @@ impl Terminal { if let Some((url, url_match)) = found_url { if *open { - open_uri(&url).log_err(); + util::open(&url); } else { self.update_hyperlink(prev_hyperlink, url, url_match); } @@ -1075,7 +1072,7 @@ impl Terminal { if self.selection_phase == SelectionPhase::Ended { let mouse_cell_index = content_index_for_mouse(position, &self.last_content); if let Some(link) = self.last_content.cells[mouse_cell_index].hyperlink() { - open_uri(link.uri()).log_err(); + util::open(link.uri()); } else { self.events .push_back(InternalEvent::FindHyperlink(position, true)); @@ -1234,31 +1231,6 @@ fn content_index_for_mouse<'a>(pos: Vector2F, content: &'a TerminalContent) -> u line * content.size.columns() + col } -fn open_uri(uri: &str) -> Result<(), std::io::Error> { - let mut command = Command::new("open"); - command.arg(uri); - - unsafe { - command - .pre_exec(|| { - match libc::fork() { - -1 => return Err(io::Error::last_os_error()), - 0 => (), - _ => libc::_exit(0), - } - - if libc::setsid() == -1 { - return Err(io::Error::last_os_error()); - } - - Ok(()) - }) - .spawn()? - .wait() - .map(|_| ()) - } -} - #[cfg(test)] mod tests { use alacritty_terminal::{ diff --git a/crates/util/src/lib.rs b/crates/util/src/lib.rs index 698d888e15..5b12502389 100644 --- a/crates/util/src/lib.rs +++ b/crates/util/src/lib.rs @@ -54,6 +54,14 @@ pub fn truncate_and_trailoff(s: &str, max_chars: usize) -> String { } } +pub fn open>(path: P) { + let path_to_open = path.as_ref().to_string_lossy(); + std::process::Command::new("open") + .arg(path_to_open.as_ref()) + .spawn() + .log_err(); +} + pub fn reveal_in_finder>(path: P) { let path_to_reveal = path.as_ref().to_string_lossy(); std::process::Command::new("open") diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs index 72dec114d9..76ee5b1c40 100644 --- a/crates/workspace/src/notifications.rs +++ b/crates/workspace/src/notifications.rs @@ -121,7 +121,6 @@ impl Workspace { } pub mod simple_message_notification { - use std::process::Command; use gpui::{ actions, @@ -150,10 +149,7 @@ pub mod simple_message_notification { |_workspace: &mut Workspace, open_action: &OsOpen, _cx: &mut ViewContext| { #[cfg(target_os = "macos")] { - let mut command = Command::new("open"); - command.arg(open_action.0.clone()); - - command.spawn().ok(); + util::open(&open_action.0); } }, )