mirror of
https://github.com/librekeys/picoforge.git
synced 2026-07-28 08:01:19 -07:00
Merge pull request #10 from oshenyang/fix-macos-freeze
fix: resolve the application freeze on macOS
This commit is contained in:
+1
-50
@@ -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");
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
let pin = $state("");
|
||||
let error = $state("");
|
||||
let showPinDialog = $state(false);
|
||||
let pinDialogShown = $state(false);
|
||||
|
||||
let detailsOpen = $state(false);
|
||||
let selectedCredential: StoredCredential | null = $state(null);
|
||||
@@ -26,10 +27,12 @@
|
||||
let deleteConfirmationInput = $state("");
|
||||
|
||||
$effect(() => {
|
||||
if (device.connected && !device.unlocked) {
|
||||
if (device.connected && !device.unlocked && !pinDialogShown) {
|
||||
showPinDialog = true;
|
||||
} else {
|
||||
pinDialogShown = true;
|
||||
} else if (!device.connected) {
|
||||
showPinDialog = false;
|
||||
pinDialogShown = false;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -42,7 +45,10 @@
|
||||
loading = true;
|
||||
const res = await device.getCredentials(pin);
|
||||
|
||||
if (!res.success) {
|
||||
if (res.success) {
|
||||
showPinDialog = false;
|
||||
pinDialogShown = false;
|
||||
} else {
|
||||
error = typeof res.msg === "string" ? res.msg : "Failed to verify PIN";
|
||||
}
|
||||
|
||||
@@ -85,6 +91,7 @@
|
||||
device.lock();
|
||||
pin = "";
|
||||
error = "";
|
||||
pinDialogShown = false;
|
||||
}
|
||||
|
||||
function openDetails(cred: StoredCredential) {
|
||||
|
||||
Reference in New Issue
Block a user