about summary refs log tree commit diff stats
path: root/pkgs/by-name/ts/tskm/src/browser/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/ts/tskm/src/browser/mod.rs')
-rw-r--r--pkgs/by-name/ts/tskm/src/browser/mod.rs56
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!(