Skip to content

Commit 9eeb60b

Browse files
authored
Aux window: Chord timeout much smaller in aux window (fix microsoft#196184) (microsoft#196687)
1 parent ccc965c commit 9eeb60b

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

src/vs/workbench/services/host/browser/browserHostService.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { Event } from 'vs/base/common/event';
6+
import { Emitter, Event } from 'vs/base/common/event';
77
import { IHostService } from 'vs/workbench/services/host/browser/host';
88
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
99
import { ILayoutService } from 'vs/platform/layout/browser/layoutService';
@@ -14,7 +14,7 @@ import { isResourceEditorInput, pathsToEditors } from 'vs/workbench/common/edito
1414
import { whenEditorClosed } from 'vs/workbench/browser/editor';
1515
import { IFileService } from 'vs/platform/files/common/files';
1616
import { ILabelService, Verbosity } from 'vs/platform/label/common/label';
17-
import { ModifierKeyEmitter, trackFocus } from 'vs/base/browser/dom';
17+
import { ModifierKeyEmitter, getActiveDocument, getActiveWindow, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom';
1818
import { Disposable } from 'vs/base/common/lifecycle';
1919
import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService';
2020
import { memoize } from 'vs/base/common/decorators';
@@ -179,26 +179,30 @@ export class BrowserHostService extends Disposable implements IHostService {
179179

180180
@memoize
181181
get onDidChangeFocus(): Event<boolean> {
182-
const focusTracker = this._register(trackFocus(window));
183-
const onVisibilityChange = this._register(new DomEmitter(window.document, 'visibilitychange'));
184-
185-
return Event.latch(Event.any(
186-
Event.map(focusTracker.onDidFocus, () => this.hasFocus),
187-
Event.map(focusTracker.onDidBlur, () => this.hasFocus),
188-
Event.map(onVisibilityChange.event, () => this.hasFocus)
189-
));
182+
const emitter = this._register(new Emitter<boolean>());
183+
184+
this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => {
185+
const focusTracker = disposables.add(trackFocus(window));
186+
const onVisibilityChange = disposables.add(new DomEmitter(window.document, 'visibilitychange'));
187+
188+
disposables.add(focusTracker.onDidFocus(() => emitter.fire(this.hasFocus)));
189+
disposables.add(focusTracker.onDidBlur(() => emitter.fire(this.hasFocus)));
190+
disposables.add(onVisibilityChange.event(() => emitter.fire(this.hasFocus)));
191+
}, { window, disposables: this._store }));
192+
193+
return emitter.event;
190194
}
191195

192196
get hasFocus(): boolean {
193-
return document.hasFocus();
197+
return getActiveDocument().hasFocus();
194198
}
195199

196200
async hadLastFocus(): Promise<boolean> {
197201
return true;
198202
}
199203

200204
async focus(): Promise<void> {
201-
window.focus();
205+
getActiveWindow().focus();
202206
}
203207

204208
//#endregion

src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { Event } from 'vs/base/common/event';
6+
import { Emitter, Event } from 'vs/base/common/event';
77
import { IHostService } from 'vs/workbench/services/host/browser/host';
88
import { INativeHostService } from 'vs/platform/native/common/native';
99
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
@@ -15,7 +15,9 @@ import { NativeHostService } from 'vs/platform/native/electron-sandbox/nativeHos
1515
import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService';
1616
import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService';
1717
import { isAuxiliaryWindow } from 'vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService';
18-
import { getActiveWindow } from 'vs/base/browser/dom';
18+
import { getActiveDocument, getActiveWindow, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom';
19+
import { DomEmitter } from 'vs/base/browser/event';
20+
import { memoize } from 'vs/base/common/decorators';
1921

2022
class WorkbenchNativeHostService extends NativeHostService {
2123

@@ -41,14 +43,29 @@ class WorkbenchHostService extends Disposable implements IHostService {
4143

4244
//#region Focus
4345

44-
get onDidChangeFocus(): Event<boolean> { return this._onDidChangeFocus; }
45-
private _onDidChangeFocus: Event<boolean> = Event.latch(Event.any(
46-
Event.map(Event.filter(this.nativeHostService.onDidFocusWindow, id => id === this.nativeHostService.windowId), () => this.hasFocus),
47-
Event.map(Event.filter(this.nativeHostService.onDidBlurWindow, id => id === this.nativeHostService.windowId), () => this.hasFocus)
48-
), undefined, this._store);
46+
@memoize
47+
get onDidChangeFocus(): Event<boolean> {
48+
const emitter = this._register(new Emitter<boolean>());
49+
50+
// Main window: track via native API
51+
this._register(Event.filter(this.nativeHostService.onDidFocusWindow, id => id === this.nativeHostService.windowId, this._store)(() => emitter.fire(this.hasFocus)));
52+
this._register(Event.filter(this.nativeHostService.onDidBlurWindow, id => id === this.nativeHostService.windowId, this._store)(() => emitter.fire(this.hasFocus)));
53+
54+
// Aux windows: track via DOM APIs
55+
this._register(onDidRegisterWindow(({ window, disposables }) => {
56+
const focusTracker = disposables.add(trackFocus(window));
57+
const onVisibilityChange = disposables.add(new DomEmitter(window.document, 'visibilitychange'));
58+
59+
disposables.add(focusTracker.onDidFocus(() => emitter.fire(this.hasFocus)));
60+
disposables.add(focusTracker.onDidBlur(() => emitter.fire(this.hasFocus)));
61+
disposables.add(onVisibilityChange.event(() => emitter.fire(this.hasFocus)));
62+
}));
63+
64+
return emitter.event;
65+
}
4966

5067
get hasFocus(): boolean {
51-
return document.hasFocus();
68+
return getActiveDocument().hasFocus();
5269
}
5370

5471
async hadLastFocus(): Promise<boolean> {

0 commit comments

Comments
 (0)