Skip to content

Commit c29a6e1

Browse files
committed
aux window - allow a per-window zoom level (#185836)
1 parent 3754487 commit c29a6e1

File tree

23 files changed

+264
-91
lines changed

23 files changed

+264
-91
lines changed

src/vs/base/browser/browser.ts

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,33 @@ class WindowManager {
1313

1414
// --- Zoom Level
1515

16-
private _zoomLevel: number = 0;
16+
private readonly mapWindowIdToZoomLevel = new Map<number, number>();
1717

18-
getZoomLevel(): number {
19-
return this._zoomLevel;
18+
private readonly _onDidChangeZoomLevel = new Emitter<number>();
19+
readonly onDidChangeZoomLevel = this._onDidChangeZoomLevel.event;
20+
21+
getZoomLevel(targetWindow: Window): number {
22+
return this.mapWindowIdToZoomLevel.get(this.getWindowId(targetWindow)) ?? 0;
2023
}
21-
setZoomLevel(zoomLevel: number): void {
22-
if (this._zoomLevel === zoomLevel) {
24+
setZoomLevel(zoomLevel: number, targetWindow: Window): void {
25+
if (this.getZoomLevel(targetWindow) === zoomLevel) {
2326
return;
2427
}
25-
this._zoomLevel = zoomLevel;
28+
29+
const targetWindowId = this.getWindowId(targetWindow);
30+
this.mapWindowIdToZoomLevel.set(targetWindowId, zoomLevel);
31+
this._onDidChangeZoomLevel.fire(targetWindowId);
2632
}
2733

2834
// --- Zoom Factor
2935

30-
private _zoomFactor: number = 1;
36+
private readonly mapWindowIdToZoomFactor = new Map<number, number>();
3137

32-
getZoomFactor(): number {
33-
return this._zoomFactor;
38+
getZoomFactor(targetWindow: Window): number {
39+
return this.mapWindowIdToZoomFactor.get(this.getWindowId(targetWindow)) ?? 1;
3440
}
35-
setZoomFactor(zoomFactor: number): void {
36-
this._zoomFactor = zoomFactor;
41+
setZoomFactor(zoomFactor: number, targetWindow: Window): void {
42+
this.mapWindowIdToZoomFactor.set(this.getWindowId(targetWindow), zoomFactor);
3743
}
3844

3945
// --- Fullscreen
@@ -169,19 +175,20 @@ export function addMatchMediaChangeListener(query: string | MediaQueryList, call
169175
export const PixelRatio = new PixelRatioFacade();
170176

171177
/** A zoom index, e.g. 1, 2, 3 */
172-
export function setZoomLevel(zoomLevel: number): void {
173-
WindowManager.INSTANCE.setZoomLevel(zoomLevel);
178+
export function setZoomLevel(zoomLevel: number, targetWindow: Window): void {
179+
WindowManager.INSTANCE.setZoomLevel(zoomLevel, targetWindow);
174180
}
175-
export function getZoomLevel(): number {
176-
return WindowManager.INSTANCE.getZoomLevel();
181+
export function getZoomLevel(targetWindow: Window): number {
182+
return WindowManager.INSTANCE.getZoomLevel(targetWindow);
177183
}
184+
export const onDidChangeZoomLevel = WindowManager.INSTANCE.onDidChangeZoomLevel;
178185

179186
/** The zoom scale for an index, e.g. 1, 1.2, 1.4 */
180-
export function getZoomFactor(): number {
181-
return WindowManager.INSTANCE.getZoomFactor();
187+
export function getZoomFactor(targetWindow: Window): number {
188+
return WindowManager.INSTANCE.getZoomFactor(targetWindow);
182189
}
183-
export function setZoomFactor(zoomFactor: number): void {
184-
WindowManager.INSTANCE.setZoomFactor(zoomFactor);
190+
export function setZoomFactor(zoomFactor: number, targetWindow: Window): void {
191+
WindowManager.INSTANCE.setZoomFactor(zoomFactor, targetWindow);
185192
}
186193

187194
export function setFullscreen(fullscreen: boolean, targetWindow: Window): void {

src/vs/base/browser/ui/scrollbar/scrollableElement.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ export class MouseWheelClassifier {
8787
}
8888

8989
public acceptStandardWheelEvent(e: StandardWheelEvent): void {
90-
const osZoomFactor = dom.getWindow(e.browserEvent).devicePixelRatio / getZoomFactor();
90+
const targetWindow = dom.getWindow(e.browserEvent);
91+
const osZoomFactor = targetWindow.devicePixelRatio / getZoomFactor(targetWindow);
9192
if (platform.isWindows || platform.isLinux) {
9293
// On Windows and Linux, the incoming delta events are multiplied with the OS zoom factor.
9394
// The OS zoom factor can be reverse engineered by using the device pixel ratio and the configured zoom factor into account.

src/vs/code/electron-main/app.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,13 @@ export class CodeApplication extends Disposable {
516516

517517
validatedIpcMain.on('vscode:reloadWindow', event => event.sender.reload());
518518

519+
validatedIpcMain.handle('vscode:notifyZoomLevel', async (event, zoomLevel: number | undefined) => {
520+
const window = this.windowsMainService?.getWindowById(event.sender.id);
521+
if (window) {
522+
window.notifyZoomLevel(zoomLevel);
523+
}
524+
});
525+
519526
//#endregion
520527
}
521528

src/vs/code/electron-sandbox/issue/issueReporterService.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export class IssueReporter extends Disposable {
127127

128128
this.setUpTypes();
129129
this.setEventHandlers();
130-
applyZoom(configuration.data.zoomLevel);
130+
applyZoom(configuration.data.zoomLevel, mainWindow);
131131
this.applyStyles(configuration.data.styles);
132132
this.handleExtensionData(configuration.data.enabledExtensions);
133133
this.updateExperimentsInfo(configuration.data.experiments);
@@ -435,12 +435,12 @@ export class IssueReporter extends Disposable {
435435

436436
// Cmd/Ctrl + zooms in
437437
if (cmdOrCtrlKey && e.keyCode === 187) {
438-
zoomIn();
438+
zoomIn(mainWindow);
439439
}
440440

441441
// Cmd/Ctrl - zooms out
442442
if (cmdOrCtrlKey && e.keyCode === 189) {
443-
zoomOut();
443+
zoomOut(mainWindow);
444444
}
445445

446446
// With latest electron upgrade, cmd+a is no longer propagating correctly for inputs in this window on mac

src/vs/code/electron-sandbox/processExplorer/processExplorerMain.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,12 @@ class ProcessExplorer {
288288

289289
// Cmd/Ctrl + zooms in
290290
if (cmdOrCtrlKey && e.keyCode === 187) {
291-
zoomIn();
291+
zoomIn(mainWindow);
292292
}
293293

294294
// Cmd/Ctrl - zooms out
295295
if (cmdOrCtrlKey && e.keyCode === 189) {
296-
zoomOut();
296+
zoomOut(mainWindow);
297297
}
298298
};
299299
}
@@ -595,7 +595,7 @@ export function startup(configuration: ProcessExplorerWindowConfiguration): void
595595
const platformClass = configuration.data.platform === 'win32' ? 'windows' : configuration.data.platform === 'linux' ? 'linux' : 'mac';
596596
mainWindow.document.body.classList.add(platformClass); // used by our fonts
597597
createCodiconStyleSheet();
598-
applyZoom(configuration.data.zoomLevel);
598+
applyZoom(configuration.data.zoomLevel, mainWindow);
599599

600600
new ProcessExplorer(configuration.windowId, configuration.data);
601601
}

src/vs/platform/window/common/window.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ export interface INativeWindowConfiguration extends IWindowConfiguration, Native
347347
colorScheme: IColorScheme;
348348
autoDetectHighContrast?: boolean;
349349
autoDetectColorScheme?: boolean;
350+
isCustomZoomLevel?: boolean;
350351

351352
perfMarks: PerformanceMark[];
352353

src/vs/platform/window/electron-main/window.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ export interface ICodeWindow extends IBaseWindow {
8181

8282
updateTouchBar(items: ISerializableCommandAction[][]): void;
8383

84+
notifyZoomLevel(zoomLevel: number | undefined): void;
85+
8486
serializeWindowState(): IWindowState;
8587
}
8688

@@ -131,6 +133,7 @@ export interface IWindowState {
131133
x?: number;
132134
y?: number;
133135
mode?: WindowMode;
136+
zoomLevel?: number;
134137
readonly display?: number;
135138
}
136139

src/vs/platform/window/electron-sandbox/window.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,35 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { getZoomLevel, setZoomFactor, setZoomLevel } from 'vs/base/browser/browser';
7-
import { getWindows } from 'vs/base/browser/dom';
7+
import { getActiveWindow, getWindows } from 'vs/base/browser/dom';
88
import { mainWindow } from 'vs/base/browser/window';
99
import { ISandboxGlobals, ipcRenderer, webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals';
1010
import { zoomLevelToZoomFactor } from 'vs/platform/window/common/window';
1111

12+
export enum ApplyZoomTarget {
13+
ACTIVE_WINDOW = 1,
14+
ALL_WINDOWS
15+
}
16+
1217
/**
1318
* Apply a zoom level to the window. Also sets it in our in-memory
1419
* browser helper so that it can be accessed in non-electron layers.
1520
*/
16-
export function applyZoom(zoomLevel: number): void {
17-
for (const { window } of getWindows()) {
18-
getGlobals(window)?.webFrame?.setZoomLevel(zoomLevel);
21+
export function applyZoom(zoomLevel: number, target: ApplyZoomTarget | Window): void {
22+
const targetWindows: Window[] = [];
23+
if (target === ApplyZoomTarget.ACTIVE_WINDOW) {
24+
targetWindows.push(getActiveWindow());
25+
} else if (target === ApplyZoomTarget.ALL_WINDOWS) {
26+
targetWindows.push(...Array.from(getWindows()).map(({ window }) => window));
27+
} else {
28+
targetWindows.push(target);
29+
}
30+
31+
for (const targetWindow of targetWindows) {
32+
getGlobals(targetWindow)?.webFrame?.setZoomLevel(zoomLevel);
33+
setZoomFactor(zoomLevelToZoomFactor(zoomLevel), targetWindow);
34+
setZoomLevel(zoomLevel, targetWindow);
1935
}
20-
setZoomFactor(zoomLevelToZoomFactor(zoomLevel));
21-
setZoomLevel(zoomLevel);
2236
}
2337

2438
function getGlobals(win: Window): ISandboxGlobals | undefined {
@@ -36,10 +50,10 @@ function getGlobals(win: Window): ISandboxGlobals | undefined {
3650
return undefined;
3751
}
3852

39-
export function zoomIn(): void {
40-
applyZoom(getZoomLevel() + 1);
53+
export function zoomIn(target: ApplyZoomTarget | Window): void {
54+
applyZoom(getZoomLevel(typeof target === 'number' ? getActiveWindow() : target) + 1, target);
4155
}
4256

43-
export function zoomOut(): void {
44-
applyZoom(getZoomLevel() - 1);
57+
export function zoomOut(target: ApplyZoomTarget | Window): void {
58+
applyZoom(getZoomLevel(typeof target === 'number' ? getActiveWindow() : target) - 1, target);
4559
}

src/vs/platform/windows/electron-main/windowImpl.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,8 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
478478
private currentHttpProxy: string | undefined = undefined;
479479
private currentNoProxy: string | undefined = undefined;
480480

481+
private customZoomLevel: number | undefined = undefined;
482+
481483
private readonly configObjectUrl = this._register(this.protocolMainService.createIPCObjectUrl<INativeWindowConfiguration>());
482484
private pendingLoadConfig: INativeWindowConfiguration | undefined;
483485
private wasLoaded = false;
@@ -1050,6 +1052,11 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
10501052
configuration.fullscreen = this.isFullScreen;
10511053
configuration.maximized = this._win.isMaximized();
10521054
configuration.partsSplash = this.themeMainService.getWindowSplash();
1055+
configuration.zoomLevel = this.getZoomLevel();
1056+
configuration.isCustomZoomLevel = typeof this.customZoomLevel === 'number';
1057+
if (configuration.isCustomZoomLevel && configuration.partsSplash) {
1058+
configuration.partsSplash.zoomLevel = configuration.zoomLevel;
1059+
}
10531060

10541061
// Update with latest perf marks
10551062
mark('code/willOpenNewWindow');
@@ -1149,7 +1156,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
11491156

11501157
const defaultState = defaultWindowState();
11511158

1152-
const res = {
1159+
return {
11531160
mode: WindowMode.Fullscreen,
11541161
display: display ? display.id : undefined,
11551162

@@ -1161,10 +1168,9 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
11611168
width: this.windowState.width || defaultState.width,
11621169
height: this.windowState.height || defaultState.height,
11631170
x: this.windowState.x || 0,
1164-
y: this.windowState.y || 0
1171+
y: this.windowState.y || 0,
1172+
zoomLevel: this.customZoomLevel
11651173
};
1166-
1167-
return res;
11681174
}
11691175

11701176
const state: IWindowState = Object.create(null);
@@ -1199,6 +1205,8 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
11991205
state.height = bounds.height;
12001206
}
12011207

1208+
state.zoomLevel = this.customZoomLevel;
1209+
12021210
return state;
12031211
}
12041212

@@ -1207,6 +1215,11 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
12071215

12081216
let hasMultipleDisplays = false;
12091217
if (state) {
1218+
1219+
// Window zoom
1220+
this.customZoomLevel = state.zoomLevel;
1221+
1222+
// Window dimensions
12101223
try {
12111224
const displays = screen.getAllDisplays();
12121225
hasMultipleDisplays = displays.length > 1;
@@ -1443,6 +1456,19 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
14431456
}
14441457
}
14451458

1459+
notifyZoomLevel(zoomLevel: number | undefined): void {
1460+
this.customZoomLevel = zoomLevel;
1461+
}
1462+
1463+
private getZoomLevel(): number | undefined {
1464+
if (typeof this.customZoomLevel === 'number') {
1465+
return this.customZoomLevel;
1466+
}
1467+
1468+
const windowSettings = this.configurationService.getValue<IWindowSettings | undefined>('window');
1469+
return windowSettings?.zoomLevel;
1470+
}
1471+
14461472
close(): void {
14471473
this._win?.close();
14481474
}

src/vs/platform/windows/electron-main/windows.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export function defaultBrowserWindowOptions(accessor: ServicesAccessor, windowSt
132132
webPreferences: {
133133
enableWebSQL: false,
134134
spellcheck: false,
135-
zoomFactor: zoomLevelToZoomFactor(windowSettings?.zoomLevel),
135+
zoomFactor: zoomLevelToZoomFactor(windowState?.zoomLevel ?? windowSettings?.zoomLevel),
136136
autoplayPolicy: 'user-gesture-required',
137137
// Enable experimental css highlight api https://chromestatus.com/feature/5436441440026624
138138
// Refs https://github.com/microsoft/vscode/issues/140098

0 commit comments

Comments
 (0)