diff --git a/src/vs/platform/actions/browser/menuItemActionItem.ts b/src/vs/platform/actions/browser/menuItemActionItem.ts index 4911507fccb2ee15250149a13c283aacf8d3304f..fd38c4317bd30c9d91d460f116c5e628e53f5b30 100644 --- a/src/vs/platform/actions/browser/menuItemActionItem.ts +++ b/src/vs/platform/actions/browser/menuItemActionItem.ts @@ -54,19 +54,16 @@ const _altKey = new class extends Emitter { private _subscriptions: IDisposable[] = []; constructor() { - super({ - onFirstListenerAdd: () => { - domEvent(document.body, 'keydown')(this._key, this, this._subscriptions); - domEvent(document.body, 'keyup')(this._key, this, this._subscriptions); - }, - onLastListenerRemove: () => { - this._subscriptions = dispose(this._subscriptions); - } - }); + super(); + + this._subscriptions.push(domEvent(document.body, 'keydown')(e => this.fire(e.altKey))); + this._subscriptions.push(domEvent(document.body, 'keyup')(e => this.fire(false))); + this._subscriptions.push(domEvent(document.body, 'mouseleave')(e => this.fire(false))); } - private _key(e: KeyboardEvent) { - this.fire(e.type === 'keydown' && e.altKey); + dispose() { + super.dispose(); + this._subscriptions = dispose(this._subscriptions); } }; @@ -102,21 +99,25 @@ class MenuItemActionItem extends ActionItem { let altSubscription: IDisposable; let mouseOver: boolean; this._callOnDispose.push(domEvent(container, 'mouseleave')(_ => { + mouseOver = false; if (!this._altKeyDown) { - dispose(altSubscription); + // stop listen on ALT + altSubscription.dispose(); } - mouseOver = false; })); this._callOnDispose.push(domEvent(container, 'mouseenter')(e => { mouseOver = true; altSubscription = _altKey.event(value => { - if (!mouseOver) { - dispose(altSubscription); - } + this._altKeyDown = value; this._updateLabel(); this._updateTooltip(); this._updateClass(); + + if (!mouseOver) { + // stop listening on ALT + altSubscription.dispose(); + } }); })); }