From 8256807697cbd4681e6c6109bff302835dc02ac9 Mon Sep 17 00:00:00 2001 From: Alessandro Pignotti Date: Fri, 20 Dec 2024 11:13:03 +0100 Subject: [PATCH] Claude: Improve support for key inputs --- src/lib/WebVM.svelte | 98 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 83 insertions(+), 15 deletions(-) diff --git a/src/lib/WebVM.svelte b/src/lib/WebVM.svelte index 66d1506..27f7832 100644 --- a/src/lib/WebVM.svelte +++ b/src/lib/WebVM.svelte @@ -341,17 +341,21 @@ } return null; } + async function yieldHelper() + { + return new Promise(function(f2, r2) + { + setTimeout(f2, 0); + }); + } async function kmsSendChar(textArea, charStr) { textArea.value = "_" + charStr; - return new Promise(function(f2, r2) - { - var ke = new KeyboardEvent("keydown"); - textArea.dispatchEvent(ke); - var ke = new KeyboardEvent("keyup"); - textArea.dispatchEvent(ke); - setTimeout(f2, 0); - }); + var ke = new KeyboardEvent("keydown"); + textArea.dispatchEvent(ke); + var ke = new KeyboardEvent("keyup"); + textArea.dispatchEvent(ke); + await yieldHelper(); } async function handleTool(tool) { @@ -474,15 +478,79 @@ case "key": { var textArea = getKmsInputElement(); - switch(tool.text) + var key = tool.text; + // Support arbitrary order of modifiers + var isCtrl = false; + var isAlt = false; + var isShift = false; + while(1) { - case "Return": - await kmsSendChar(textArea, "\n"); - break; - default: - debugger; + if(key.startsWith("shift+")) + { + isShift = true; + key = key.substr("shift+".length); + var ke = new KeyboardEvent("keydown", {keyCode: 0x10}); + textArea.dispatchEvent(ke); + await yieldHelper(); + continue; + } + else if(key.startsWith("ctrl+")) + { + isCtrl = true; + key = key.substr("ctrl+".length); + var ke = new KeyboardEvent("keydown", {keyCode: 0x11}); + textArea.dispatchEvent(ke); + await yieldHelper(); + continue; + } + else if(key.startsWith("alt+")) + { + isAlt = true; + key = key.substr("alt+".length); + var ke = new KeyboardEvent("keydown", {keyCode: 0x12}); + textArea.dispatchEvent(ke); + await yieldHelper(); + continue; + } + break; } - return null; + var ret = null; + // Dispatch single chars directly and parse the rest + if(key.length == 1) + { + await kmsSendChar(textArea, key); + } + else + { + switch(tool.text) + { + case "Return": + await kmsSendChar(textArea, "\n"); + break; + default: + // TODO: Support more key combinations + ret = new Error(`Error: Invalid key '${tool.text}'`); + } + } + if(isShift) + { + var ke = new KeyboardEvent("keyup", {keyCode: 0x10}); + textArea.dispatchEvent(ke); + await yieldHelper(); + } + if(isCtrl) + { + var ke = new KeyboardEvent("keyup", {keyCode: 0x11}); + textArea.dispatchEvent(ke); + await yieldHelper(); + } + if(isAlt) + { + var ke = new KeyboardEvent("keyup", {keyCode: 0x12}); + textArea.dispatchEvent(ke); + await yieldHelper(); + } + return ret; } default: {