mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-10-25 17:54:34 +08:00
feat(electron): add persistent UI scale setting
This commit is contained in:
1 parent
220f9902be
commit
eadadda071
21 files changed
+136
-4
No files matched your search
@@ -4,7 +4,8 @@
|
||||
|
||||
import { ipcMain, app, dialog, clipboard, shell, nativeTheme } from 'electron'
|
||||
import * as fs from 'fs/promises'
|
||||
import { loadConfig, setConfigField } from '@openchatlab/config'
|
||||
import { desktopConfigSchema, loadConfig, setConfigField } from '@openchatlab/config'
|
||||
import { appLogger } from '@openchatlab/node-runtime'
|
||||
import type { DesktopCloseBehavior } from '@openchatlab/shared-types'
|
||||
import type { IpcContext } from './types'
|
||||
import { simulateUpdateDialog, manualCheckForUpdates } from '../update/manager'
|
||||
@@ -224,6 +225,26 @@ export function registerWindowHandlers(ctx: IpcContext): void {
|
||||
}
|
||||
})
|
||||
|
||||
// ==================== Desktop UI scale ====================
|
||||
ipcMain.handle('app:getDesktopUiScale', () => loadConfig().desktop.ui_scale)
|
||||
|
||||
ipcMain.handle('app:setDesktopUiScale', (_, scale: number) => {
|
||||
const parsed = desktopConfigSchema.shape.ui_scale.safeParse(scale)
|
||||
if (typeof scale !== 'number' || !parsed.success) {
|
||||
return { success: false, error: 'Unsupported desktop UI scale' }
|
||||
}
|
||||
|
||||
try {
|
||||
setConfigField('desktop.ui_scale', String(parsed.data))
|
||||
win.webContents.setZoomFactor(parsed.data)
|
||||
appLogger.info('window', `Desktop UI scale changed to ${parsed.data}`)
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
appLogger.error('window', 'Failed to change desktop UI scale', error)
|
||||
return { success: false, error: error instanceof Error ? error.message : String(error) }
|
||||
}
|
||||
})
|
||||
|
||||
// ==================== Windows 关闭行为 ====================
|
||||
ipcMain.handle('app:getDesktopCloseBehavior', () => {
|
||||
return loadConfig().desktop.close_behavior
|
||||
|
||||
@@ -28,6 +28,7 @@ export async function createMainWindow(paths: MainWindowPaths): Promise<BrowserW
|
||||
preload: paths.preloadPath,
|
||||
sandbox: false,
|
||||
devTools: true,
|
||||
zoomFactor: loadConfig().desktop.ui_scale,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -100,6 +101,8 @@ function handleWindowsClose(win: BrowserWindow): void {
|
||||
|
||||
function registerMainWindowEvents(win: BrowserWindow): void {
|
||||
win.webContents.on('did-finish-load', () => {
|
||||
// Reapply the preference after navigation, overriding Chromium's per-origin zoom cache.
|
||||
win.webContents.setZoomFactor(loadConfig().desktop.ui_scale)
|
||||
setTimeout(() => {
|
||||
currentMainWindow?.webContents.send('app-started')
|
||||
}, 500)
|
||||
|
||||
@@ -123,5 +123,9 @@ export const extendedApi = {
|
||||
setDesktopCloseBehavior: (behavior: DesktopCloseBehavior): Promise<{ success: boolean; error?: string }> => {
|
||||
return ipcRenderer.invoke('app:setDesktopCloseBehavior', behavior)
|
||||
},
|
||||
getDesktopUiScale: (): Promise<number> => ipcRenderer.invoke('app:getDesktopUiScale'),
|
||||
setDesktopUiScale: (scale: number): Promise<{ success: boolean; error?: string }> => {
|
||||
return ipcRenderer.invoke('app:setDesktopUiScale', scale)
|
||||
},
|
||||
},
|
||||
}
|
||||
Vendored
+2
@@ -194,6 +194,8 @@ interface Api {
|
||||
setOpenAtLogin: (enabled: boolean) => Promise<{ success: boolean; error?: string }>
|
||||
getDesktopCloseBehavior: () => Promise<DesktopCloseBehavior>
|
||||
setDesktopCloseBehavior: (behavior: DesktopCloseBehavior) => Promise<{ success: boolean; error?: string }>
|
||||
getDesktopUiScale: () => Promise<number>
|
||||
setDesktopUiScale: (scale: number) => Promise<{ success: boolean; error?: string }>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user