Optimize hotkey handler to not hook any events if cannot do anything (#1260)

This commit is contained in:
toasted-nutbread 2021-01-16 23:07:21 -05:00 committed by GitHub
parent a39eede04b
commit 5d9d96996e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -33,6 +33,8 @@ class HotkeyHandler extends EventDispatcher {
this._hotkeys = new Map(); this._hotkeys = new Map();
this._actions = new Map(); this._actions = new Map();
this._eventListeners = new EventListenerCollection(); this._eventListeners = new EventListenerCollection();
this._isPrepared = false;
this._hasEventListeners = false;
} }
/** /**
@ -53,14 +55,16 @@ class HotkeyHandler extends EventDispatcher {
* Begins listening to key press events in order to detect hotkeys. * Begins listening to key press events in order to detect hotkeys.
*/ */
prepare() { prepare() {
this._eventListeners.addEventListener(document, 'keydown', this._onKeyDown.bind(this), false); this._isPrepared = true;
this._updateEventHandlers();
} }
/** /**
* Stops listening to key press events. * Stops listening to key press events.
*/ */
cleanup() { cleanup() {
this._eventListeners.removeAllEventListeners(); this._isPrepared = false;
this._updateEventHandlers();
} }
/** /**
@ -93,6 +97,7 @@ class HotkeyHandler extends EventDispatcher {
this._registerHotkey(key, modifiers, action); this._registerHotkey(key, modifiers, action);
} }
} }
this._updateEventHandlers();
} }
/** /**
@ -102,6 +107,31 @@ class HotkeyHandler extends EventDispatcher {
this._hotkeys.clear(); this._hotkeys.clear();
} }
/**
* Adds a single event listener to a specific event.
* @param eventName The string representing the event's name.
* @param callback The event listener callback to add.
*/
on(eventName, callback) {
const result = super.on(eventName, callback);
this._updateHasEventListeners();
this._updateEventHandlers();
return result;
}
/**
* Removes a single event listener from a specific event.
* @param eventName The string representing the event's name.
* @param callback The event listener callback to add.
* @returns `true` if the callback was removed, `false` otherwise.
*/
off(eventName, callback) {
const result = super.off(eventName, callback);
this._updateHasEventListeners();
this._updateEventHandlers();
return result;
}
// Private // Private
_onKeyDown(e) { _onKeyDown(e) {
@ -144,4 +174,17 @@ class HotkeyHandler extends EventDispatcher {
} }
return true; return true;
} }
_updateHasEventListeners() {
this._hasEventListeners = this.hasListeners('keydownNonHotkey');
}
_updateEventHandlers() {
if (this._isPrepared && (this._hotkeys.size > 0 || this._hasEventListeners)) {
if (this._eventListeners.size !== 0) { return; }
this._eventListeners.addEventListener(document, 'keydown', this._onKeyDown.bind(this), false);
} else {
this._eventListeners.removeAllEventListeners();
}
}
} }