diff --git a/frontend/app/store/keymodel.ts b/frontend/app/store/keymodel.ts index 8ae6d3c3e..f9f6d988a 100644 --- a/frontend/app/store/keymodel.ts +++ b/frontend/app/store/keymodel.ts @@ -184,7 +184,14 @@ async function handleCmdN() { await createBlock(termBlockDef); } +let lastHandledEvent: KeyboardEvent | null = null; + function appHandleKeyDown(waveEvent: WaveKeyboardEvent): boolean { + const nativeEvent = (waveEvent as any).nativeEvent; + if (lastHandledEvent != null && nativeEvent != null && lastHandledEvent === nativeEvent) { + return false; + } + lastHandledEvent = nativeEvent; const handled = handleGlobalWaveKeyboardEvents(waveEvent); if (handled) { return true; @@ -366,6 +373,7 @@ function handleGlobalWaveKeyboardEvents(waveEvent: WaveKeyboardEvent): boolean { return handler(waveEvent); } } + return false; } export { diff --git a/frontend/app/view/term/term.tsx b/frontend/app/view/term/term.tsx index 963bdd209..5aaaf475a 100644 --- a/frontend/app/view/term/term.tsx +++ b/frontend/app/view/term/term.tsx @@ -4,7 +4,7 @@ import { Block, SubBlock } from "@/app/block/block"; import { BlockNodeModel } from "@/app/block/blocktypes"; import { Search, useSearch } from "@/app/element/search"; -import { getAllGlobalKeyBindings } from "@/app/store/keymodel"; +import { appHandleKeyDown } from "@/app/store/keymodel"; import { waveEventSubscribe } from "@/app/store/wps"; import { RpcApi } from "@/app/store/wshclientapi"; import { makeFeBlockRouteId } from "@/app/store/wshrouter"; @@ -434,11 +434,11 @@ class TermViewModel implements ViewModel { this.forceRestartController(); return false; } - const globalKeys = getAllGlobalKeyBindings(); - for (const key of globalKeys) { - if (keyutil.checkKeyPressed(waveEvent, key)) { - return false; - } + const appHandled = appHandleKeyDown(waveEvent); + if (appHandled) { + event.preventDefault(); + event.stopPropagation(); + return false; } return true; } diff --git a/frontend/util/keyutil.ts b/frontend/util/keyutil.ts index f560cc902..841d12d46 100644 --- a/frontend/util/keyutil.ts +++ b/frontend/util/keyutil.ts @@ -78,9 +78,6 @@ function parseKeyDescription(keyDescription: string): KeyPressDecl { rtn.mods.Option = true; } rtn.mods.Meta = true; - } else if (key == "Esc") { - rtn.key = "Escape"; - rtn.keyType = KeyTypeKey; } else { let { key: parsedKey, type: keyType } = parseKey(key); rtn.key = parsedKey; @@ -213,6 +210,7 @@ function adaptFromReactOrNativeKeyEvent(event: React.KeyboardEvent | KeyboardEve rtn.code = event.code; rtn.key = event.key; rtn.location = event.location; + (rtn as any).nativeEvent = event; if (event.type == "keydown" || event.type == "keyup" || event.type == "keypress") { rtn.type = event.type; } else {