diff options
Diffstat (limited to 'pkgs/by-name/ts/tskm/src/browser/mod.rs')
| -rw-r--r-- | pkgs/by-name/ts/tskm/src/browser/mod.rs | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/pkgs/by-name/ts/tskm/src/browser/mod.rs b/pkgs/by-name/ts/tskm/src/browser/mod.rs index 8dd52663..2129982f 100644 --- a/pkgs/by-name/ts/tskm/src/browser/mod.rs +++ b/pkgs/by-name/ts/tskm/src/browser/mod.rs @@ -1,5 +1,5 @@ use std::{ - env, + env, fs, io::Write, os::unix::net::UnixStream, path::PathBuf, @@ -14,11 +14,14 @@ use url::Url; use crate::{state::State, task}; #[allow(clippy::too_many_lines)] -pub fn open_in_browser( +pub fn open_in_browser<U>( selected_project: &task::Project, state: &mut State, - url: Option<Url>, -) -> Result<()> { + urls: Option<Vec<U>>, +) -> Result<()> +where + U: Into<Url>, +{ let old_project: Option<task::Project> = task::Project::get_current().context("Failed to get currently active project")?; let old_task: Option<task::Task> = @@ -101,20 +104,44 @@ pub fn open_in_browser( ) })); - if ipc_socket_path.exists() { - let mut stream = UnixStream::connect(ipc_socket_path)?; + let socket = if ipc_socket_path.exists() { + match UnixStream::connect(&ipc_socket_path) { + Ok(ok) => Some(ok), + Err(err) => match err.kind() { + std::io::ErrorKind::ConnectionRefused => { + // There is no qutebrowser listening to our connection. + fs::remove_file(&ipc_socket_path).with_context(|| { + format!( + "Failed to remove orphaned qutebrowser socket: {}", + ipc_socket_path.display() + ) + })?; + None + } + _ => Err(err).with_context(|| { + format!( + "Failed to connect to qutebrowser's ipc socket at: {}", + ipc_socket_path.display() + ) + })?, + }, + } + } else { + None + }; - let real_url = if let Some(url) = url { - url.to_string() + if let Some(mut stream) = socket { + let real_url = if let Some(urls) = urls { + urls.into_iter().map(|url| url.into().to_string()).collect() } else { // Always add a new tab, so that qutebrowser is marked as “urgent”. - "qute://start".to_owned() + vec!["qute://start".to_owned()] }; stream.write_all( json! { { - "args": [real_url], + "args": real_url, "target_arg": null, "version": "1.0.4", "protocol_version": 1, @@ -128,10 +155,13 @@ pub fn open_in_browser( ExitStatus::default() } else { - let args = if let Some(url) = url { - &[url.to_string()][..] + let args = if let Some(urls) = urls { + urls.into_iter() + .map(Into::<Url>::into) + .map(|u| u.to_string()) + .collect() } else { - &[][..] + vec![] }; process::Command::new(format!( |
