diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 57950194bf9..5139ef1c850 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -26,7 +26,8 @@ import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProper import { TelemetryAppenderChannel } from 'vs/platform/telemetry/node/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; -import { IWindowsService, ActiveWindowManager } from 'vs/platform/windows/common/windows'; +import { ActiveWindowManager } from 'vs/platform/windows/node/windows'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; import { WindowsService } from 'vs/platform/windows/electron-browser/windowsService'; import { ipcRenderer } from 'electron'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 61fb4a913f4..9e88ccd42c7 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -6,7 +6,8 @@ import { app, ipcMain as ipc, systemPreferences, shell, Event, contentTracing, protocol, powerMonitor, IpcMainEvent } from 'electron'; import { IProcessEnvironment, isWindows, isMacintosh } from 'vs/base/common/platform'; import { WindowsManager } from 'vs/code/electron-main/windows'; -import { IWindowsService, OpenContext, ActiveWindowManager, IWindowOpenable } from 'vs/platform/windows/common/windows'; +import { IWindowsService, OpenContext, IWindowOpenable } from 'vs/platform/windows/common/windows'; +import { ActiveWindowManager } from 'vs/platform/windows/node/windows'; import { WindowsChannel } from 'vs/platform/windows/common/windowsIpc'; import { LegacyWindowsMainService } from 'vs/platform/windows/electron-main/legacyWindowsMainService'; import { ILifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 088f21421fa..8b6bde598b1 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -12,10 +12,8 @@ import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platf import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; import { ExportData } from 'vs/base/common/performance'; import { LogLevel } from 'vs/platform/log/common/log'; -import { DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; export const IWindowsService = createDecorator('windowsService'); @@ -44,8 +42,6 @@ export interface IWindowsService { clearRecentlyOpened(): Promise; getRecentlyOpened(windowId: number): Promise; isFocused(windowId: number): Promise; - - getActiveWindowId(): Promise; } export const IWindowService = createDecorator('windowService'); @@ -315,37 +311,3 @@ export interface IRunActionInWindowRequest { export interface IRunKeybindingInWindowRequest { userSettingsLabel: string; } - -export class ActiveWindowManager extends Disposable { - - private readonly disposables = this._register(new DisposableStore()); - private firstActiveWindowIdPromise: CancelablePromise | undefined; - private activeWindowId: number | undefined; - - constructor(@IWindowsService windowsService: IWindowsService) { - super(); - - const onActiveWindowChange = Event.latch(Event.any(windowsService.onWindowOpen, windowsService.onWindowFocus)); - onActiveWindowChange(this.setActiveWindow, this, this.disposables); - - this.firstActiveWindowIdPromise = createCancelablePromise(_ => windowsService.getActiveWindowId()); - this.firstActiveWindowIdPromise - .then(id => this.activeWindowId = typeof this.activeWindowId === 'number' ? this.activeWindowId : id) - .finally(this.firstActiveWindowIdPromise = undefined); - } - - private setActiveWindow(windowId: number | undefined) { - if (this.firstActiveWindowIdPromise) { - this.firstActiveWindowIdPromise.cancel(); - this.firstActiveWindowIdPromise = undefined; - } - - this.activeWindowId = windowId; - } - - async getActiveClientId(): Promise { - const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId; - - return `window:${id}`; - } -} diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index acd99acaaa4..355f88fbf79 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -58,7 +58,6 @@ 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 48b2e2aa4dc..7ba22274581 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -57,8 +57,4 @@ 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 01adda9089c..7f8c9ace3c2 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, DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable } 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,10 +23,6 @@ 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)); @@ -48,10 +44,6 @@ 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 { @@ -96,10 +88,6 @@ 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 new file mode 100644 index 00000000000..b5e3f3f9c32 --- /dev/null +++ b/src/vs/platform/windows/node/windows.ts @@ -0,0 +1,52 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event } from 'vs/base/common/event'; +import { DisposableStore, Disposable } from 'vs/base/common/lifecycle'; +import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; + +export class ActiveWindowManager extends Disposable { + + private readonly disposables = this._register(new DisposableStore()); + 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 + .then(id => this.activeWindowId = typeof this.activeWindowId === 'number' ? this.activeWindowId : id) + .finally(this.firstActiveWindowIdPromise = undefined); + } + + private setActiveWindow(windowId: number | undefined) { + if (this.firstActiveWindowIdPromise) { + this.firstActiveWindowIdPromise.cancel(); + this.firstActiveWindowIdPromise = undefined; + } + + this.activeWindowId = windowId; + } + + async getActiveClientId(): Promise { + const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId; + + 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 58120dd86cf..259c3d7e0da 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -165,10 +165,6 @@ export class SimpleWindowsService implements IWindowsService { files: [] }); } - - getActiveWindowId(): Promise { - return Promise.resolve(0); - } } registerSingleton(IWindowsService, SimpleWindowsService); diff --git a/src/vs/workbench/contrib/update/browser/update.ts b/src/vs/workbench/contrib/update/browser/update.ts index f2337f68174..cce3046fad5 100644 --- a/src/vs/workbench/contrib/update/browser/update.ts +++ b/src/vs/workbench/contrib/update/browser/update.ts @@ -27,7 +27,7 @@ import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { FalseContext } from 'vs/platform/contextkey/common/contextkeys'; import { ShowCurrentReleaseNotesActionId } from 'vs/workbench/contrib/update/common/update'; -import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWindowService } from 'vs/platform/windows/common/windows'; import { IProductService } from 'vs/platform/product/common/productService'; const CONTEXT_UPDATE_STATE = new RawContextKey('updateState', StateType.Uninitialized); @@ -123,11 +123,10 @@ export class ProductContribution implements IWorkbenchContribution { @IOpenerService openerService: IOpenerService, @IConfigurationService configurationService: IConfigurationService, @IWindowService windowService: IWindowService, - @IWindowsService windowsService: IWindowsService, @IProductService productService: IProductService ) { - windowsService.getActiveWindowId().then(async windowId => { - if (windowId !== windowService.windowId) { + windowService.isFocused().then(async isFocused => { + if (!isFocused) { return; } diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index d585c154e16..36457a11aed 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1280,10 +1280,6 @@ export class TestWindowsService implements IWindowsService { files: [] }); } - - getActiveWindowId(): Promise { - return Promise.resolve(undefined); - } } export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {