From 2114c9737f7b04c45827670f16f197b89c867e74 Mon Sep 17 00:00:00 2001 From: podar <1999688+podarsmarty@users.noreply.github.com> Date: Mon, 16 Sep 2024 00:03:22 -0500 Subject: [PATCH] [Bug] Fixing keyboard input repeating indefinitely when meta key is held. --- src/inputs-controller.ts | 6 +++++- src/test/inputs/inputs.test.ts | 5 +++++ src/test/utils/inputsHandler.ts | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index bb3cfcbeb3b..e402720ca43 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -349,12 +349,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 30dd101f43d..72e70edfabb 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();