Align fullscreen return button with project actions

This commit is contained in:
鲨鱼辣椒
2026-09-30 00:58:46 +08:00
parent 80b0cb99a8
commit 343f88ce59
9 changed files with 203 additions and 7 deletions

View File

@@ -6,6 +6,7 @@ import { app, BrowserWindow, dialog, ipcMain, shell } from 'electron';
import { registerHostApiProxyHandlers } from './ipc/host-api-proxy';
import { registerTranscriptExportHandler } from './ipc/transcript-export';
import { registerConversationLinkContextMenuHandler } from './ipc/conversation-link-context-menu';
import { registerWindowFullscreenHandlers } from './ipc/window-fullscreen';
import { applyProxySettings } from './proxy';
import { syncLaunchAtStartupSettingFromStore } from './launch-at-startup';
import { getAllSettings, getSetting, resetSettings, setSetting, type AppSettings } from '../utils/store';
@@ -254,6 +255,7 @@ export function registerIpcHandlers(
if (!window || window.isDestroyed()) throw new Error('Main window is unavailable');
return window;
};
const bindWindowFullscreen = registerWindowFullscreenHandlers(requireRequestWindow);
registerHostApiProxyHandlers(hostApiContext);
registerTranscriptExportHandler(getMainWindow);
registerConversationLinkContextMenuHandler(getMainWindow);
@@ -272,7 +274,10 @@ export function registerIpcHandlers(
return leases;
};
const bindWindow = (window: BrowserWindow): void => {
if (!window.isDestroyed() && !window.webContents.isDestroyed()) bindRenderer(window.webContents);
if (!window.isDestroyed() && !window.webContents.isDestroyed()) {
bindRenderer(window.webContents);
bindWindowFullscreen(window);
}
};
const initialWindow = getMainWindow();
if (initialWindow) bindWindow(initialWindow);

View File

@@ -0,0 +1,20 @@
import { ipcMain, type BrowserWindow } from 'electron';
export function registerWindowFullscreenHandlers(
requireWindow: (event: Electron.IpcMainInvokeEvent) => BrowserWindow,
): (window: BrowserWindow) => void {
ipcMain.handle('window:isFullScreen', (event) => requireWindow(event).isFullScreen());
const boundWindows = new WeakSet<BrowserWindow>();
return (window: BrowserWindow): void => {
if (window.isDestroyed() || window.webContents.isDestroyed() || boundWindows.has(window)) return;
boundWindows.add(window);
const notify = (fullscreen: boolean): void => {
if (window.isDestroyed() || window.webContents.isDestroyed()) return;
window.webContents.send('window:fullscreen-changed', fullscreen);
};
window.on('enter-full-screen', () => notify(true));
window.on('leave-full-screen', () => notify(false));
};
}

View File

@@ -33,6 +33,7 @@ const validInvokeChannels = [
'window:maximize',
'window:close',
'window:isMaximized',
'window:isFullScreen',
'settings:get',
'settings:set',
'settings:setMany',
@@ -64,6 +65,7 @@ const validInvokeChannels = [
];
const validEventChannels = [
'window:fullscreen-changed',
'navigate',
'cloud-agent-link',
'update:status-changed',