From eb41bae23b5ac62f8aadb486b4b48ded7601df3e Mon Sep 17 00:00:00 2001 From: ezequielnick <107352853+ezequielnick@users.noreply.github.com> Date: Sat, 9 Aug 2025 21:44:51 +0800 Subject: [PATCH] debug floating window --- src/main/resolve/floatingWindow.ts | 87 +++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 18 deletions(-) diff --git a/src/main/resolve/floatingWindow.ts b/src/main/resolve/floatingWindow.ts index 8d00f25..23e7283 100644 --- a/src/main/resolve/floatingWindow.ts +++ b/src/main/resolve/floatingWindow.ts @@ -5,15 +5,47 @@ import { join } from 'path' import { getAppConfig, patchAppConfig } from '../config' import { applyTheme } from './theme' import { buildContextMenu, showTrayIcon } from './tray' +import { writeFile } from 'fs/promises' +import { logDir } from '../utils/dirs' +import path from 'path' export let floatingWindow: BrowserWindow | null = null +// 悬浮窗日志记录 +async function logFloatingWindow(message: string, error?: any): Promise { + try { + const timestamp = new Date().toISOString() + const logMessage = error + ? `[${timestamp}] [FloatingWindow] ${message}: ${error}\n` + : `[${timestamp}] [FloatingWindow] ${message}\n` + + const logPath = path.join(logDir(), 'floating-window.log') + await writeFile(logPath, logMessage, { flag: 'a' }) + + if (error) { + console.error(`[FloatingWindow] ${message}:`, error) + } else { + console.log(`[FloatingWindow] ${message}`) + } + } catch (logError) { + + console.error('[FloatingWindow] Failed to write log:', logError) + console.log(`[FloatingWindow] Original message: ${message}`, error) + } +} + async function createFloatingWindow(): Promise { try { + await logFloatingWindow('Starting to create floating window...') const floatingWindowState = windowStateKeeper({ file: 'floating-window-state.json' }) + await logFloatingWindow('Window state keeper initialized') const { customTheme = 'default.css' } = await getAppConfig() + await logFloatingWindow(`App config loaded, theme: ${customTheme}`) + + const safeMode = process.env.FLOATING_SAFE_MODE === 'true' + await logFloatingWindow(`Safe mode: ${safeMode}`) const windowOptions: Electron.BrowserWindowConstructorOptions = { width: 120, @@ -21,16 +53,16 @@ async function createFloatingWindow(): Promise { x: floatingWindowState.x, y: floatingWindowState.y, show: false, - frame: false, - alwaysOnTop: true, - resizable: false, - transparent: true, - skipTaskbar: true, - minimizable: false, - maximizable: false, + frame: safeMode ? true : false, + alwaysOnTop: !safeMode, + resizable: safeMode, + transparent: !safeMode, + skipTaskbar: !safeMode, + minimizable: safeMode, + maximizable: safeMode, fullscreenable: false, - closable: false, - backgroundColor: '#00000000', + closable: safeMode, + backgroundColor: safeMode ? '#ffffff' : '#00000000', webPreferences: { preload: join(__dirname, '../preload/index.js'), spellcheck: false, @@ -42,25 +74,32 @@ async function createFloatingWindow(): Promise { // windows 添加兼容性处理 if (process.platform === 'win32') { - windowOptions.hasShadow = false + windowOptions.hasShadow = !safeMode windowOptions.webPreferences!.offscreen = false } + await logFloatingWindow(`Creating BrowserWindow with options: ${JSON.stringify(windowOptions, null, 2)}`) floatingWindow = new BrowserWindow(windowOptions) + await logFloatingWindow('BrowserWindow created successfully') floatingWindowState.manage(floatingWindow) + await logFloatingWindow('Window state management attached') - floatingWindow.webContents.on('render-process-gone', (_, details) => { - console.error('Floating window render process gone:', details.reason) + floatingWindow.webContents.on('render-process-gone', async (_, details) => { + await logFloatingWindow('Render process gone', details.reason) floatingWindow = null }) - floatingWindow.on('ready-to-show', () => { + floatingWindow.on('ready-to-show', async () => { try { + await logFloatingWindow('Window ready to show, applying theme...') applyTheme(customTheme) + await logFloatingWindow('Theme applied, showing window...') floatingWindow?.show() + await logFloatingWindow('Window shown, setting always on top...') floatingWindow?.setAlwaysOnTop(true, 'screen-saver') + await logFloatingWindow('Floating window setup completed successfully') } catch (error) { - console.error('Error in floating window ready-to-show:', error) + await logFloatingWindow('Error in ready-to-show', error) } }) @@ -74,13 +113,22 @@ async function createFloatingWindow(): Promise { } }) + await logFloatingWindow('Loading page...') if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - await floatingWindow.loadURL(`${process.env['ELECTRON_RENDERER_URL']}/floating.html`) + const devUrl = `${process.env['ELECTRON_RENDERER_URL']}/floating.html` + await logFloatingWindow(`Loading dev URL: ${devUrl}`) + await floatingWindow.loadURL(devUrl) } else { - await floatingWindow.loadFile(join(__dirname, '../renderer/floating.html')) + const filePath = join(__dirname, '../renderer/floating.html') + await logFloatingWindow(`Loading file: ${filePath}`) + await floatingWindow.loadFile(filePath) } + await logFloatingWindow('Page loaded successfully') } catch (error) { - console.error('Failed to create floating window:', error) + await logFloatingWindow('Failed to create floating window', error) + if (error instanceof Error) { + await logFloatingWindow(`Error stack: ${error.stack}`) + } floatingWindow = null throw error } @@ -89,13 +137,16 @@ async function createFloatingWindow(): Promise { export async function showFloatingWindow(): Promise { try { if (floatingWindow && !floatingWindow.isDestroyed()) { + await logFloatingWindow('Showing existing floating window') floatingWindow.show() } else { + await logFloatingWindow('Creating new floating window') await createFloatingWindow() } } catch (error) { - console.error('Failed to show floating window:', error) + await logFloatingWindow('Failed to show floating window', error) await patchAppConfig({ showFloatingWindow: false }) + await logFloatingWindow('Disabled floating window in config due to error') throw error } }