Skip to content

Commit fc76bf3

Browse files
authored
Toggle window minwidth depending on panel microsoft#89721 (microsoft#107257)
Change window minwidth depending on panel position. 600px if panel at sides, 400px if panel at bottom.
1 parent 87dd7d6 commit fc76bf3

7 files changed

Lines changed: 54 additions & 9 deletions

File tree

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
1515
import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv';
1616
import { NativeParsedArgs } from 'vs/platform/environment/common/argv';
1717
import product from 'vs/platform/product/common/product';
18-
import { IWindowSettings, MenuBarVisibility, getTitleBarStyle, getMenuBarVisibility, zoomLevelToZoomFactor, INativeWindowConfiguration } from 'vs/platform/windows/common/windows';
18+
import { WindowMinimumSize, IWindowSettings, MenuBarVisibility, getTitleBarStyle, getMenuBarVisibility, zoomLevelToZoomFactor, INativeWindowConfiguration } from 'vs/platform/windows/common/windows';
1919
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
2020
import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform';
2121
import { ICodeWindow, IWindowState, WindowMode } from 'vs/platform/windows/electron-main/windows';
@@ -85,9 +85,6 @@ const enum ReadyState {
8585

8686
export class CodeWindow extends Disposable implements ICodeWindow {
8787

88-
private static readonly MIN_WIDTH = 600;
89-
private static readonly MIN_HEIGHT = 270;
90-
9188
private static readonly MAX_URL_LENGTH = 2 * 1024 * 1024; // https://cs.chromium.org/chromium/src/url/url_constants.cc?l=32
9289

9390
private readonly _onLoad = this._register(new Emitter<void>());
@@ -162,8 +159,8 @@ export class CodeWindow extends Disposable implements ICodeWindow {
162159
x: this.windowState.x,
163160
y: this.windowState.y,
164161
backgroundColor: this.themeMainService.getBackgroundColor(),
165-
minWidth: CodeWindow.MIN_WIDTH,
166-
minHeight: CodeWindow.MIN_HEIGHT,
162+
minWidth: WindowMinimumSize.WIDTH,
163+
minHeight: WindowMinimumSize.HEIGHT,
167164
show: !isFullscreenOrMaximized,
168165
title: product.nameLong,
169166
webPreferences: {

src/vs/platform/native/common/native.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ export interface ICommonNativeHostService {
6767
unmaximizeWindow(): Promise<void>;
6868
minimizeWindow(): Promise<void>;
6969

70+
setMinimumSize(width: number | undefined, height: number | undefined): Promise<void>;
71+
7072
/**
7173
* Make the window focused.
7274
*

src/vs/platform/native/electron-main/nativeHostMainService.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,23 @@ export class NativeHostMainService implements INativeHostMainService {
211211
}
212212
}
213213

214+
async setMinimumSize(windowId: number | undefined, width: number | undefined, height: number | undefined): Promise<void> {
215+
const window = this.windowById(windowId);
216+
if (window) {
217+
const [windowWidth, windowHeight] = window.win.getSize();
218+
const [minWindowWidth, minWindowHeight] = window.win.getMinimumSize();
219+
const [newMinWindowWidth, newMinWindowHeight] = [width ?? minWindowWidth, height ?? minWindowHeight];
220+
const [newWindowWidth, newWindowHeight] = [Math.max(windowWidth, newMinWindowWidth), Math.max(windowHeight, newMinWindowHeight)];
221+
222+
if (minWindowWidth !== newMinWindowWidth || minWindowHeight !== newMinWindowHeight) {
223+
window.win.setMinimumSize(newMinWindowWidth, newMinWindowHeight);
224+
}
225+
if (windowWidth !== newWindowWidth || windowHeight !== newWindowHeight) {
226+
window.win.setSize(newWindowWidth, newWindowHeight);
227+
}
228+
}
229+
}
230+
214231
//#endregion
215232

216233
//#region Dialog

src/vs/platform/windows/common/windows.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ import { LogLevel } from 'vs/platform/log/common/log';
1313
import { ExportData } from 'vs/base/common/performance';
1414
import { ColorScheme } from 'vs/platform/theme/common/theme';
1515

16+
export const WindowMinimumSize = {
17+
WIDTH: 400,
18+
WIDTH_WITH_VERTICAL_PANEL: 600,
19+
HEIGHT: 270
20+
};
21+
1622
export interface IBaseOpenWindowsOptions {
1723
forceReuseWindow?: boolean;
1824
}

src/vs/workbench/browser/layout.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,14 +1307,14 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
13071307

13081308
[titleBar, editorPart, activityBar, panelPart, sideBar, statusBar].forEach((part: Part) => {
13091309
this._register(part.onDidVisibilityChange((visible) => {
1310-
this._onPartVisibilityChange.fire();
13111310
if (part === sideBar) {
13121311
this.setSideBarHidden(!visible, true);
13131312
} else if (part === panelPart) {
13141313
this.setPanelHidden(!visible, true);
13151314
} else if (part === editorPart) {
13161315
this.setEditorHidden(!visible, true);
13171316
}
1317+
this._onPartVisibilityChange.fire();
13181318
}));
13191319
});
13201320

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { IFileService } from 'vs/platform/files/common/files';
1313
import { toResource, IUntitledTextResourceEditorInput, SideBySideEditor, pathsToEditors } from 'vs/workbench/common/editor';
1414
import { IEditorService, IResourceEditorInputType } from 'vs/workbench/services/editor/common/editorService';
1515
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
16-
import { IOpenFileRequest, IWindowsConfiguration, getTitleBarStyle, IAddFoldersRequest, INativeRunActionInWindowRequest, INativeRunKeybindingInWindowRequest, INativeOpenFileRequest } from 'vs/platform/windows/common/windows';
16+
import { WindowMinimumSize, IOpenFileRequest, IWindowsConfiguration, getTitleBarStyle, IAddFoldersRequest, INativeRunActionInWindowRequest, INativeRunKeybindingInWindowRequest, INativeOpenFileRequest } from 'vs/platform/windows/common/windows';
1717
import { ITitleService } from 'vs/workbench/services/title/common/titleService';
1818
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
1919
import { applyZoom } from 'vs/platform/windows/electron-sandbox/window';
@@ -54,7 +54,7 @@ import { INativeHostService } from 'vs/platform/native/electron-sandbox/native';
5454
import { posix, dirname } from 'vs/base/common/path';
5555
import { getBaseLabel } from 'vs/base/common/labels';
5656
import { ITunnelService, extractLocalHostUriMetaDataForPortMapping } from 'vs/platform/remote/common/tunnel';
57-
import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService';
57+
import { IWorkbenchLayoutService, Parts, positionFromString, Position } from 'vs/workbench/services/layout/browser/layoutService';
5858
import { IHostService } from 'vs/workbench/services/host/browser/host';
5959
import { IWorkingCopyService, WorkingCopyCapabilities } from 'vs/workbench/services/workingCopy/common/workingCopyService';
6060
import { AutoSaveMode, IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
@@ -266,6 +266,12 @@ export class NativeWindow extends Disposable {
266266
)(e => this.onDidChangeMaximized(e)));
267267

268268
this.onDidChangeMaximized(this.environmentService.configuration.maximized ?? false);
269+
270+
// Detect panel position to determine minimum width
271+
this._register(this.layoutService.onPanelPositionChange(pos => {
272+
this.onDidPanelPositionChange(positionFromString(pos));
273+
}));
274+
this.onDidPanelPositionChange(this.layoutService.getPanelPosition());
269275
}
270276

271277
private updateDocumentEdited(isDirty = this.workingCopyService.hasDirty): void {
@@ -280,6 +286,22 @@ export class NativeWindow extends Disposable {
280286
this.layoutService.updateWindowMaximizedState(maximized);
281287
}
282288

289+
private getWindowMinimumWidth(panelPosition: Position = this.layoutService.getPanelPosition()): number {
290+
// if panel is on the side, then return the larger minwidth
291+
const panelOnSide = panelPosition === Position.LEFT || panelPosition === Position.RIGHT;
292+
if (panelOnSide) {
293+
return WindowMinimumSize.WIDTH_WITH_VERTICAL_PANEL;
294+
}
295+
else {
296+
return WindowMinimumSize.WIDTH;
297+
}
298+
}
299+
300+
private onDidPanelPositionChange(pos: Position): void {
301+
const minWidth = this.getWindowMinimumWidth(pos);
302+
this.nativeHostService.setMinimumSize(minWidth, undefined);
303+
}
304+
283305
private onDidVisibleEditorsChange(): void {
284306

285307
// Close when empty: check if we should close the window based on the setting

src/vs/workbench/test/electron-browser/workbenchTestServices.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ export class TestNativeHostService implements INativeHostService {
187187
async maximizeWindow(): Promise<void> { }
188188
async unmaximizeWindow(): Promise<void> { }
189189
async minimizeWindow(): Promise<void> { }
190+
async setMinimumSize(width: number | undefined, height: number | undefined): Promise<void> { }
190191
async focusWindow(options?: { windowId?: number | undefined; } | undefined): Promise<void> { }
191192
async showMessageBox(options: Electron.MessageBoxOptions): Promise<Electron.MessageBoxReturnValue> { throw new Error('Method not implemented.'); }
192193
async showSaveDialog(options: Electron.SaveDialogOptions): Promise<Electron.SaveDialogReturnValue> { throw new Error('Method not implemented.'); }

0 commit comments

Comments
 (0)