diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index d382caf6cb6..c9edd530a6e 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -344,12 +344,16 @@ export class InputsController { * Handles the keydown event for the keyboard. * * @param event The keyboard event. + * + * @remarks On Mac the keyup event for a pressed key is not fired if the meta key is held down. To + * insure that that key is not repeatedly input until the user presses it again only emit events + * when the meta key is not held. */ keyboardKeyDown(event): void { this.lastSource = "keyboard"; this.ensureKeyboardIsInit(); const buttonDown = getButtonWithKeycode(this.getActiveConfig(Device.KEYBOARD), event.keyCode); - if (buttonDown !== undefined) { + if (buttonDown !== undefined && !event.metaKey) { if (this.buttonLock.includes(buttonDown)) { return; } diff --git a/src/test/inputs/inputs.test.ts b/src/test/inputs/inputs.test.ts index 6306c1b9da6..d8614b38567 100644 --- a/src/test/inputs/inputs.test.ts +++ b/src/test/inputs/inputs.test.ts @@ -52,6 +52,11 @@ describe("Inputs", () => { expect(game.inputsHandler.log.length).toBe(5); }); + it("keyboard - test input holding meta key - 0 input", async() => { + await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 1, true); + expect(game.inputsHandler.log.length).toBe(0); + }); + it("keyboard - test input holding for 200ms - 1 input", async() => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 200); expect(game.inputsHandler.log.length).toBe(1); diff --git a/src/test/utils/inputsHandler.ts b/src/test/utils/inputsHandler.ts index 8b8a89e45dc..46823d0590c 100644 --- a/src/test/utils/inputsHandler.ts +++ b/src/test/utils/inputsHandler.ts @@ -48,9 +48,9 @@ export default class InputsHandler { }); } - pressKeyboardKey(key: integer, duration: integer): Promise { + pressKeyboardKey(key: integer, duration: integer, isMetaPressed: boolean = false): Promise { return new Promise(async (resolve) => { - this.scene.input.keyboard?.emit("keydown", { keyCode: key }); + this.scene.input.keyboard?.emit("keydown", { keyCode: key, metaKey: isMetaPressed }); await holdOn(duration); this.scene.input.keyboard?.emit("keyup", { keyCode: key }); resolve();