From 8448d5d20a79828df58b44ed6f1f42d3c99c6b82 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Sat, 24 May 2025 00:45:33 +0300 Subject: [PATCH] make zterm working --- app/mxwm/startz.js | 4 +-- app/mxwm/zterm.js | 90 +++++++++++++++++++++++++++++++++++++++++----- app/posh/posh.js | 2 +- sys/system.js | 49 ++++++++++++++++++++----- 4 files changed, 124 insertions(+), 21 deletions(-) diff --git a/app/mxwm/startz.js b/app/mxwm/startz.js index ce306d7..bb6d374 100644 --- a/app/mxwm/startz.js +++ b/app/mxwm/startz.js @@ -20,8 +20,8 @@ async function drawWindowDecorations(ctx, x, y, width, height, title) { const outerX = x - borderWidth - 1; const outerY = y - headerHeight - borderWidth - 2; - const outerWidth = width + borderWidth * 2 + 1; - const outerHeight = height + headerHeight + borderWidth * 2 + 2; + const outerWidth = width + borderWidth * 2 + 2; + const outerHeight = height + headerHeight + borderWidth * 2 + 3; ctx.fillStyle = "#f4f4f4"; ctx.fillRect(outerX, outerY, outerWidth, outerHeight) diff --git a/app/mxwm/zterm.js b/app/mxwm/zterm.js index 87747fe..eeb8455 100644 --- a/app/mxwm/zterm.js +++ b/app/mxwm/zterm.js @@ -1,20 +1,87 @@ eval(readFile("/app/zcom.js")) -var text = "" +let text = "" +let stdin_text = "" +let stdin_visible = true +let stdin_disable = true async function draw(ctx) { - ctx.fillStyle = "cyan" + ctx.fillStyle = "black" ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height) - ctx.fillStyle = "#222"; - ctx.font = "bold 14px sans-serif"; - ctx.textBaseline = "middle"; - ctx.textAlign = "left"; - ctx.fillText(text, 10, 10); + let y = 500 - 12 + for (let line of text.split("\n").reverse()) { + ctx.fillStyle = "white"; + ctx.font = "bold 14px terminus"; + ctx.textBaseline = "middle"; + ctx.textAlign = "left"; + ctx.fillText(line, 5, y); + y -= 18 + } +} +function setStdinFlag(flag) { + if (flag == SILENT_STDIN) { + stdin_visible = false + } else if (flag == RENDER_STDIN) { + stdin_visible = true + } else if (flag == DISABLE_STDIN) { + stdin_disable = true + } else if (flag == ENABLE_STDIN) { + stdin_disable = false + } } +async function readStdin() { + while (stdin_text.length == 0) { + await new Promise(resolve => setTimeout(resolve, 10)) + } + let was_stdin = stdin_text.charAt(0) + stdin_text = stdin_text.slice(1) + return was_stdin +} + +async function writeStdout(wh) { + text += wh +} + +let altKey = false +let ctrlKey = false +let shiftKey = false + async function onKeyDown(key) { - text += key + console.log(key) + if (!stdin_disable) { + if (key == "Enter") { + stdin_text += "\n" + if (stdin_visible) { + text += "\n" + } + } else if (key.length == 1) { + if (key == "\0") return + if (stdin_visible) { + text += key + } + stdin_text += key + } else if (key == "Alt") { + altKey = true + } else if (key == "Shift") { + shiftKey = true + } else if (key == "Control") { + ctrlKey = true + } else { + stdin_text += "\r"+(ctrlKey ? "1" : "0")+(altKey ? "1" : "0")+(shiftKey ? "1" : "0")+key+"\r" + } + } +} + +async function onKeyUp(key) { + if (key == "Alt") { + altKey = false + } else if (key == "Shift") { + shiftKey = false + } else if (key == "Control") { + ctrlKey = false + } } async function main(args) { @@ -24,7 +91,12 @@ async function main(args) { "height": 500, "x": 50, "y": 50, - "onkeydown": onKeyDown + "onkeydown": onKeyDown, + "onkeyup": onKeyUp + }) + + setTimeout(() => { + executeCommand(["/app/posh.js"], readStdin, writeStdout, setStdinFlag) }) while (graphics_canvas != null) { diff --git a/app/posh/posh.js b/app/posh/posh.js index beefc6c..b490d83 100644 --- a/app/posh/posh.js +++ b/app/posh/posh.js @@ -25,7 +25,7 @@ async function processCommand(command, args) { await writeStdout("\nСтатус код: "+code+"\n") } } catch (e) { - console.log(e) + console.log(e.toString()) await writeStdout("Не запустилася\n") } } else { diff --git a/sys/system.js b/sys/system.js index ec4c1c7..10ea7af 100644 --- a/sys/system.js +++ b/sys/system.js @@ -13,7 +13,7 @@ const SILENT_STDIN = 2 const DISABLE_STDIN = 3 const ENABLE_STDIN = 4 -async function readLine(on_key=(key, ctrl, alt, shift, content, pos) => [content, pos]) { +const READ_FUNCTIONS_CODE = `async function readLine(on_key=(key, ctrl, alt, shift, content, pos) => [content, pos]) { setStdinFlag(ENABLE_STDIN) let start_terminal = getTerminal() @@ -63,8 +63,8 @@ async function readLine(on_key=(key, ctrl, alt, shift, content, pos) => [content continue } else if (event.type == "char") { - if (event.char == "\n") break - if (event.char == "\0") continue + if (event.char == "\\n") break + if (event.char == "\\0") continue content = content.slice(0, pos) + event.char + content.slice(pos) pos += 1 @@ -79,10 +79,10 @@ async function readLine(on_key=(key, ctrl, alt, shift, content, pos) => [content async function pollStdinEvent() { let char = await readStdin() - if (char == "\r") { + if (char == "\\r") { let key = "" char = await readStdin() - while (char != "\r") { + while (char != "\\r") { key += char char = await readStdin() } @@ -106,6 +106,34 @@ async function pollStdinEvent() { "char": char } } + +function executeCommand(args, read=readStdin, write=writeStdout, set_flag=setStdinFlag, inject="") { + let id = new Date().getMilliseconds().toString()+(Math.random()*100) + let func_content = readFile(args[0]) + if (func_content == null || !func_content.includes("function main")) return + let func = new Function( + "args", "readStdin", "writeStdout", "setStdinFlag", + READ_FUNCTIONS_CODE+"\\n\\n\\n"+func_content+"\\n"+inject+"\\nreturn main(args)" + ) + let process = { + "id": id, + "name": args.join(" "), + "promise": new Promise((resolve, reject) => { + setTimeout(() => { + try { + resolve(func(args, read, write, set_flag)) + } catch (e) { + reject(e) + } + }, 0) + }).then(o => { + processes = processes.filter(x => x.id != id) + return o + }) + } + processes.push(process) + return process +}` async function readStdin() { while (stdin.length == 0) { @@ -133,18 +161,21 @@ function setStdinFlag(flag) { } } -function executeCommand(args, read=readStdin, write=writeStdout) { +function executeCommand(args, read=readStdin, write=writeStdout, set_flag=setStdinFlag, inject="") { let id = new Date().getMilliseconds().toString()+(Math.random()*100) let func_content = readFile(args[0]) if (func_content == null || !func_content.includes("function main")) return - let func = new Function("args", "readStdin", "writeStdout", func_content+"\n\nreturn main(args)") + let func = new Function( + "args", "readStdin", "writeStdout", "setStdinFlag", + READ_FUNCTIONS_CODE+"\n\n\n"+func_content+"\n"+inject+"\nreturn main(args)" + ) let process = { "id": id, "name": args.join(" "), "promise": new Promise((resolve, reject) => { setTimeout(() => { try { - resolve(func(args, read, write)) + resolve(func(args, read, write, set_flag)) } catch (e) { reject(e) } @@ -179,4 +210,4 @@ if (Object.keys(fs_mapping).length == 0) { executeCommand(STARTUP_COMMAND) -var start_date = new Date() \ No newline at end of file +var start_date = new Date()