Skip to content

Commit

Permalink
[Bug] Fixing keyboard input repeating indefinitely when meta key is h…
Browse files Browse the repository at this point in the history
…eld.
  • Loading branch information
podarsmarty committed Sep 16, 2024
1 parent 6c2880d commit 2114c97
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 3 deletions.
6 changes: 5 additions & 1 deletion src/inputs-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
5 changes: 5 additions & 0 deletions src/test/inputs/inputs.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/test/utils/inputsHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ export default class InputsHandler {
});
}

pressKeyboardKey(key: integer, duration: integer): Promise<void> {
pressKeyboardKey(key: integer, duration: integer, isMetaPressed: boolean = false): Promise<void> {
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();
Expand Down

0 comments on commit 2114c97

Please sign in to comment.