Advertisement
Pinkishu

mt-api

Aug 13th, 2012
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.66 KB | None | 0 0
  1. local mtTasks = {}
  2. local activeTask = nil
  3. local tEnv = nil
  4. local cos = {}
  5. local activeRestrictedEvents = { "key", "char", "terminate" }
  6. local removeTasks = {}
  7.  
  8. local function injectCoroutine(name,co,...)
  9.     cos[name] = co
  10. end
  11.  
  12. local function queueTaskRemoval(k)
  13.     log("Queueing removal of task "..k)
  14.     table.insert(removeTasks,k)
  15. end
  16.  
  17. local function processTaskRemoval()
  18.     log("Processing Task removals")
  19.     for k,v in pairs( removeTasks ) do
  20.         log("Removing task "..v)
  21.         cos[v] = nil
  22.         screens.removeScreen("mt_"..v)
  23.         mtTasks[v]=nil
  24.         if activeTask == v then
  25.             switchTask("mtshell")
  26.         end
  27.     end
  28.     log("Task removel over")
  29.     removeTasks = {}
  30. end
  31.  
  32. local function isActiveRestrictedEvent(ev)
  33.     for k,v in pairs(activeRestrictedEvents) do
  34.         if ev == v then return true end
  35.     end
  36.     return false
  37. end
  38.  
  39. local function process()
  40.     while true do
  41.         local ev,p1,p2,p3,p4,p5,p6 = os.pullEventRaw()
  42.         if ev == "key" and p1 == 197 then
  43.             switchTask("mttaskswitcher")
  44.         end
  45.         log("Processing ev: "..ev.."(AT:"..activeTask..")")
  46.         if isActiveRestrictedEvent(ev) then
  47.             if cos[activeTask] ~= nil and coroutine.status(cos[activeTask]) == "dead" then
  48.                 log("Active task died or is nil." .. coroutine.status(cos[activeTask]) )
  49.                 queueTaskRemoval(activeTask)
  50.             else
  51.                 if cos[activeTask] then
  52.                     screens.setActiveScreen("mt_"..activeTask)
  53.                     log("Active task pre status: "..coroutine.status(cos[activeTask]))
  54.                     coroutine.resume(cos[activeTask],ev,p1,p2,p3,p4,p5,p6)
  55.                     log("Active task post status: "..coroutine.status(cos[activeTask]))
  56.                     if coroutine.status(cos[activeTask]) == "dead" then
  57.                         log("Active task died")
  58.                         queueTaskRemoval(activeTask)
  59.                     end
  60.                 else
  61.                     if activeTask == "mtshell" then error("CRITICAL FAILURE: mtshell died") end
  62.                 end
  63.             end
  64.         else
  65.  
  66.             for k,v in pairs(cos) do
  67.                 if coroutine.status(v) == "dead" then
  68.                     queueTaskRemoval(k)
  69.                 else
  70.                     screens.setActiveScreen("mt_"..k)
  71.                     coroutine.resume(v,ev,p1,p2,p3,p4,p5,p6)
  72.                     if coroutine.status(v) == "dead" then
  73.                         queueTaskRemoval(k)
  74.                     end
  75.                 end
  76.             end
  77.         end
  78.         processTaskRemoval()
  79.     end
  80. end
  81.  
  82. local function taskHost(path,...)
  83.     log("New taskhost running:" ..path.. " (Exists: "..tostring(fs.exists(path))..") Args: "..textutils.serialize(arg))
  84.     local p1,p2=os.run( tEnv, path, unpack(arg) )
  85.     log("Taskhost "..path.. " / Execution ended")
  86. --  if activeTask == n then switchTask("mtshell") end
  87. end
  88.  
  89. function switchTask(str)
  90.     if mtTasks[str] and activeTask ~= str then
  91.         log("Switched task to "..str)
  92.         activeTask = str
  93.  
  94.         screens.setActiveAndDisplayScreen("mt_"..str)
  95.         return true
  96.     else
  97.         log("Failed to switch tasks. Task "..str.." not found")
  98.         return false
  99.     end
  100. end
  101.  
  102. function getActiveTask()
  103.     return activeTask
  104. end
  105.  
  106. function getTaskList()
  107.     local l = {}
  108.     for k,v in pairs(mtTasks) do
  109.         table.insert(l,k)
  110.     end
  111.     return l
  112. end
  113.  
  114. function newTask(n,str,...)
  115.     mtTasks[n] = {}
  116.     mtTasks[n].taskHost = coroutine.create(taskHost)
  117.     mtTasks[n].screen = screens.newScreen("mt_"..n)
  118.     activeTask = n
  119.     log("Created new task: "..n .. " // CO Status: "..coroutine.status(mtTasks[n].taskHost))
  120.     screens.setActiveAndDisplayScreen("mt_"..n)
  121.    
  122.     injectCoroutine(n,mtTasks[n].taskHost,unpack(arg))
  123.     coroutine.resume(mtTasks[n].taskHost,str,unpack(arg))
  124.     if coroutine.status(mtTasks[n].taskHost) == "dead" then
  125.         queueTaskRemoval(n)
  126.         processTaskRemoval()
  127.     end
  128. end
  129.  
  130. function init(cShell)
  131.     tEnv = {}
  132.     setmetatable(tEnv,{__index=_G})
  133.     tEnv.shell = cShell
  134.     --print(tostring(tEnv.print))
  135.     --read()
  136.     newTask("mtshell","/mtshell")
  137.     newTask("mttaskswitcher","/mt_taskswitcher")
  138.     switchTask("mtshell")
  139.     --print("running")
  140.     --read()
  141.     process()
  142. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement