Aux window: Chord timeout much smaller in aux window (fix #196184) (#196687)

This commit is contained in:
Benjamin Pasero
2023-10-26 10:37:39 +02:00
committed by GitHub
parent ccc965c00c
commit 9eeb60b7f2
2 changed files with 40 additions and 19 deletions
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Event } from 'vs/base/common/event';
import { Emitter, Event } from 'vs/base/common/event';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { ILayoutService } from 'vs/platform/layout/browser/layoutService';
@@ -14,7 +14,7 @@ import { isResourceEditorInput, pathsToEditors } from 'vs/workbench/common/edito
import { whenEditorClosed } from 'vs/workbench/browser/editor';
import { IFileService } from 'vs/platform/files/common/files';
import { ILabelService, Verbosity } from 'vs/platform/label/common/label';
import { ModifierKeyEmitter, trackFocus } from 'vs/base/browser/dom';
import { ModifierKeyEmitter, getActiveDocument, getActiveWindow, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom';
import { Disposable } from 'vs/base/common/lifecycle';
import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService';
import { memoize } from 'vs/base/common/decorators';
@@ -179,18 +179,22 @@ export class BrowserHostService extends Disposable implements IHostService {
@memoize
get onDidChangeFocus(): Event<boolean> {
const focusTracker = this._register(trackFocus(window));
const onVisibilityChange = this._register(new DomEmitter(window.document, 'visibilitychange'));
const emitter = this._register(new Emitter<boolean>());
return Event.latch(Event.any(
Event.map(focusTracker.onDidFocus, () => this.hasFocus),
Event.map(focusTracker.onDidBlur, () => this.hasFocus),
Event.map(onVisibilityChange.event, () => this.hasFocus)
));
this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => {
const focusTracker = disposables.add(trackFocus(window));
const onVisibilityChange = disposables.add(new DomEmitter(window.document, 'visibilitychange'));
disposables.add(focusTracker.onDidFocus(() => emitter.fire(this.hasFocus)));
disposables.add(focusTracker.onDidBlur(() => emitter.fire(this.hasFocus)));
disposables.add(onVisibilityChange.event(() => emitter.fire(this.hasFocus)));
}, { window, disposables: this._store }));
return emitter.event;
}
get hasFocus(): boolean {
return document.hasFocus();
return getActiveDocument().hasFocus();
}
async hadLastFocus(): Promise<boolean> {
@@ -198,7 +202,7 @@ export class BrowserHostService extends Disposable implements IHostService {
}
async focus(): Promise<void> {
window.focus();
getActiveWindow().focus();
}
//#endregion
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Event } from 'vs/base/common/event';
import { Emitter, Event } from 'vs/base/common/event';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { INativeHostService } from 'vs/platform/native/common/native';
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
@@ -15,7 +15,9 @@ 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 { getActiveWindow } from 'vs/base/browser/dom';
import { getActiveDocument, getActiveWindow, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom';
import { DomEmitter } from 'vs/base/browser/event';
import { memoize } from 'vs/base/common/decorators';
class WorkbenchNativeHostService extends NativeHostService {
@@ -41,14 +43,29 @@ class WorkbenchHostService extends Disposable implements IHostService {
//#region Focus
get onDidChangeFocus(): Event<boolean> { return this._onDidChangeFocus; }
private _onDidChangeFocus: Event<boolean> = Event.latch(Event.any(
Event.map(Event.filter(this.nativeHostService.onDidFocusWindow, id => id === this.nativeHostService.windowId), () => this.hasFocus),
Event.map(Event.filter(this.nativeHostService.onDidBlurWindow, id => id === this.nativeHostService.windowId), () => this.hasFocus)
), undefined, this._store);
@memoize
get onDidChangeFocus(): Event<boolean> {
const emitter = this._register(new Emitter<boolean>());
// Main window: track via native API
this._register(Event.filter(this.nativeHostService.onDidFocusWindow, id => id === this.nativeHostService.windowId, this._store)(() => emitter.fire(this.hasFocus)));
this._register(Event.filter(this.nativeHostService.onDidBlurWindow, id => id === this.nativeHostService.windowId, this._store)(() => emitter.fire(this.hasFocus)));
// Aux windows: track via DOM APIs
this._register(onDidRegisterWindow(({ window, disposables }) => {
const focusTracker = disposables.add(trackFocus(window));
const onVisibilityChange = disposables.add(new DomEmitter(window.document, 'visibilitychange'));
disposables.add(focusTracker.onDidFocus(() => emitter.fire(this.hasFocus)));
disposables.add(focusTracker.onDidBlur(() => emitter.fire(this.hasFocus)));
disposables.add(onVisibilityChange.event(() => emitter.fire(this.hasFocus)));
}));
return emitter.event;
}
get hasFocus(): boolean {
return document.hasFocus();
return getActiveDocument().hasFocus();
}
async hadLastFocus(): Promise<boolean> {