diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index e9c4176128e..d835722e434 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -42,6 +42,7 @@ export interface IWindowsService { clearRecentlyOpened(): Promise; getRecentlyOpened(windowId: number): Promise; isFocused(windowId: number): Promise; + getActiveWindowId(): Promise; } export const IWindowService = createDecorator('windowService'); diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index 355f88fbf79..acd99acaaa4 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -58,6 +58,7 @@ export class WindowsChannel implements IServerChannel { case 'getRecentlyOpened': return this.service.getRecentlyOpened(arg); case 'isFocused': return this.service.isFocused(arg); case 'openExtensionDevelopmentHostWindow': return (this.service as any).openExtensionDevelopmentHostWindow(arg[0], arg[1]); // TODO@Isidor move + case 'getActiveWindowId': return this.service.getActiveWindowId(); } throw new Error(`Call not found: ${command}`); diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index 7ba22274581..48b2e2aa4dc 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -57,4 +57,8 @@ export class WindowsService implements IWindowsService { openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { return this.channel.call('openExtensionDevelopmentHostWindow', [args, env]); } + + getActiveWindowId(): Promise { + return this.channel.call('getActiveWindowId'); + } } diff --git a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts index 7f8c9ace3c2..01adda9089c 100644 --- a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts +++ b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { assign } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; import { IWindowsService, OpenContext } from 'vs/platform/windows/common/windows'; @@ -23,6 +23,10 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ _serviceBrand: undefined; + private readonly disposables = this._register(new DisposableStore()); + + private _activeWindowId: number | undefined; + readonly onWindowOpen: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); readonly onWindowBlur: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); readonly onWindowMaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); @@ -44,6 +48,10 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ super(); urlService.registerHandler(this); + + // remember last active window id + Event.latch(Event.any(this.onWindowOpen, this.onWindowFocus)) + (id => this._activeWindowId = id, null, this.disposables); } async addRecentlyOpened(recents: IRecent[]): Promise { @@ -88,6 +96,10 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ } } + async getActiveWindowId(): Promise { + return this._activeWindowId; + } + async handleURL(uri: URI): Promise { // Catch file URLs diff --git a/src/vs/platform/windows/node/windows.ts b/src/vs/platform/windows/node/windows.ts index b5e3f3f9c32..98bd1f8771e 100644 --- a/src/vs/platform/windows/node/windows.ts +++ b/src/vs/platform/windows/node/windows.ts @@ -14,18 +14,14 @@ export class ActiveWindowManager extends Disposable { private firstActiveWindowIdPromise: CancelablePromise | undefined; private activeWindowId: number | undefined; - private _activeWindowId: number | undefined; constructor(@IWindowsService windowsService: IWindowsService) { super(); - // remember last active window id - Event.latch(Event.any(windowsService.onWindowOpen, windowsService.onWindowFocus))(id => this._activeWindowId = id, null, this.disposables); - const onActiveWindowChange = Event.latch(Event.any(windowsService.onWindowOpen, windowsService.onWindowFocus)); onActiveWindowChange(this.setActiveWindow, this, this.disposables); - this.firstActiveWindowIdPromise = createCancelablePromise(_ => this.getActiveWindowId()); + this.firstActiveWindowIdPromise = createCancelablePromise(_ => windowsService.getActiveWindowId()); this.firstActiveWindowIdPromise .then(id => this.activeWindowId = typeof this.activeWindowId === 'number' ? this.activeWindowId : id) .finally(this.firstActiveWindowIdPromise = undefined); @@ -46,7 +42,4 @@ export class ActiveWindowManager extends Disposable { return `window:${id}`; } - private async getActiveWindowId(): Promise { - return this._activeWindowId; - } } diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 259c3d7e0da..58120dd86cf 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -165,6 +165,10 @@ export class SimpleWindowsService implements IWindowsService { files: [] }); } + + getActiveWindowId(): Promise { + return Promise.resolve(0); + } } registerSingleton(IWindowsService, SimpleWindowsService); diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 36457a11aed..d585c154e16 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1280,6 +1280,10 @@ export class TestWindowsService implements IWindowsService { files: [] }); } + + getActiveWindowId(): Promise { + return Promise.resolve(undefined); + } } export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {