feat: light mode wip (#96)

* 关闭窗口释放UI资源

* windows 还有左键点击事件

* 兼容enhance profile

* bug 修复
This commit is contained in:
ctaoist 2022-05-25 16:06:39 +08:00 committed by GitHub
parent 1581e9b1cd
commit 5164aec37b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 70 additions and 32 deletions

View File

@ -48,9 +48,10 @@ pub struct Core {
impl Core { impl Core {
pub fn new() -> Core { pub fn new() -> Core {
let clash = Clash::new(); let clash = Clash::new();
let verge = Verge::new(); let mut verge = Verge::new();
let profiles = Profiles::new(); let profiles = Profiles::new();
let service = Service::new(); let service = Service::new();
verge.launch_flag = Some(true);
Core { Core {
clash: Arc::new(Mutex::new(clash)), clash: Arc::new(Mutex::new(clash)),
@ -382,7 +383,14 @@ impl Core {
result.error.map(|err| log::error!("{err}")); 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(()) Ok(())
} }

View File

@ -37,6 +37,10 @@ pub struct Verge {
/// enable proxy guard /// enable proxy guard
pub enable_proxy_guard: Option<bool>, pub enable_proxy_guard: Option<bool>,
/// launch flag
#[serde(skip_serializing)]
pub launch_flag: Option<bool>,
/// set system proxy bypass /// set system proxy bypass
pub system_proxy_bypass: Option<String>, pub system_proxy_bypass: Option<String>,

View File

@ -44,10 +44,23 @@ fn main() -> std::io::Result<()> {
.on_system_tray_event(move |app_handle, event| match event { .on_system_tray_event(move |app_handle, event| match event {
SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() { SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {
"open_window" => { "open_window" => {
let window = app_handle.get_window("main").unwrap(); tauri::window::WindowBuilder::new(
window.unminimize().unwrap(); app_handle,
window.show().unwrap(); "main".to_string(),
window.set_focus().unwrap(); 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" => { "system_proxy" => {
let core = app_handle.state::<core::Core>(); let core = app_handle.state::<core::Core>();
@ -91,10 +104,23 @@ fn main() -> std::io::Result<()> {
}, },
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
SystemTrayEvent::LeftClick { .. } => { SystemTrayEvent::LeftClick { .. } => {
let window = app_handle.get_window("main").unwrap(); tauri::window::WindowBuilder::new(
window.unminimize().unwrap(); app_handle,
window.show().unwrap(); "main".to_string(),
window.set_focus().unwrap(); 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!()) .build(tauri::generate_context!())
.expect("error while running tauri application") .expect("error while running tauri application")
.run(|app_handle, e| match e { .run(|app_handle, e| match e {
tauri::RunEvent::WindowEvent { label, event, .. } => match event { tauri::RunEvent::ExitRequested { api, .. } => {
tauri::WindowEvent::CloseRequested { api, .. } => { api.prevent_exit();
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::Exit => { tauri::RunEvent::Exit => {
resolve::resolve_reset(app_handle); resolve::resolve_reset(app_handle);

View File

@ -30,7 +30,7 @@ const LayoutControl = () => {
<Button <Button
size="small" size="small"
sx={{ minWidth, svg: { transform: "scale(1.05)" } }} sx={{ minWidth, svg: { transform: "scale(1.05)" } }}
onClick={() => appWindow.hide()} onClick={() => appWindow.close()}
> >
<CloseRounded fontSize="small" /> <CloseRounded fontSize="small" />
</Button> </Button>

View File

@ -35,7 +35,7 @@ const Layout = () => {
useEffect(() => { useEffect(() => {
window.addEventListener("keydown", (e) => { window.addEventListener("keydown", (e) => {
if (e.key === "Escape") appWindow.hide(); if (e.key === "Escape") appWindow.close();
}); });
listen("verge://refresh-clash-config", async () => { listen("verge://refresh-clash-config", async () => {

View File

@ -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 { CmdType } from "./types";
import ignoreCase from "../utils/ignore-case"; import ignoreCase from "../utils/ignore-case";
@ -124,21 +125,29 @@ class Enhance {
return this.resultMap.get(uid); 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 the handler
setup() { setup() {
if (this.isSetup) return; if (this.isSetup) return;
this.isSetup = true; this.isSetup = true;
listen("script-handler", async (event) => { listen("script-handler", async (event) => {
const payload = event.payload as CmdType.EnhancedPayload; await this.enhanceHandler(event);
});
const result = await this.runner(payload).catch((err: any) => ({ listen("script-handler-close", async (event) => {
data: null, await this.enhanceHandler(event);
status: "error", appWindow.close();
error: err.message,
}));
emit(payload.callback, JSON.stringify(result)).catch(console.error);
}); });
} }