From 6aba0dcb03551e10173daefaf36841545e435c7e Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Thu, 6 Aug 2026 05:25:38 +0800 Subject: [PATCH] fix(stage-tamagotchi): cleanup tray related resources before app quit --- apps/stage-tamagotchi/src/main/tray/index.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/stage-tamagotchi/src/main/tray/index.ts b/apps/stage-tamagotchi/src/main/tray/index.ts index 66e12e005..8cd3b9aa1 100644 --- a/apps/stage-tamagotchi/src/main/tray/index.ts +++ b/apps/stage-tamagotchi/src/main/tray/index.ts @@ -102,7 +102,6 @@ export function setupTray(params: { trayImage.setTemplateImage(isMacOS) const appTray = new Tray(trayImage) - onAppBeforeQuit(() => appTray.destroy()) const rebuildContextMenu = debounce((): void => { if (isRendererUnavailable(params.mainWindow)) { @@ -225,16 +224,30 @@ export function setupTray(params: { params.mainWindow.on('resize', rebuildContextMenu) params.mainWindow.on('move', rebuildContextMenu) - params.captionWindow.onVisibilityChanged(rebuildContextMenu) + const visibilityChangeUnListener = params.captionWindow.onVisibilityChanged(rebuildContextMenu) rebuildContextMenu() - effect(() => { + const stopLocaleEffect = effect(() => { const locale = params.i18n.locale as (() => string | LocaleDetector | undefined) locale() rebuildContextMenu() }) + onAppBeforeQuit(() => { + // Stop every menu rebuild source before canceling its pending trailing call. + // The tray must remain alive until no callback can reach it. + params.mainWindow.off('resize', rebuildContextMenu) + params.mainWindow.off('move', rebuildContextMenu) + + visibilityChangeUnListener() + stopLocaleEffect() + + rebuildContextMenu.cancel() + + appTray.destroy() + }) + appTray.setToolTip('Project AIRI') appTray.addListener('click', () => toggleWindowShow(params.mainWindow))