85 lines
2.7 KiB
Lua
85 lines
2.7 KiB
Lua
local apps = {}
|
|
local containers = loadfile("/libs/containers.lua")()
|
|
local focusedapp = nil
|
|
_G.app = {}
|
|
function _G.app.focusapp(pid)
|
|
print("focusing "..pid)
|
|
if focusedapp ~= nil and focusedapp.win ~= nil then
|
|
focusedapp.win.setVisible(false)
|
|
end
|
|
focusedapp = apps[pid]
|
|
print(focusedapp)
|
|
if focusedapp ~= nil and focusedapp.win ~= nil then
|
|
focusedapp.win.setVisible(true)
|
|
end
|
|
end
|
|
function _G.app.launch(id)
|
|
local w,h = term.getSize()
|
|
if not fs.exists(fs.combine("/apps",id)) then return false,"App Not Found" end
|
|
local win = window.create(term.native(),1,2,w,h-2,false)
|
|
print("loading "..id)
|
|
local env = containers.getENV(fs.combine("/apps",id),true, win)
|
|
local appobj = {win=win,co=nil,id=id,title=""}
|
|
function env.setAppTitle(str) appobj.title=str end
|
|
print("loaded "..id)
|
|
appobj.co = coroutine.create(function () containers.start(env) end)
|
|
local pid = -1
|
|
for k=1,#apps+1 do
|
|
if apps[k] == nil then
|
|
apps[k] = appobj
|
|
pid = k
|
|
end
|
|
end
|
|
app.focusapp(pid)
|
|
end
|
|
|
|
local function render()
|
|
while true do
|
|
local w,h = term.getSize()
|
|
term.setCursorPos(1,1)
|
|
term.setBackgroundColor(colors.black)
|
|
term.clearLine()
|
|
term.write(os.date("%I:%M %p"))
|
|
local candidate = network.getCandidate()
|
|
local right = "id: "..tostring(candidate.id).." dist: "..tostring(math.floor(candidate.distance+0.5)).." m"
|
|
if candidate.id == -1 then
|
|
right = "disconnected"
|
|
end
|
|
term.setCursorPos(w-right:len()+1,1)
|
|
term.write(right)
|
|
sleep()
|
|
end
|
|
end
|
|
|
|
local function process()
|
|
while true do
|
|
local event = {os.pullEvent()}
|
|
if focusedapp then
|
|
if focusedapp.event then
|
|
local success, content = coroutine.resume(focusedapp.co,table.unpack(focusedapp.event))
|
|
if success then
|
|
focusedapp.event = nil
|
|
focusedapp.filter = content
|
|
else
|
|
app.focusapp(-1)
|
|
end
|
|
elseif focusedapp.filter == nil or focusedapp.filter == event[1] then
|
|
local success, content = coroutine.resume(focusedapp.co,table.unpack(event))
|
|
if success then
|
|
focusedapp.filter = content
|
|
else
|
|
app.focusapp(-1)
|
|
end
|
|
end
|
|
end
|
|
for k,v in pairs(apps) do
|
|
if v.filter == nil or v.filter == event[1] and v.event == nil and not v == focusedapp then
|
|
v.event = event
|
|
end
|
|
end
|
|
end
|
|
end
|
|
print("launching test..")
|
|
app.launch("test")
|
|
print("launched")
|
|
parallel.waitForAny(process,render,network.run) |