v0.4.1 - Added something in the likes of an io.read() function in OpenOS. Cursor will be added next update. Shell parser will be added in 0.5.0.

This commit is contained in:
TheWahlolly
2025-04-13 17:40:19 +03:00
parent 6dfd970c62
commit b010fe7f57
6 changed files with 61 additions and 35 deletions
+41 -22
View File
@@ -1,34 +1,53 @@
local event = {}
local ocelot = component.proxy(component.list("ocelot")())
function event.pull(evtype, ...)
local timeout = ...
checkArg(1, evtype, "string", "nil")
checkArg(2, timeout, "number", "nil")
--local ocelot = component.proxy(component.list("ocelot")())
function event.pull(...)
local args = {...}
local evtype, timeout
if #args == 0 then
-- No arguments, wait for any event indefinitely
evtype = nil
timeout = nil
elseif #args == 1 then
-- If one argument is provided, it could be either the event type or timeout
if type(args[1]) == "number" then
-- It's a timeout
evtype = nil
timeout = args[1]
else
-- It's an event type
evtype = args[1]
timeout = nil
end
else
-- Both event type and timeout provided
evtype = args[1]
timeout = args[2]
end
local startTime = computer.uptime()
local args = {}
local finished = false
local result = {}
repeat
-- Check event queue for matching event
for i = 1, #evmgr.eventQueue do
if evmgr.eventQueue[i][2] == evtype or not evtype then
args = table.copy(evmgr.eventQueue[i])
if not evtype or evmgr.eventQueue[i][1] == evtype then
-- Found matching event (or any event if no type specified)
result = table.copy(evmgr.eventQueue[i])
table.remove(evmgr.eventQueue, i)
break
return table.unpack(result)
end
end
if evtype then
finished = args[1] == evtype
-- Check if we've timed out
if timeout and computer.uptime() >= startTime + timeout then
return nil -- Timed out, return nil
end
if timeout then
finished = computer.uptime() >= startTime + timeout
end
if not finished then
coroutine.yield()
end
until finished
ocelot.log(tostring(args[1]))
return table.unpack(args)
-- Yield to allow other processes to run and more events to be added
coroutine.yield()
until false -- Loop until we find an event or timeout
end
return event
+9 -8
View File
@@ -1,4 +1,3 @@
local event = import("event")
--local keyboard = import("keyboard")
@@ -32,21 +31,23 @@ function _G.clear()
end
function _G.read()
ocelot.log("reading")
local curtext = ""
local nextPosX, nextPosY = termlib.nextPosX, termlib.nextPosY
while true do
local args = {event.pull("key_down", 0.5)}
ocelot.log(tostring(args[1]))
if args[4] then
local keycode = args[4]
local key = keyboard.keys[keycode]
if key == "back" then
curtext = curtext:sub(1, #curtext-1)
elseif key == "enter" then
return curtext
else
if args[3] >= 32 and args[3] <= 126 then
curtext = curtext .. (unicode.char(args[3]) or "")
else
if key == "back" then
curtext = curtext:sub(1, #curtext-1)
termlib.nextPosX, termlib.nextPosY = nextPosX, nextPosY
print(curtext.." ")
elseif key == "enter" then
return curtext
end
end
termlib.nextPosX, termlib.nextPosY = nextPosX, nextPosY
print(curtext)