diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 6e401b3174..62707b61ee 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -10,7 +10,7 @@ mod utils; use crate::{ core::VergeConfig, - utils::{resolve, server}, + utils::{dirs, resolve, server}, }; use tauri::{ api, CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem, @@ -22,6 +22,11 @@ fn main() -> std::io::Result<()> { return Ok(()); } + #[cfg(target_os = "windows")] + unsafe { + dirs::init_portable_flag(); + } + let tray_menu = SystemTrayMenu::new() .add_item(CustomMenuItem::new("open_window", "Show")) .add_item(CustomMenuItem::new("system_proxy", "System Proxy")) diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index bd3058eab1..a900fe3c96 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -1,5 +1,6 @@ use std::env::temp_dir; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; +use tauri::utils::platform::current_exe; use tauri::{ api::path::{home_dir, resource_dir}, Env, PackageInfo, @@ -15,12 +16,40 @@ static VERGE_CONFIG: &str = "verge.yaml"; static PROFILE_YAML: &str = "profiles.yaml"; static PROFILE_TEMP: &str = "clash-verge-runtime.yaml"; +/// portable flag +#[allow(unused)] +static mut PORTABLE_FLAG: bool = false; + +/// initialize portable flag +pub unsafe fn init_portable_flag() { + #[cfg(target_os = "windows")] + { + let exe = current_exe().unwrap(); + let dir = exe.parent().unwrap(); + let dir = PathBuf::from(dir).join(".config/PORTABLE"); + + if dir.exists() { + PORTABLE_FLAG = true; + } + } +} + /// get the verge app home dir pub fn app_home_dir() -> PathBuf { - home_dir() - .unwrap() - .join(Path::new(".config")) - .join(Path::new(APP_DIR)) + #[cfg(target_os = "windows")] + unsafe { + if !PORTABLE_FLAG { + home_dir().unwrap().join(".config").join(APP_DIR) + } else { + let app_exe = current_exe().unwrap(); + let app_exe = dunce::canonicalize(app_exe).unwrap(); + let app_dir = app_exe.parent().unwrap(); + PathBuf::from(app_dir).join(".config").join(APP_DIR) + } + } + + #[cfg(not(target_os = "windows"))] + home_dir().unwrap().join(".config").join(APP_DIR) } /// get the resources dir