From 3a2a7a1476615a07d96261c793b42a7d94b5efe5 Mon Sep 17 00:00:00 2001 From: MystiPanda Date: Wed, 10 Jan 2024 13:03:34 +0800 Subject: [PATCH] feat: Support URL Scheme for Linux --- .../utils/desktop/clash-verge-scheme.desktop | 6 +++++ src-tauri/src/utils/dirs.rs | 8 +++++++ src-tauri/src/utils/init.rs | 22 +++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 src-tauri/src/utils/desktop/clash-verge-scheme.desktop diff --git a/src-tauri/src/utils/desktop/clash-verge-scheme.desktop b/src-tauri/src/utils/desktop/clash-verge-scheme.desktop new file mode 100644 index 00000000..e2226e48 --- /dev/null +++ b/src-tauri/src/utils/desktop/clash-verge-scheme.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=Clash Verge Scheme Handler +Exec=clash-verge %u +StartupNotify=false +MimeType=x-scheme-handler/clash; \ No newline at end of file diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 43b406dc..bf681576 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -92,6 +92,14 @@ pub fn clash_pid_path() -> Result { Ok(app_home_dir()?.join("clash.pid")) } +#[cfg(linux)] +pub fn local_applications_dir() -> Result { + use tauri::api::path::home_dir; + Ok(home_dir() + .ok_or(anyhow::anyhow!("failed to get home dir"))? + .join(".local/share/applications")) +} + #[cfg(windows)] pub fn service_dir() -> Result { Ok(app_home_dir()?.join("service")) diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index 66ee19b0..e5825fda 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -325,6 +325,28 @@ pub fn init_scheme() -> Result<()> { } #[cfg(target_os = "linux")] pub fn init_scheme() -> Result<()> { + use std::io::Write; + + let desktop_file_content = include_str!("./desktop/clash-verge-scheme.desktop"); + let desktop_dir = dirs::local_applications_dir()?; + if !desktop_dir.exists() { + let _ = std::fs::create_dir_all(&desktop_dir); + } + let mut desktop_file = + std::fs::File::create(dirs::local_applications_dir()?.join("clash-verge-scheme.desktop"))?; + desktop_file.write_all(desktop_file_content.as_bytes())?; + + let output = std::process::Command::new("xdg-mime") + .arg("default") + .arg("clash-verge-scheme.desktop") + .arg("x-scheme-handler/clash") + .output()?; + if !output.status.success() { + return Err(anyhow::anyhow!( + "failed to set clash scheme, {}", + String::from_utf8_lossy(&output.stderr) + )); + } Ok(()) } #[cfg(target_os = "macos")]