Compare commits

...

3 Commits

4 changed files with 102 additions and 44 deletions

View File

@ -1,4 +1,13 @@
local vtansi = {} local vtansi = {}
vtansi.sequences = {
[28] = "\n", -- newline
[200] = "\27[A", -- up
[201] = "\27[5~", -- page up
[203] = "\27[D", -- left
[205] = "\27[C", -- right
[208] = "\27[B", -- down
[209] = "\27[6~" -- page down
}
function vtansi.vtemu(gpu) -- table -- function -- takes GPU component proxy *gpu* and returns a function to write to it in a manner like an ANSI terminal function vtansi.vtemu(gpu) -- table -- function -- takes GPU component proxy *gpu* and returns a function to write to it in a manner like an ANSI terminal
local colours = {0x0,0xFF0000,0x00FF00,0xFFFF00,0x0000FF,0xFF00FF,0x00B6FF,0xFFFFFF} local colours = {0x0,0xFF0000,0x00FF00,0xFFFF00,0x0000FF,0xFF00FF,0x00B6FF,0xFFFFFF}
local mx, my = gpu.maxResolution() local mx, my = gpu.maxResolution()
@ -106,7 +115,7 @@ function vtansi.vtemu(gpu) -- table -- function -- takes GPU component proxy *gp
elseif cc == "m" then elseif cc == "m" then
for _,num in ipairs(tA) do for _,num in ipairs(tA) do
if num == 0 then if num == 0 then
fg,bg,ec,lb = 0xFFFFFF,0,true,true fg,bg,ec,lb = 0xFFFFFF,0,false,true
elseif num == 7 then elseif num == 7 then
local nfg,nbg = bg, fg local nfg,nbg = bg, fg
fg, bg = nfg, nbg fg, bg = nfg, nbg
@ -150,37 +159,27 @@ function vtansi.vtsession(gpua,scra) -- string string -- table -- creates a proc
for k,v in ipairs(component.invoke(scra,"getKeyboards")) do for k,v in ipairs(component.invoke(scra,"getKeyboards")) do
kba[v]=true kba[v]=true
end end
local buf, lbuf, echo = "", true, true local buf, lbuf, echo = "", false, false
os.spawn(function() dprint(pcall(function() os.spawn(function()
while true do while true do
local ty,ka,ch = coroutine.yield() local ty,ka,ch,kc = coroutine.yield()
if ty == "key_down" and kba[ka] then if ty == "key_down" and kba[ka] then
if ch == 13 then ch = 10 end local outs
if ch == 8 and lbuf then if ch > 0 then
if buf:len() > 0 then outs = string.char(ch)
if echo then write("\8 \8") end
buf = buf:sub(1,-2)
end end
elseif ch > 0 then outs = vtansi.sequences[kc] or outs
if echo then write(string.char(ch)) end if outs then
buf=buf..string.char(ch) if echo then write(outs) end
buf=buf..outs
end end
end end
end end
end)) end,string.format("ttyd[%s:%s]",gpua:sub(1,8),scra:sub(1,8))) end,string.format("ttyd[%s:%s]",gpua:sub(1,8),scra:sub(1,8)))
local function bread(n) local function bread(n)
local r
if lbuf then
while not buf:find("\n") do
coroutine.yield() coroutine.yield()
end local r = buf
local n = buf:find("\n")
r, buf = buf:sub(1,n), buf:sub(n+1)
else
r = buf
buf = "" buf = ""
coroutine.yield()
end
return r return r
end end
local function bwrite(d) local function bwrite(d)

View File

@ -234,6 +234,7 @@ function buffer:read(...)
end end
local function readLine(chop) local function readLine(chop)
if not self.mode.t then
local start = 1 local start = 1
while true do while true do
local l = self.bufferRead:find("\n", start, true) local l = self.bufferRead:find("\n", start, true)
@ -255,6 +256,61 @@ function buffer:read(...)
end end
end end
end end
else
-- ?????
io.write("\27[s\27[8m")
local pos, buffer = 1, ""
local function redraw()
io.write("\27[u")
io.write(buffer.." ")
io.write("\27[u")
io.write(buffer:sub(1,(#buffer-pos)+1))
end
while true do
syslog("top of readline loop")
char = readBytesOrChars(1)
if char == "\27" then
if readBytesOrChars(1) == "[" then
syslog("escape code")
local args = {""}
repeat
char = readBytesOrChars(1)
--[[
if char:match("%d") then
args[#args] = args[#args]..char
else
args[#args] = tonumber(args[#args])
args[#args+1] = ""
end
]]
until not char:match("[%d;]")
if char == "C" then -- right
if pos > 1 then
syslog("moving right")
pos = pos - 1
end
elseif char == "D" then -- left
if pos <= #buffer then
syslog("moving left")
pos = pos + 1
end
end
end
elseif char == "\8" then
if #buffer > 0 and pos <= #buffer then
buffer = buffer:sub(1, (#buffer - pos)) .. buffer:sub((#buffer - pos) + 2)
end
elseif char == "\13" or char == "\10" or char == "\n" then
io.write("\n")
if chop then buffer = buffer .. "\n" end
return buffer
else
syslog("char: "..tostring(string.byte(char)))
buffer = buffer:sub(1, (#buffer - pos) + 1) .. char .. buffer:sub((#buffer - pos) + 2)
end
redraw()
end
end
end end
local function readAll() local function readAll()

View File

@ -8,7 +8,7 @@ end
function io.input(fd) -- table -- table -- Sets the default input stream to *fd* if provided, either as a buffer as a path. Returns the default input stream. function io.input(fd) -- table -- table -- Sets the default input stream to *fd* if provided, either as a buffer as a path. Returns the default input stream.
if type(fd) == "string" then if type(fd) == "string" then
fd=io.open(fd,"rb") fd=io.open(fd,"rbt")
end end
if fd then if fd then
os.setenv("STDIN",fd) os.setenv("STDIN",fd)

View File

@ -58,6 +58,9 @@ function os.getenv(k) -- gets a process' *k* environment variable
return tTasks[cPid].e[k] return tTasks[cPid].e[k]
end end
end end
function os.getTimeout()
return nTimeout
end
function os.setTimeout(n) function os.setTimeout(n)
if type(n) == "number" and n >= 0 then if type(n) == "number" and n >= 0 then
nTimeout = n nTimeout = n