@@ -6,8 +6,14 @@ const ZOOM_MIN = -3;
66const ZOOM_MAX = 3 ;
77
88interface ZoomWebContents {
9- getZoomLevel ( ) : number ;
10- on ( event : "did-finish-load" | "zoom-changed" , listener : ( ) => void ) : void ;
9+ on ( event : "did-finish-load" , listener : ( ) => void ) : void ;
10+ on (
11+ event : "zoom-changed" ,
12+ listener : (
13+ event : { preventDefault ( ) : void } ,
14+ zoomDirection : "in" | "out" ,
15+ ) => void ,
16+ ) : void ;
1117 setZoomLevel ( level : number ) : void ;
1218}
1319
@@ -25,8 +31,10 @@ interface ZoomWindow {
2531}
2632
2733interface ZoomState {
34+ currentZoomLevel : number ;
2835 deferredActions : Array < ( ) => void > ;
29- nativeZoomTimeout : ReturnType < typeof setTimeout > | null ;
36+ wheelZoomDelta : number ;
37+ wheelZoomTimeout : ReturnType < typeof setTimeout > | null ;
3038}
3139
3240const zoomStates = new WeakMap < ZoomWindow , ZoomState > ( ) ;
@@ -39,9 +47,13 @@ function getSavedZoomLevel(): number {
3947 return clampZoomLevel ( windowStateStore . get ( "zoomLevel" , 0 ) ) ;
4048}
4149
42- function runAfterNativeZoom ( window : ZoomWindow , action : ( ) => void ) : void {
50+ function getCurrentZoomLevel ( window : ZoomWindow ) : number {
51+ return zoomStates . get ( window ) ?. currentZoomLevel ?? getSavedZoomLevel ( ) ;
52+ }
53+
54+ function runAfterWheelZoom ( window : ZoomWindow , action : ( ) => void ) : void {
4355 const state = zoomStates . get ( window ) ;
44- if ( ! state ?. nativeZoomTimeout ) {
56+ if ( ! state ?. wheelZoomTimeout ) {
4557 action ( ) ;
4658 return ;
4759 }
@@ -51,6 +63,8 @@ function runAfterNativeZoom(window: ZoomWindow, action: () => void): void {
5163
5264export function setWindowZoom ( window : ZoomWindow , level : number ) : void {
5365 const nextLevel = clampZoomLevel ( level ) ;
66+ const state = zoomStates . get ( window ) ;
67+ if ( state ) state . currentZoomLevel = nextLevel ;
5468 window . webContents . setZoomLevel ( nextLevel ) ;
5569 saveZoomLevel ( nextLevel ) ;
5670}
@@ -59,22 +73,25 @@ export function adjustWindowZoom(
5973 window : ZoomWindow ,
6074 delta : number | "reset" ,
6175) : void {
62- runAfterNativeZoom ( window , ( ) => {
63- const nextLevel = delta === "reset" ? 0 : getSavedZoomLevel ( ) + delta ;
76+ runAfterWheelZoom ( window , ( ) => {
77+ const nextLevel =
78+ delta === "reset" ? 0 : getCurrentZoomLevel ( window ) + delta ;
6479 setWindowZoom ( window , nextLevel ) ;
6580 } ) ;
6681}
6782
6883export function restoreWindowZoom ( window : ZoomWindow ) : void {
69- runAfterNativeZoom ( window , ( ) => {
70- window . webContents . setZoomLevel ( getSavedZoomLevel ( ) ) ;
84+ runAfterWheelZoom ( window , ( ) => {
85+ window . webContents . setZoomLevel ( getCurrentZoomLevel ( window ) ) ;
7186 } ) ;
7287}
7388
7489export function setupWindowZoom ( window : ZoomWindow ) : void {
7590 const state : ZoomState = {
91+ currentZoomLevel : getSavedZoomLevel ( ) ,
7692 deferredActions : [ ] ,
77- nativeZoomTimeout : null ,
93+ wheelZoomDelta : 0 ,
94+ wheelZoomTimeout : null ,
7895 } ;
7996 let restoreTimeout : ReturnType < typeof setTimeout > | null = null ;
8097 zoomStates . set ( window , state ) ;
@@ -88,11 +105,14 @@ export function setupWindowZoom(window: ZoomWindow): void {
88105 } ;
89106
90107 window . webContents . on ( "did-finish-load" , ( ) => restoreWindowZoom ( window ) ) ;
91- window . webContents . on ( "zoom-changed" , ( ) => {
92- if ( state . nativeZoomTimeout ) clearTimeout ( state . nativeZoomTimeout ) ;
93- state . nativeZoomTimeout = setTimeout ( ( ) => {
94- state . nativeZoomTimeout = null ;
95- saveZoomLevel ( clampZoomLevel ( window . webContents . getZoomLevel ( ) ) ) ;
108+ window . webContents . on ( "zoom-changed" , ( event , zoomDirection ) => {
109+ event . preventDefault ( ) ;
110+ state . wheelZoomDelta += zoomDirection === "in" ? ZOOM_STEP : - ZOOM_STEP ;
111+ state . wheelZoomTimeout ??= setTimeout ( ( ) => {
112+ const nextLevel = state . currentZoomLevel + state . wheelZoomDelta ;
113+ state . wheelZoomDelta = 0 ;
114+ state . wheelZoomTimeout = null ;
115+ setWindowZoom ( window , nextLevel ) ;
96116 const deferredActions = state . deferredActions . splice ( 0 ) ;
97117 for ( const action of deferredActions ) action ( ) ;
98118 } , 0 ) ;
0 commit comments