fix: resolve the application freeze on macOS

This commit is contained in:
oshenyang
2026-01-17 00:23:10 +08:00
parent 7da69656d9
commit 562cd6908a
2 changed files with 26 additions and 68 deletions
+1 -50
View File
@@ -1,5 +1,4 @@
use serde::Serialize;
use tauri::{Emitter, Manager, WebviewWindow};
mod error;
mod fido;
@@ -16,43 +15,6 @@ pub struct WindowState {
pub is_maximized: bool,
}
/// Sets up window state listener that emits events to the frontend
pub fn setup_window_state_listener(window: &WebviewWindow) {
let window_clone = window.clone();
window.on_window_event(move |event| {
if let tauri::WindowEvent::Resized(_) = event {
if let Ok(is_maximized) = window_clone.is_maximized() {
let _ = window_clone.emit("window-state-changed", WindowState { is_maximized });
}
}
});
}
#[tauri::command]
fn minimize_window(window: WebviewWindow) {
let _ = window.minimize();
}
#[tauri::command]
fn toggle_maximize_window(window: WebviewWindow) {
if window.is_maximized().unwrap_or(false) {
let _ = window.unmaximize();
} else {
let _ = window.maximize();
}
}
#[tauri::command]
fn close_window(window: WebviewWindow) {
let _ = window.close();
}
#[tauri::command]
fn get_window_maximized(window: WebviewWindow) -> bool {
window.is_maximized().unwrap_or(false)
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
logging::logger_init();
@@ -61,13 +23,6 @@ pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_opener::init())
.setup(|app| {
if let Some(window) = app.get_webview_window("main") {
setup_window_state_listener(&window);
log::info!("Window state listener initialized");
}
Ok(())
})
.invoke_handler(tauri::generate_handler![
io::read_device_details,
io::write_config,
@@ -77,11 +32,7 @@ pub fn run() {
io::delete_credential,
io::set_min_pin_length,
io::enable_secure_boot,
io::reboot,
minimize_window,
toggle_maximize_window,
close_window,
get_window_maximized
io::reboot
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
+25 -18
View File
@@ -1,7 +1,6 @@
<script lang="ts">
import { onMount } from "svelte";
import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";
import { getCurrentWindow } from "@tauri-apps/api/window";
import { Home, Info, KeyRound, Maximize, Minimize, Minus, RefreshCw, ScrollText, Settings, ShieldCheck, X } from "@lucide/svelte";
import type { Component } from "svelte";
@@ -23,9 +22,8 @@
let { currentView, onViewChange, children }: Props = $props();
let isMaximized = $state(false);
let unlistenWindowState: (() => void) | undefined;
// const appWindow = getCurrentWindow();
const appWindow = getCurrentWindow();
const menuItems: Array<{ view: View; icon: Component; label: string }> = [
{ view: "home", icon: Home, label: "Home" },
@@ -36,21 +34,30 @@
{ view: "about", icon: Info, label: "About" },
];
onMount(() => {
const setupWindow = async () => {
isMaximized = await invoke("get_window_maximized");
function minimize() {
appWindow.minimize();
}
unlistenWindowState = await listen<{ isMaximized: boolean }>("window-state-changed", (event) => {
isMaximized = event.payload.isMaximized;
async function toggleMaximize() {
await appWindow.toggleMaximize();
}
function closeApp() {
appWindow.close();
}
onMount(() => {
const handleResize = () => {
appWindow.isMaximized().then((maximized) => {
isMaximized = maximized;
});
};
setupWindow();
handleResize();
window.addEventListener("resize", handleResize);
return () => {
if (unlistenWindowState) {
unlistenWindowState();
}
window.removeEventListener("resize", handleResize);
};
});
</script>
@@ -119,11 +126,11 @@
</div>
<div class="flex items-center gap-1">
<Button variant="ghost" size="icon" class="h-8 w-8 hover:bg-muted" onclick={() => invoke("minimize_window")}>
<Button variant="ghost" size="icon" class="h-8 w-8 hover:bg-muted" onclick={minimize}>
<Minus class="h-4 w-4" />
</Button>
<Button variant="ghost" size="icon" class="h-8 w-8 hover:bg-muted" onclick={() => invoke("toggle_maximize_window")}>
<Button variant="ghost" size="icon" class="h-8 w-8 hover:bg-muted" onclick={toggleMaximize}>
{#if isMaximized}
<Minimize class="h-3.5 w-3.5 rotate-180" />
{:else}
@@ -135,7 +142,7 @@
variant="ghost"
size="icon"
class="h-8 w-8 hover:bg-red-500 hover:text-white transition-colors"
onclick={() => invoke("close_window")}
onclick={closeApp}
>
<X class="h-4 w-4" />
</Button>