diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs index 5907cf4cbaa3c64ae03cd3afc5ea818fa9c6417b..ec4e396a0b9dd6023878a87ff603e6658b4090ed 100644 --- a/src-tauri/src/core/mod.rs +++ b/src-tauri/src/core/mod.rs @@ -48,9 +48,10 @@ pub struct Core { impl Core { pub fn new() -> Core { let clash = Clash::new(); - let verge = Verge::new(); + let mut verge = Verge::new(); let profiles = Profiles::new(); let service = Service::new(); + verge.launch_flag = Some(true); Core { clash: Arc::new(Mutex::new(clash)), @@ -382,7 +383,14 @@ impl Core { result.error.map(|err| log::error!("{err}")); }); - window.emit("script-handler", payload).unwrap(); + let mut verge = self.verge.lock(); + let silent_start = verge.enable_silent_start.clone(); + if silent_start.unwrap_or(false) && verge.launch_flag.unwrap_or(false) { + window.emit("script-handler-close", payload).unwrap(); + verge.launch_flag = Some(false); + } else { + window.emit("script-handler", payload).unwrap(); + } Ok(()) } diff --git a/src-tauri/src/core/verge.rs b/src-tauri/src/core/verge.rs index a03bde424376295fe671262678a19b850b3e6346..0db1621d4ebda9fdfb0b439579d3110518c8cdb2 100644 --- a/src-tauri/src/core/verge.rs +++ b/src-tauri/src/core/verge.rs @@ -37,6 +37,10 @@ pub struct Verge { /// enable proxy guard pub enable_proxy_guard: Option<bool>, + /// launch flag + #[serde(skip_serializing)] + pub launch_flag: Option<bool>, + /// set system proxy bypass pub system_proxy_bypass: Option<String>, diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 0cec26d145f1fe2adc693c95cfce2c287fae9e2e..19bbc41e6dd54af67d25e7518c5d28232363d7c5 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -44,10 +44,23 @@ fn main() -> std::io::Result<()> { .on_system_tray_event(move |app_handle, event| match event { SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() { "open_window" => { - let window = app_handle.get_window("main").unwrap(); - window.unminimize().unwrap(); - window.show().unwrap(); - window.set_focus().unwrap(); + tauri::window::WindowBuilder::new( + app_handle, + "main".to_string(), + tauri::WindowUrl::App("index.html".into()), + ) + .title("Clash Verge") + .center() + .decorations(false) + .fullscreen(false) + .inner_size(800.0, 636.0) + .min_inner_size(600.0, 520.0) + .build() + .err() + .and_then(|e| { + log::error!("{e}"); + Some(0) + }); } "system_proxy" => { let core = app_handle.state::<core::Core>(); @@ -91,10 +104,23 @@ fn main() -> std::io::Result<()> { }, #[cfg(target_os = "windows")] SystemTrayEvent::LeftClick { .. } => { - let window = app_handle.get_window("main").unwrap(); - window.unminimize().unwrap(); - window.show().unwrap(); - window.set_focus().unwrap(); + tauri::window::WindowBuilder::new( + app_handle, + "main".to_string(), + tauri::WindowUrl::App("index.html".into()), + ) + .title("Clash Verge") + .center() + .decorations(false) + .fullscreen(false) + .inner_size(800.0, 636.0) + .min_inner_size(600.0, 520.0) + .build() + .err() + .and_then(|e| { + log::error!("{e}"); + Some(0) + }); } _ => {} }) @@ -156,17 +182,8 @@ fn main() -> std::io::Result<()> { .build(tauri::generate_context!()) .expect("error while running tauri application") .run(|app_handle, e| match e { - tauri::RunEvent::WindowEvent { label, event, .. } => match event { - tauri::WindowEvent::CloseRequested { api, .. } => { - let app_handle = app_handle.clone(); - api.prevent_close(); - app_handle.get_window(&label).unwrap().hide().unwrap(); - } - _ => {} - }, - tauri::RunEvent::ExitRequested { .. } => { - resolve::resolve_reset(app_handle); - api::process::kill_children(); + tauri::RunEvent::ExitRequested { api, .. } => { + api.prevent_exit(); } tauri::RunEvent::Exit => { resolve::resolve_reset(app_handle); diff --git a/src/components/layout/layout-control.tsx b/src/components/layout/layout-control.tsx index 0bba354b55e3d2c038cd5cecacf0275fd5c2fdaf..379527bbfdef0083518e04870a8f7f8ba9e03983 100644 --- a/src/components/layout/layout-control.tsx +++ b/src/components/layout/layout-control.tsx @@ -30,7 +30,7 @@ const LayoutControl = () => { <Button size="small" sx={{ minWidth, svg: { transform: "scale(1.05)" } }} - onClick={() => appWindow.hide()} + onClick={() => appWindow.close()} > <CloseRounded fontSize="small" /> </Button> diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 6fa149881c5e5a1939027cfaaefa7bed155edf76..58e1c1ffcc9bbe23ec40ac852ac6cfb444d4cae3 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -35,7 +35,7 @@ const Layout = () => { useEffect(() => { window.addEventListener("keydown", (e) => { - if (e.key === "Escape") appWindow.hide(); + if (e.key === "Escape") appWindow.close(); }); listen("verge://refresh-clash-config", async () => { diff --git a/src/services/enhance.ts b/src/services/enhance.ts index a1ebf5a765ae62040a28bc41fe2604febd7d9891..803ee2e046fa3f56ccd0479039b2449aad878d21 100644 --- a/src/services/enhance.ts +++ b/src/services/enhance.ts @@ -1,4 +1,5 @@ -import { emit, listen } from "@tauri-apps/api/event"; +import { emit, listen, Event } from "@tauri-apps/api/event"; +import { appWindow } from "@tauri-apps/api/window"; import { CmdType } from "./types"; import ignoreCase from "../utils/ignore-case"; @@ -124,21 +125,29 @@ class Enhance { return this.resultMap.get(uid); } + async enhanceHandler(event: Event<unknown>) { + const payload = event.payload as CmdType.EnhancedPayload; + + const result = await this.runner(payload).catch((err: any) => ({ + data: null, + status: "error", + error: err.message, + })); + + emit(payload.callback, JSON.stringify(result)).catch(console.error); + } // setup the handler setup() { if (this.isSetup) return; this.isSetup = true; listen("script-handler", async (event) => { - const payload = event.payload as CmdType.EnhancedPayload; - - const result = await this.runner(payload).catch((err: any) => ({ - data: null, - status: "error", - error: err.message, - })); + await this.enhanceHandler(event); + }); - emit(payload.callback, JSON.stringify(result)).catch(console.error); + listen("script-handler-close", async (event) => { + await this.enhanceHandler(event); + appWindow.close(); }); }