diff --git a/addons/web/static/src/core/hotkeys/hotkey_service.js b/addons/web/static/src/core/hotkeys/hotkey_service.js index 408d07ee9270b93cbdb76d08b4562aedd601a301..4ec4db1eadd2687d6a3b177e6ef3e81e4a191b8d 100644 --- a/addons/web/static/src/core/hotkeys/hotkey_service.js +++ b/addons/web/static/src/core/hotkeys/hotkey_service.js @@ -55,6 +55,13 @@ export const hotkeyService = { return; } + if (event.code && event.code.indexOf("Numpad") === 0 && /^\d$/.test(event.key)) { + // Ignore all number keys from the Keypad because of a certain input method + // of (advance-)ASCII characters on Windows OS: ALT+[numerical code from keypad] + // See https://support.microsoft.com/en-us/office/insert-ascii-or-unicode-latin-based-symbols-and-characters-d13f58d3-7bcb-44a7-a4d5-972ee12e50e0#bm1 + return; + } + const hotkey = getActiveHotkey(event); const { activeElement, isBlocked } = ui; diff --git a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js index f40fc5cebe11f171ce350baf176d8af2a3bd9ed1..f058ff7e0e548a983528ebdde5c1b36486925622 100644 --- a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js +++ b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js @@ -697,3 +697,22 @@ QUnit.test("protects editable elements: can bypassEditableProtection", async (as "the callback still gets called even if triggered from an editable" ); }); + +QUnit.test("ignore numpad keys", async (assert) => { + assert.expect(3); + + const key = '1'; + + env.services.hotkey.add(`alt+${key}`, () => assert.step(key)); + await nextTick(); + + let keydown = new KeyboardEvent("keydown", { key, code: "Numpad1", altKey: true }); + window.dispatchEvent(keydown); + await nextTick(); + assert.verifySteps([]); + + keydown = new KeyboardEvent("keydown", { key: '&', code: "Digit1", altKey: true }); + window.dispatchEvent(keydown); + await nextTick(); + assert.verifySteps(['1']); +});