local apps = {} local windows = loadfile("/libs/windows.lua")() local containers = loadfile("/libs/containers.lua")() local focusedapp = nil local home_button = "[------]" local launcherappid = "com.ruffles.launcher" local launcherapp = nil _G.app = {} function _G.app.focusapp(pid) print("focusing "..pid) focusedapp = apps[pid] end function _G.app.getApps() local out = {} for _,f in ipairs(fs.list("/apps-meta")) do if fs.exists(fs.combine("/apps-meta",f)) then print(f) local file = fs.open(fs.combine("/apps-meta",f),"r") if file then out[#out+1] = textutils.unserialise(file.readAll()) file.close() end end end return out end function _G.app.launch(id,perms) local w,h = term.getSize() if not fs.exists(fs.combine("/apps",id)) then return false,"App Not Found" end local win = windows.create(id,w,h-2,1,2) local env = containers.getENV(fs.combine("/apps",id), win, perms) local appobj = {win=win,co=nil,id=id,title=id} function env.setAppTitle(str) appobj.title=str end 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) return pid end local function render() while true do local w,h = term.getSize() if focusedapp and focusedapp.win then local window = focusedapp.win for cy = 1, window.h do term.setCursorPos(window.x, window.y + cy - 1) local line, fg, bg = "", "", "" for cx = 1, window.w do if window.buffer[cx] then local cell = window.buffer[cx][cy] if cell then line = line .. cell.char fg = fg .. ("0123456789abcdef"):sub(math.log(cell.tc, 2) + 1, math.log(cell.tc, 2) + 1) bg = bg .. ("0123456789abcdef"):sub(math.log(cell.bc, 2) + 1, math.log(cell.bc, 2) + 1) else line = line .. " " fg = fg .. "0" bg = bg .. "f" end else line = line .. " " fg = fg .. "0" bg = bg .. "f" end end term.blit(line, fg, bg) end end term.setCursorPos(1,1) term.setBackgroundColor(colors.black) if focusedapp then term.setBackgroundColor(focusedapp.win.getBackgroundColour()) end 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) term.setCursorPos((w/2)-(home_button:len()/2)+1,h) term.write(home_button) term.setCursorPos(1,h) if focusedapp then local window = focusedapp.win if window then term.setCursorPos(window.cursorX,window.cursorY) term.setCursorBlink(window.cursorBlink) else term.setCursorBlink(false) end end sleep(1/20) end end local function process() while true do local event = {os.pullEvent()} if event[1] == "mouse_click" then local w,h = term.getSize() if event[2] == 1 and event[3] >= (w/2)-(home_button:len()/2)+1 and event[3] <= (w/2)-(home_button:len()/2)+home_button:len() and event[4] == h then app.focusapp(launcherapp) end event[4] = event[4]-1 elseif event[1] == "mouse_up" then event[4] = event[4]-1 elseif event[1] == "mouse_drag" then event[4] = event[4]-1 elseif event[1] == "mouse_scroll" then event[4] = event[4]-1 end if focusedapp then if focusedapp.event then local success, content = coroutine.resume(focusedapp.co,table.unpack(focusedapp.event)) if success then -- print(focusedapp.title,focusedapp.filter) 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 v ~= focusedapp then v.event = event end end end end print("launching launcher app..") launcherapp = app.launch(launcherappid,{http=true,app=true,repo=true,network=true}) print("launched launcher app") parallel.waitForAny(process,render,network.run)