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

workaround #74872

上级 3e99f28e
...@@ -113,7 +113,8 @@ export class CodeWindow extends Disposable implements ICodeWindow { ...@@ -113,7 +113,8 @@ export class CodeWindow extends Disposable implements ICodeWindow {
private createBrowserWindow(config: IWindowCreationOptions): void { private createBrowserWindow(config: IWindowCreationOptions): void {
// Load window state // 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) // 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); const isFullscreenOrMaximized = (this.windowState.mode === WindowMode.Maximized || this.windowState.mode === WindowMode.Fullscreen);
...@@ -176,6 +177,20 @@ export class CodeWindow extends Disposable implements ICodeWindow { ...@@ -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 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) { if (isFullscreenOrMaximized) {
this._win.maximize(); this._win.maximize();
...@@ -679,18 +694,23 @@ export class CodeWindow extends Disposable implements ICodeWindow { ...@@ -679,18 +694,23 @@ export class CodeWindow extends Disposable implements ICodeWindow {
return state; return state;
} }
private restoreWindowState(state?: IWindowState): IWindowState { private restoreWindowState(state?: IWindowState): [IWindowState, boolean? /* has multiple displays */] {
let hasMultipleDisplays = false;
if (state) { if (state) {
try { try {
state = this.validateWindowState(state); const displays = screen.getAllDisplays();
hasMultipleDisplays = displays.length > 1;
state = this.validateWindowState(state, displays);
} catch (err) { } 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 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' if (typeof state.x !== 'number'
|| typeof state.y !== 'number' || typeof state.y !== 'number'
|| typeof state.width !== 'number' || typeof state.width !== 'number'
...@@ -703,8 +723,6 @@ export class CodeWindow extends Disposable implements ICodeWindow { ...@@ -703,8 +723,6 @@ export class CodeWindow extends Disposable implements ICodeWindow {
return undefined; return undefined;
} }
const displays = screen.getAllDisplays();
// Single Monitor: be strict about x/y positioning // Single Monitor: be strict about x/y positioning
if (displays.length === 1) { if (displays.length === 1) {
const displayWorkingArea = this.getWorkingArea(displays[0]); const displayWorkingArea = this.getWorkingArea(displays[0]);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册