提交 ce94c833 编写于 作者: B Benjamin Pasero

workaround #74872

上级 3e99f28e
......@@ -113,7 +113,8 @@ export class CodeWindow extends Disposable implements ICodeWindow {
private createBrowserWindow(config: IWindowCreationOptions): void {
// Load window state
this.windowState = this.restoreWindowState(config.state);
const [state, hasMultipleDisplays] = this.restoreWindowState(config.state);
this.windowState = state;
// in case we are maximized or fullscreen, only show later after the call to maximize/fullscreen (see below)
const isFullscreenOrMaximized = (this.windowState.mode === WindowMode.Maximized || this.windowState.mode === WindowMode.Fullscreen);
......@@ -176,6 +177,20 @@ export class CodeWindow extends Disposable implements ICodeWindow {
this._win.setSheetOffset(22); // offset dialogs by the height of the custom title bar if we have any
}
// TODO@Ben (Electron 4 regression): when running on multiple displays where the target display
// to open the window has a larger resolution than the primary display, the window will not size
// correctly unless we set the bounds again (https://github.com/microsoft/vscode/issues/74872)
if (isMacintosh && hasMultipleDisplays) {
if ([this.windowState.width, this.windowState.height, this.windowState.x, this.windowState.y].every(value => typeof value === 'number')) {
this._win.setBounds({
width: this.windowState.width!,
height: this.windowState.height!,
x: this.windowState.x!,
y: this.windowState.y!
});
}
}
if (isFullscreenOrMaximized) {
this._win.maximize();
......@@ -679,18 +694,23 @@ export class CodeWindow extends Disposable implements ICodeWindow {
return state;
}
private restoreWindowState(state?: IWindowState): IWindowState {
private restoreWindowState(state?: IWindowState): [IWindowState, boolean? /* has multiple displays */] {
let hasMultipleDisplays = false;
if (state) {
try {
state = this.validateWindowState(state);
const displays = screen.getAllDisplays();
hasMultipleDisplays = displays.length > 1;
state = this.validateWindowState(state, displays);
} catch (err) {
this.logService.warn(`Unexpected error validating window state: ${err}\n${err.stack}`); // somehow display API can be picky about the state to validate
}
}
return state || defaultWindowState();
return [state || defaultWindowState(), hasMultipleDisplays];
}
private validateWindowState(state: IWindowState): IWindowState | undefined {
private validateWindowState(state: IWindowState, displays: Display[]): IWindowState | undefined {
if (typeof state.x !== 'number'
|| typeof state.y !== 'number'
|| typeof state.width !== 'number'
......@@ -703,8 +723,6 @@ export class CodeWindow extends Disposable implements ICodeWindow {
return undefined;
}
const displays = screen.getAllDisplays();
// Single Monitor: be strict about x/y positioning
if (displays.length === 1) {
const displayWorkingArea = this.getWorkingArea(displays[0]);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册