From 2480715f228fe0f8f177e01cbd79760ba816ac32 Mon Sep 17 00:00:00 2001 From: delibae Date: Mon, 16 Mar 2026 16:40:10 +0900 Subject: [PATCH] fix: macOS WKWebView black screen on focus restore & bump v1.0.5 - Add dual workaround for WKWebView failing to repaint after returning from background (1px resize nudge + DOM reflow) - Use version-free download links in landing page - Resolve app version dynamically from Tauri in sidebar - Bump version to 1.0.5 Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/desktop/package.json | 2 +- apps/desktop/src-tauri/Cargo.toml | 2 +- apps/desktop/src-tauri/src/lib.rs | 33 +++++++++++++++++++ apps/desktop/src-tauri/tauri.conf.json | 2 +- .../src/components/workspace/sidebar.tsx | 16 +++++++-- apps/landing | 2 +- package.json | 2 +- 7 files changed, 51 insertions(+), 8 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 41cfb57..e686802 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@claude-prism/desktop", - "version": "1.0.4", + "version": "1.0.5", "private": true, "type": "module", "scripts": { diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 11d7704..c189d08 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "claude-prism-desktop" -version = "1.0.4" +version = "1.0.5" description = "AI-powered LaTeX writing workspace" edition = "2021" diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 331a199..f0b41e4 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -320,6 +320,39 @@ pub fn run() { tauri::RunEvent::Ready => { set_macos_app_icon(); } + // Workaround: WKWebView sometimes fails to repaint after the app + // returns from background, leaving a black screen. We apply two + // complementary fixes on focus-restore: + // 1. Nudge the window size by 1 px and back (forces native + // compositing layer to re-composite). + // 2. Trigger a DOM reflow via JS (forces WKWebView render tree + // rebuild without losing app state). + // Either one alone may not cover all cases. + // See https://github.com/tauri-apps/tauri/issues/5226 + // https://github.com/tauri-apps/tauri/issues/14843 + #[cfg(target_os = "macos")] + tauri::RunEvent::WindowEvent { + ref label, + event: tauri::WindowEvent::Focused(true), + .. + } => { + if let Some(window) = app_handle.get_webview_window(label) { + // 1) Native resize nudge + if let Ok(size) = window.inner_size() { + let _ = window.set_size(tauri::Size::Physical(tauri::PhysicalSize { + width: size.width + 1, + height: size.height, + })); + let _ = window.set_size(tauri::Size::Physical(size)); + } + // 2) DOM reflow to force WKWebView render tree rebuild + let _ = window.eval( + "document.body.style.display='none';\ + document.body.offsetHeight;\ + document.body.style.display='';" + ); + } + } tauri::RunEvent::WindowEvent { label, event: tauri::WindowEvent::Destroyed, diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 190386a..be40241 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -2,7 +2,7 @@ "$schema": "https://raw.githubusercontent.com/nicegui-unofficial/nicegui-tauri-template/main/src-tauri/tauri.conf-v2-schema.json", "identifier": "com.claude-prism.desktop", "productName": "ClaudePrism", - "version": "1.0.4", + "version": "1.0.5", "build": { "beforeDevCommand": "pnpm dev", "beforeBuildCommand": "pnpm build", diff --git a/apps/desktop/src/components/workspace/sidebar.tsx b/apps/desktop/src/components/workspace/sidebar.tsx index 91d488e..8f58b28 100644 --- a/apps/desktop/src/components/workspace/sidebar.tsx +++ b/apps/desktop/src/components/workspace/sidebar.tsx @@ -1,4 +1,5 @@ import { useState, useCallback, useMemo, useRef, useEffect } from "react"; +import { getVersion } from "@tauri-apps/api/app"; import { FileTextIcon, FolderIcon, @@ -181,13 +182,22 @@ function getFileIcon(file: ProjectFile) { return ; } -// ─── Constants ─── +// ─── App Version (resolved once from Tauri) ─── -const APP_VERSION = "0.0.1"; +let _appVersion = ""; +getVersion().then((v) => { _appVersion = v; }); +function useAppVersion() { + const [version, setVersion] = useState(_appVersion); + useEffect(() => { + if (!version) getVersion().then(setVersion); + }, [version]); + return version || "…"; +} // ─── Sidebar ─── export function Sidebar() { + const appVersion = useAppVersion(); const files = useDocumentStore((s) => s.files); const activeFileId = useDocumentStore((s) => s.activeFileId); const setActiveFile = useDocumentStore((s) => s.setActiveFile); @@ -717,7 +727,7 @@ export function Sidebar() { {/* Footer */}
- ClaudePrism v{APP_VERSION} + ClaudePrism v{appVersion}