diff --git a/src/HotKeyManager.ts b/src/HotKeyManager.ts index 17f63a0..6d80fa8 100644 --- a/src/HotKeyManager.ts +++ b/src/HotKeyManager.ts @@ -131,7 +131,6 @@ export class HotKeyManager); } - private triggerListenerFor(key: keyof HotkeyConfig, event: KeyboardEvent) { + private triggerListenerFor( + key: keyof HotkeyConfig, + event: KeyboardEvent, + oldKeyMap: HotkeyPressedMap[keyof HotkeyConfig], + isRepeated: boolean, + ) { const pressedEntry = this.hotKeysPressedMap[key]; this.hotKeys[key].callbacks.forEach((callback) => - callback({ event, subKeys: pressedEntry.subKeys, isPressed: pressedEntry.isPressed }), + callback({ + event, + subKeys: pressedEntry.subKeys, + isPressed: pressedEntry.isPressed, + previous: oldKeyMap, + isRepeated, + }), ); } @@ -223,19 +233,17 @@ export class HotKeyManager { + const hotkeysToTroggerAgain = hotkeysToCheckAffection.filter(([key]) => { const keyDefinition = this.hotKeys[key]; if (HotKeyManager.checkAffections(keyDefinition.keys, eventKey)) { - hotkeysToTrigger.push(key); - } else { - ObjectHelper.values(keyDefinition.subKeys).forEach((subKeyDefinitions) => { - if (HotKeyManager.checkAffections(subKeyDefinitions, eventKey)) { - hotkeysToTrigger.push(key); - } - }); + return true; } + return ObjectHelper.values(keyDefinition.subKeys).some((subKeyDefinitions) => { + return HotKeyManager.checkAffections(subKeyDefinitions, eventKey); + }); }); - hotkeysToTrigger.forEach((key) => this.triggerListenerFor(key, event)); + hotkeysToTrigger.forEach((key) => this.triggerListenerFor(key, event, oldMap[key], false)); + hotkeysToTroggerAgain.forEach(([key]) => this.triggerListenerFor(key, event, oldMap[key], true)); } private clearMap(event: KeyboardEvent) { diff --git a/src/HotkeyListener.ts b/src/HotkeyListener.ts index 8675c98..163d476 100644 --- a/src/HotkeyListener.ts +++ b/src/HotkeyListener.ts @@ -2,6 +2,11 @@ export type HotkeyListenerEvent = { event: KeyboardEvent; subKeys: Record; isPressed: boolean; + previous: { + subKeys: Record; + isPressed: boolean; + }; + isRepeated: boolean; }; export type HotkeyListener = (ev: HotkeyListenerEvent) => unknown;