浏览代码

Claude: Improve support for key inputs

Alessandro Pignotti 6 月之前
父节点
当前提交
8256807697
共有 1 个文件被更改,包括 81 次插入13 次删除
  1. 81 13
      src/lib/WebVM.svelte

+ 81 - 13
src/lib/WebVM.svelte

@@ -341,18 +341,22 @@
 		}
 		return null;
 	}
-	async function kmsSendChar(textArea, charStr)
+	async function yieldHelper()
 	{
-		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);
 		});
 	}
+	async function kmsSendChar(textArea, charStr)
+	{
+		textArea.value = "_" + charStr;
+		var ke = new KeyboardEvent("keydown");
+		textArea.dispatchEvent(ke);
+		var ke = new KeyboardEvent("keyup");
+		textArea.dispatchEvent(ke);
+		await yieldHelper();
+	}
 	async function handleTool(tool)
 	{
 		if(tool.command)
@@ -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:
 				{