diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 764008eaf58..c893e9ef1bd 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -17,7 +17,7 @@ import { FileAccess, RemoteAuthorities, Schemas } from 'vs/base/common/network'; import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; -export const { registerWindow, getWindows, onDidRegisterWindow, onWillUnregisterWindow, onDidUnregisterWindow } = (function () { +export const { registerWindow, getWindows, getWindowsCount, onDidRegisterWindow, onWillUnregisterWindow, onDidUnregisterWindow } = (function () { const windows = new Set([window]); const onDidRegisterWindow = new event.Emitter<{ window: Window & typeof globalThis; disposables: DisposableStore }>(); const onDidUnregisterWindow = new event.Emitter(); @@ -51,6 +51,9 @@ export const { registerWindow, getWindows, onDidRegisterWindow, onWillUnregister }, getWindows(): Iterable { return windows; + }, + getWindowsCount(): number { + return windows.size; } }; })(); diff --git a/src/vs/workbench/browser/parts/editor/editorPanes.ts b/src/vs/workbench/browser/parts/editor/editorPanes.ts index ff42c12e1f4..571f0224217 100644 --- a/src/vs/workbench/browser/parts/editor/editorPanes.ts +++ b/src/vs/workbench/browser/parts/editor/editorPanes.ts @@ -10,7 +10,7 @@ import Severity from 'vs/base/common/severity'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { EditorExtensions, EditorInputCapabilities, IEditorOpenContext, IVisibleEditorPane, createEditorOpenError, isEditorOpenError } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; -import { Dimension, show, hide, IDomNodePagePosition, isAncestor, getWindow, getActiveWindow } from 'vs/base/browser/dom'; +import { Dimension, show, hide, IDomNodePagePosition, isAncestor, getWindow } from 'vs/base/browser/dom'; import { Registry } from 'vs/platform/registry/common/platform'; import { IEditorPaneRegistry, IEditorPaneDescriptor } from 'vs/workbench/browser/editor'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; @@ -277,10 +277,7 @@ export class EditorPanes extends Disposable { if (focus && this.shouldRestoreFocus(activeElement)) { pane.focus(); } else if (!internalOptions?.preserveWindowOrder) { - const paneWindow = getWindow(pane.getContainer()); - if (paneWindow !== getActiveWindow()) { - this.hostService.moveTop(paneWindow); - } + this.hostService.moveTop(getWindow(pane.getContainer())); } } diff --git a/src/vs/workbench/electron-sandbox/window.ts b/src/vs/workbench/electron-sandbox/window.ts index dbdae46a49f..0c606c68a2c 100644 --- a/src/vs/workbench/electron-sandbox/window.ts +++ b/src/vs/workbench/electron-sandbox/window.ts @@ -679,14 +679,12 @@ export class NativeWindow extends Disposable { // https://github.com/electron/electron/issues/25578 const that = this; const originalWindowFocus = window.focus.bind(window); - window.focus = async function () { - if (getActiveWindow() === window) { - return; - } - + window.focus = function () { originalWindowFocus(); - await that.nativeHostService.focusWindow(); + if (getActiveWindow() !== window) { + that.nativeHostService.focusWindow(); + } }; } diff --git a/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts b/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts index dc2bd94711a..39137a1de06 100644 --- a/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts +++ b/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts @@ -69,13 +69,11 @@ export class NativeAuxiliaryWindowService extends BrowserAuxiliaryWindowService const that = this; const originalWindowFocus = auxiliaryWindow.focus.bind(auxiliaryWindow); auxiliaryWindow.focus = async function () { - if (getActiveWindow() === auxiliaryWindow) { - return; - } - originalWindowFocus(); - await that.nativeHostService.focusWindow({ targetWindowId: await windowId.p }); + if (getActiveWindow() === auxiliaryWindow) { + that.nativeHostService.focusWindow({ targetWindowId: await windowId.p }); + } }; } } diff --git a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts index 47b619b855f..9c1cd113aaf 100644 --- a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts +++ b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts @@ -15,7 +15,7 @@ import { NativeHostService } from 'vs/platform/native/electron-sandbox/nativeHos import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { isAuxiliaryWindow } from 'vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService'; -import { getActiveDocument, getActiveWindow, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom'; +import { getActiveDocument, getWindowsCount, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom'; import { DomEmitter } from 'vs/base/browser/event'; import { memoize } from 'vs/base/common/decorators'; @@ -134,8 +134,8 @@ class WorkbenchHostService extends Disposable implements IHostService { } async moveTop(window: Window & typeof globalThis): Promise { - if (getActiveWindow() === window) { - return; + if (getWindowsCount() <= 1) { + return; // does not apply when only one window is opened } return this.nativeHostService.moveWindowTop(isAuxiliaryWindow(window) ? { targetWindowId: await window.vscodeWindowId } : undefined);