mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-15 14:22:43 +00:00
Windows drops webContents zoom on minimize/restore, so the UI snapped back to 100% while Settings still read 125%. Zoom was only reasserted on the main window's did-finish-load, never on show/restore and never for session windows. Reassert the persisted level on show/restore + first load, wired once in wireCommonWindowHandlers so the main window and secondary session windows share it. The pet overlay opts out (zoom:false): it sizes its own OS window to fit the sprite in unzoomed CSS px and has its own Alt+wheel scale, so inheriting the global zoom would render the mascot larger than its window and crop it (and it shares the renderer origin's zoom localStorage key). Salvages #61245; keeps its pure-helper tests and adds a scope assertion. Co-authored-by: HexLab98 <liruixinch@outlook.com>
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
/**
|
|
* Pure helpers for window zoom. The main process owns webContents.setZoomLevel,
|
|
* so the menu items, the Ctrl/Cmd shortcuts, and the settings UI all funnel
|
|
* through this one clamped scale. Percent is the user-facing unit (100 = the
|
|
* default size); Chromium's internal unit is the zoom level, where
|
|
* factor = 1.2 ^ level.
|
|
*/
|
|
|
|
export const ZOOM_STORAGE_KEY = 'hermes:desktop:zoomLevel'
|
|
|
|
const ZOOM_FACTOR_BASE = 1.2
|
|
const MIN_ZOOM_LEVEL = -9
|
|
const MAX_ZOOM_LEVEL = 9
|
|
|
|
export function clampZoomLevel(value) {
|
|
if (!Number.isFinite(value)) {
|
|
return 0
|
|
}
|
|
|
|
return Math.min(Math.max(value, MIN_ZOOM_LEVEL), MAX_ZOOM_LEVEL)
|
|
}
|
|
|
|
export function zoomLevelToPercent(level) {
|
|
return Math.round(Math.pow(ZOOM_FACTOR_BASE, clampZoomLevel(level)) * 100)
|
|
}
|
|
|
|
export function percentToZoomLevel(percent) {
|
|
if (!Number.isFinite(percent) || percent <= 0) {
|
|
return 0
|
|
}
|
|
|
|
return clampZoomLevel(Math.log(percent / 100) / Math.log(ZOOM_FACTOR_BASE))
|
|
}
|
|
|
|
// Chromium on Windows can drop webContents zoom when a BrowserWindow is minimized
|
|
// and restored. Re-apply the persisted level on these lifecycle transitions.
|
|
export const ZOOM_REASSERT_WINDOW_EVENTS = ['show', 'restore']
|
|
|
|
export function installZoomReassertOnWindowEvents(win, reassert) {
|
|
if (!win?.on) {
|
|
return
|
|
}
|
|
|
|
for (const event of ZOOM_REASSERT_WINDOW_EVENTS) {
|
|
win.on(event, () => {
|
|
if (win.isDestroyed?.()) {
|
|
return
|
|
}
|
|
reassert()
|
|
})
|
|
}
|
|
}
|