diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index 61e6e58c..c416a4da 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -181,6 +181,9 @@ pub struct IVerge { pub webdav_password: Option, pub enable_tray_speed: Option, + + /// 轻量模式 - 只保留内核运行 + pub enable_lite_mode: Option, } #[derive(Default, Debug, Clone, Deserialize, Serialize)] @@ -283,6 +286,7 @@ impl IVerge { webdav_password: None, enable_tray_speed: Some(true), enable_global_hotkey: Some(true), + enable_lite_mode: Some(false), ..Self::default() } } @@ -364,6 +368,7 @@ impl IVerge { patch!(webdav_username); patch!(webdav_password); patch!(enable_tray_speed); + patch!(enable_lite_mode); } /// 在初始化前尝试拿到单例端口的值 @@ -452,6 +457,7 @@ pub struct IVergeResponse { pub webdav_username: Option, pub webdav_password: Option, pub enable_tray_speed: Option, + pub enable_lite_mode: Option, } impl From for IVergeResponse { @@ -514,6 +520,7 @@ impl From for IVergeResponse { webdav_username: verge.webdav_username, webdav_password: verge.webdav_password, enable_tray_speed: verge.enable_tray_speed, + enable_lite_mode: verge.enable_lite_mode, } } } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index b593cdfc..b294930a 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -246,6 +246,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let proxy_bypass = patch.system_proxy_bypass; let language = patch.language; let mixed_port = patch.verge_mixed_port; + let lite_mode = patch.enable_lite_mode; #[cfg(target_os = "macos")] let tray_icon = patch.tray_icon; #[cfg(not(target_os = "macos"))] @@ -373,6 +374,23 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { if should_update_systray_tooltip { tray::Tray::global().update_tooltip()?; } + + // 处理轻量模式切换 + if lite_mode.is_some() { + if let Some(window) = handle::Handle::global().get_window() { + if lite_mode.unwrap() { + // 完全退出 webview 进程 + window.close()?; // 先关闭窗口 + let app_handle = handle::Handle::global().app_handle().unwrap(); + if let Some(webview) = app_handle.get_webview_window("main") { + webview.destroy()?; // 销毁 webview 进程 + } + } else { + resolve::create_window(); // 重新创建窗口 + } + } + } + >::Ok(()) }; match res { diff --git a/src/components/setting/setting-verge.tsx b/src/components/setting/setting-verge.tsx index f4f922b0..50fe95df 100644 --- a/src/components/setting/setting-verge.tsx +++ b/src/components/setting/setting-verge.tsx @@ -60,6 +60,7 @@ const SettingVerge = ({ onError }: Props) => { env_type, startup_script, start_page, + enable_lite_mode, } = verge ?? {}; const configRef = useRef(null); const hotkeyRef = useRef(null); @@ -69,7 +70,7 @@ const SettingVerge = ({ onError }: Props) => { const updateRef = useRef(null); const backupRef = useRef(null); - const onChangeData = (patch: Partial) => { + const onChangeData = (patch: any) => { mutateVerge({ ...verge, ...patch }, false); }; @@ -292,6 +293,14 @@ const SettingVerge = ({ onError }: Props) => { + + } + onClick={() => patchVerge({ enable_lite_mode: true })} + /> + { exitApp(); diff --git a/src/locales/zh.json b/src/locales/zh.json index 622cfe16..7acde59d 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -433,5 +433,7 @@ "Rule Mode": "规则模式", "Global Mode": "全局模式", "Direct Mode": "直连模式", - "Enable Tray Speed": "启用托盘速率" + "Enable Tray Speed": "启用托盘速率", + "Lite Mode": "轻量模式", + "Lite Mode Info": "开启后将关闭GUI界面,仅保留内核运行" } diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 04431768..0c23787e 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -27,6 +27,7 @@ import { getPortableFlag } from "@/services/cmds"; import React from "react"; import { TransitionGroup, CSSTransition } from "react-transition-group"; import { useListen } from "@/hooks/use-listen"; +import { listen } from "@tauri-apps/api/event"; const appWindow = getCurrentWebviewWindow(); export let portableFlag = false; @@ -91,6 +92,24 @@ const Layout = () => { await appWindow.show(); await appWindow.setFocus(); }, 50); + + // 监听窗口显示/隐藏事件 + const setupListeners = async () => { + const unlisten1 = await listen("verge://hide-window", () => { + appWindow.hide(); + }); + + const unlisten2 = await listen("verge://show-window", () => { + appWindow.show(); + }); + + return () => { + unlisten1(); + unlisten2(); + }; + }; + + setupListeners(); }, []); useEffect(() => {