Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local mtTasks = {}
- local activeTask = nil
- local tEnv = nil
- local cos = {}
- local activeRestrictedEvents = { "key", "char", "terminate" }
- local removeTasks = {}
- local function injectCoroutine(name,co,...)
- cos[name] = co
- end
- local function queueTaskRemoval(k)
- log("Queueing removal of task "..k)
- table.insert(removeTasks,k)
- end
- local function processTaskRemoval()
- log("Processing Task removals")
- for k,v in pairs( removeTasks ) do
- log("Removing task "..v)
- cos[v] = nil
- screens.removeScreen("mt_"..v)
- mtTasks[v]=nil
- if activeTask == v then
- switchTask("mtshell")
- end
- end
- log("Task removel over")
- removeTasks = {}
- end
- local function isActiveRestrictedEvent(ev)
- for k,v in pairs(activeRestrictedEvents) do
- if ev == v then return true end
- end
- return false
- end
- local function process()
- while true do
- local ev,p1,p2,p3,p4,p5,p6 = os.pullEventRaw()
- if ev == "key" and p1 == 197 then
- switchTask("mttaskswitcher")
- end
- log("Processing ev: "..ev.."(AT:"..activeTask..")")
- if isActiveRestrictedEvent(ev) then
- if cos[activeTask] ~= nil and coroutine.status(cos[activeTask]) == "dead" then
- log("Active task died or is nil." .. coroutine.status(cos[activeTask]) )
- queueTaskRemoval(activeTask)
- else
- if cos[activeTask] then
- screens.setActiveScreen("mt_"..activeTask)
- log("Active task pre status: "..coroutine.status(cos[activeTask]))
- coroutine.resume(cos[activeTask],ev,p1,p2,p3,p4,p5,p6)
- log("Active task post status: "..coroutine.status(cos[activeTask]))
- if coroutine.status(cos[activeTask]) == "dead" then
- log("Active task died")
- queueTaskRemoval(activeTask)
- end
- else
- if activeTask == "mtshell" then error("CRITICAL FAILURE: mtshell died") end
- end
- end
- else
- for k,v in pairs(cos) do
- if coroutine.status(v) == "dead" then
- queueTaskRemoval(k)
- else
- screens.setActiveScreen("mt_"..k)
- coroutine.resume(v,ev,p1,p2,p3,p4,p5,p6)
- if coroutine.status(v) == "dead" then
- queueTaskRemoval(k)
- end
- end
- end
- end
- processTaskRemoval()
- end
- end
- local function taskHost(path,...)
- log("New taskhost running:" ..path.. " (Exists: "..tostring(fs.exists(path))..") Args: "..textutils.serialize(arg))
- local p1,p2=os.run( tEnv, path, unpack(arg) )
- log("Taskhost "..path.. " / Execution ended")
- -- if activeTask == n then switchTask("mtshell") end
- end
- function switchTask(str)
- if mtTasks[str] and activeTask ~= str then
- log("Switched task to "..str)
- activeTask = str
- screens.setActiveAndDisplayScreen("mt_"..str)
- return true
- else
- log("Failed to switch tasks. Task "..str.." not found")
- return false
- end
- end
- function getActiveTask()
- return activeTask
- end
- function getTaskList()
- local l = {}
- for k,v in pairs(mtTasks) do
- table.insert(l,k)
- end
- return l
- end
- function newTask(n,str,...)
- mtTasks[n] = {}
- mtTasks[n].taskHost = coroutine.create(taskHost)
- mtTasks[n].screen = screens.newScreen("mt_"..n)
- activeTask = n
- log("Created new task: "..n .. " // CO Status: "..coroutine.status(mtTasks[n].taskHost))
- screens.setActiveAndDisplayScreen("mt_"..n)
- injectCoroutine(n,mtTasks[n].taskHost,unpack(arg))
- coroutine.resume(mtTasks[n].taskHost,str,unpack(arg))
- if coroutine.status(mtTasks[n].taskHost) == "dead" then
- queueTaskRemoval(n)
- processTaskRemoval()
- end
- end
- function init(cShell)
- tEnv = {}
- setmetatable(tEnv,{__index=_G})
- tEnv.shell = cShell
- --print(tostring(tEnv.print))
- --read()
- newTask("mtshell","/mtshell")
- newTask("mttaskswitcher","/mt_taskswitcher")
- switchTask("mtshell")
- --print("running")
- --read()
- process()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement