SHOW:
|
|
- or go back to the newest paste.
| 1 | --[[ | |
| 2 | - | Monc 2.0 - Monitor/Computer mirror program |
| 2 | + | Monc 2.1 - Monitor/Computer mirror program Beta |
| 3 | Now with multi-monitor support | |
| 4 | and safe disabling | |
| 5 | ||
| 6 | - | pastebin get LxbBS18S monc |
| 6 | + | pastebin get GdscC2Jv monc2b |
| 7 | - | std PB LxbBS18S monc |
| 7 | + | std PB GdscC2Jv monc2b |
| 8 | std ld monc2 monc | |
| 9 | - | wget http://pastebin.com/raw/LxbBS18S |
| 9 | + | wget http://pastebin.com/raw/GdscC2Jv |
| 10 | ||
| 11 | - | This is a stable release. You fool! |
| 11 | + | This is a beta release. You fool! |
| 12 | Working on: | |
| 13 | + implementing settings API for basic options | |
| 14 | + borders --working on right now | |
| 15 | + fixing term.redirect | |
| 16 | --]] | |
| 17 | ||
| 18 | local centerMonc = true | |
| 19 | ||
| 20 | local getTableSize = function(tbl) | |
| 21 | local out = 0 | |
| 22 | if type(tbl) == "table" then | |
| 23 | for k,v in pairs(tbl) do | |
| 24 | out = out + 1 | |
| 25 | end | |
| 26 | end | |
| 27 | return out | |
| 28 | end | |
| 29 | ||
| 30 | local copyTable = function(tbl) | |
| 31 | local output = {}
| |
| 32 | for k,v in pairs(tbl) do | |
| 33 | output[k] = v | |
| 34 | end | |
| 35 | return output | |
| 36 | end | |
| 37 | ||
| 38 | if not monc then | |
| 39 | monc = {}
| |
| 40 | monc.monitors = (type(monc.monitors) == "table" and #monc.monitors > 0) and monc.monitors or {}
| |
| 41 | if not monc.oldterm then monc.oldterm = copyTable(term) end | |
| 42 | if not monc.origterm then monc.origterm = term.current() end | |
| 43 | if monc.active == nil then monc.active = false end | |
| 44 | monc.addMonitor = function(object,position) | |
| 45 | local pos = position or (#monc.monitors+1) | |
| 46 | monc.monitors[pos] = object | |
| 47 | if object then | |
| 48 | object.setBackgroundColor(monc.oldterm.getBackgroundColor()) | |
| 49 | object.setTextColor(monc.oldterm.getTextColor()) | |
| 50 | object.clear() | |
| 51 | object.setCursorPos(monc.oldterm.getCursorPos()) | |
| 52 | - | monc.adjustCoords = function(v,termX,termY) |
| 52 | + | |
| 53 | - | if v.getSize() then |
| 53 | + | |
| 54 | - | |
| 54 | + | |
| 55 | monc.monitors[position] = nil | |
| 56 | end | |
| 57 | ||
| 58 | monc.beforeFunc = function(v) --executed before all functions that alter the screen | |
| 59 | --screen X, Y sizes | |
| 60 | local scX,scY = v.getSize() | |
| 61 | --native terminal X, Y sizes | |
| 62 | local ntX,ntY = monc.oldterm.getSize() | |
| 63 | --adjust X, Y | |
| 64 | local adjX,adjY = (centerMonc and (scX>ntX)) and (math.floor(scX-ntX)/2) or 0,(centerMonc and (scY>ntY)) and (math.floor(scX-ntX)/2) or 0 | |
| 65 | - | monc.term.setCursorPos = function(...) |
| 65 | + | --native terminal cursor X, Y |
| 66 | - | monc.oldterm.setCursorPos(...) |
| 66 | + | local ntCX,ntCY = monc.oldterm.getCursorPos() |
| 67 | v.setCursorPos(ntCX+adjX,ntCY+adjY) | |
| 68 | end | |
| 69 | - | v.setCursorPos(...) |
| 69 | + | monc.afterFunc = function(v) --executed after all functions that alter the screen |
| 70 | return nil --unused as of now | |
| 71 | end | |
| 72 | ||
| 73 | monc.term = {}
| |
| 74 | monc.term.getSize = function() | |
| 75 | return monc.oldterm.getSize() | |
| 76 | end | |
| 77 | monc.term.getCursorPos = function() | |
| 78 | return monc.oldterm.getCursorPos() | |
| 79 | end | |
| 80 | monc.term.setCursorPos = function(x,y) | |
| 81 | monc.oldterm.setCursorPos(x,y) | |
| 82 | for k,v in pairs(monc.monitors) do | |
| 83 | local scX,scY = v.getSize() | |
| 84 | local ntX,ntY = monc.oldterm.getSize() | |
| 85 | local adjX,adjY = (centerMonc and (sxX)) and (scX) or 0 | |
| 86 | local ntCX,ntCY = monc.oldterm.getCursorPos() | |
| 87 | if v.getSize() then | |
| 88 | v.setCursorPos(ntCX+adjX,ntCY+adjY) | |
| 89 | end | |
| 90 | end | |
| 91 | end | |
| 92 | monc.term.setVisible = function(...) | |
| 93 | --monitors do not have a setVisible function, for some reason | |
| 94 | monc.oldterm.setVisible(...) | |
| 95 | end | |
| 96 | monc.term.write = function(text) | |
| 97 | monc.oldterm.write(text) | |
| 98 | local sx,sy = monc.oldterm.getSize() | |
| 99 | for k,v in pairs(monc.monitors) do | |
| 100 | if v.getSize() then | |
| 101 | local cx,cy = v.getCursorPos() | |
| 102 | if cy > sy then | |
| 103 | --v.setCursorPos(cx,sy) | |
| 104 | break | |
| 105 | else | |
| 106 | v.write(tostring(text):sub(1,(sx-cx)+1)) | |
| 107 | end | |
| 108 | end | |
| 109 | end | |
| 110 | end | |
| 111 | monc.term.clearLine = function() | |
| 112 | monc.oldterm.clearLine() | |
| 113 | local sx,sy = monc.oldterm.getSize() | |
| 114 | for k,v in pairs(monc.monitors) do | |
| 115 | if v.getSize() then | |
| 116 | local cx,cy = v.getCursorPos() | |
| 117 | if cy > sy then | |
| 118 | break | |
| 119 | else | |
| 120 | v.setCursorPos(1,cy) | |
| 121 | v.write((" "):rep(sx))
| |
| 122 | v.setCursorPos(cx,cy) | |
| 123 | end | |
| 124 | end | |
| 125 | end | |
| 126 | end | |
| 127 | monc.term.clear = function() | |
| 128 | monc.oldterm.clear() | |
| 129 | local sx,sy = monc.oldterm.getSize() | |
| 130 | for k,v in pairs(monc.monitors) do | |
| 131 | if v.getSize() then | |
| 132 | local cx,cy = v.getCursorPos() | |
| 133 | for y = 1, sy do | |
| 134 | v.setCursorPos(1,y) | |
| 135 | v.write((" "):rep(sx))
| |
| 136 | end | |
| 137 | v.setCursorPos(cx,cy) | |
| 138 | end | |
| 139 | end | |
| 140 | end | |
| 141 | monc.term.blit = function(text,tx,bg) | |
| 142 | monc.oldterm.blit(text,tx,bg) | |
| 143 | local sx,sy = monc.oldterm.getSize() | |
| 144 | for k,v in pairs(monc.monitors) do | |
| 145 | if v.getSize() then | |
| 146 | local cx,cy = v.getCursorPos() | |
| 147 | if cy > sy then | |
| 148 | break | |
| 149 | else | |
| 150 | v.blit(tostring(text):sub(1,1+sx-cx), tostring(tx):sub(1,1+sx-cx), tostring(bg):sub(1,1+sx-cx)) | |
| 151 | end | |
| 152 | end | |
| 153 | end | |
| 154 | end | |
| 155 | monc.term.setCursorBlink = function(...) | |
| 156 | monc.oldterm.setCursorBlink(...) | |
| 157 | for k,v in pairs(monc.monitors) do | |
| 158 | if v.getSize() then | |
| 159 | v.setCursorBlink(...) | |
| 160 | end | |
| 161 | end | |
| 162 | end | |
| 163 | monc.term.isColor = function() | |
| 164 | for k,v in pairs(monc.monitors) do | |
| 165 | if v.getSize() then | |
| 166 | if not v.isColor() then | |
| 167 | return false | |
| 168 | end | |
| 169 | end | |
| 170 | end | |
| 171 | return monc.oldterm.isColor() | |
| 172 | end | |
| 173 | monc.term.scroll = function(amount) | |
| 174 | monc.oldterm.scroll(amount) | |
| 175 | local sx,sy = monc.oldterm.getSize() | |
| 176 | for k,v in pairs(monc.monitors) do | |
| 177 | if v.getSize() then | |
| 178 | local lastbg = monc.oldterm.getBackgroundColor() | |
| 179 | if amount > 0 then v.setBackgroundColor(colors.black) end | |
| 180 | v.scroll(amount) | |
| 181 | v.setBackgroundColor(lastbg) | |
| 182 | if amount > 0 then | |
| 183 | local bg = v.getBackgroundColor() | |
| 184 | local cx,cy = v.getCursorPos() | |
| 185 | for a = 1, math.abs(amount) do | |
| 186 | v.setCursorPos(1,sy-(a-1)) | |
| 187 | v.clearLine() | |
| 188 | end | |
| 189 | v.setCursorPos(cx,cy) | |
| 190 | v.setBackgroundColor(bg) | |
| 191 | else | |
| 192 | for a = 1, math.abs(amount) do | |
| 193 | v.setBackgroundColor(colors.black) | |
| 194 | v.setCursorPos(1,sy+a) | |
| 195 | v.clearLine() | |
| 196 | end | |
| 197 | end | |
| 198 | end | |
| 199 | v.setCursorPos(monc.oldterm.getCursorPos()) | |
| 200 | end | |
| 201 | end | |
| 202 | monc.term.setTextColor = function(...) | |
| 203 | monc.oldterm.setTextColor(...) | |
| 204 | for k,v in pairs(monc.monitors) do | |
| 205 | if v.getSize() then | |
| 206 | v.setTextColor(...) | |
| 207 | end | |
| 208 | end | |
| 209 | end | |
| 210 | monc.term.setBackgroundColor = function(...) | |
| 211 | monc.oldterm.setBackgroundColor(...) | |
| 212 | for k,v in pairs(monc.monitors) do | |
| 213 | if v.getSize() then | |
| 214 | v.setBackgroundColor(...) | |
| 215 | end | |
| 216 | end | |
| 217 | end | |
| 218 | monc.term.getTextColor = function() | |
| 219 | return monc.oldterm.getTextColor() | |
| 220 | end | |
| 221 | monc.term.getBackgroundColor = function() | |
| 222 | return monc.oldterm.getBackgroundColor() | |
| 223 | end | |
| 224 | monc.term.setTextScale = function(...) | |
| 225 | for k,v in pairs(monc.monitors) do | |
| 226 | if v.getSize() then | |
| 227 | v.setTextScale(...) | |
| 228 | end | |
| 229 | end | |
| 230 | end | |
| 231 | --[[ | |
| 232 | monc.term.redirect = function(target) | |
| 233 | --local old = monc.oldterm | |
| 234 | --monc.oldterm = target | |
| 235 | --return old | |
| 236 | monc.oldterm = term.current() | |
| 237 | return term.current() -- ehhhh | |
| 238 | end | |
| 239 | --]] | |
| 240 | monc.term.native = function() | |
| 241 | return monc.origterm | |
| 242 | end | |
| 243 | monc.term.setTextColour = monc.term.setTextColor | |
| 244 | monc.term.setBackgroundColour = monc.term.setBackgroundColor | |
| 245 | monc.term.getTextColour = monc.term.getTextColor | |
| 246 | monc.term.getBackgroundColour = monc.term.getBackgroundColor | |
| 247 | monc.term.isColour = monc.term.isColor | |
| 248 | ||
| 249 | end | |
| 250 | ||
| 251 | local displayHelp = function() | |
| 252 | local helpdata = [[ | |
| 253 | Monc 2.0 - Computer/Monitor mirror | |
| 254 | [optional argument] <required argument> | |
| 255 | Monitor list is stored in memory only. | |
| 256 | >monc add/remove <monitor1> [monitor2] ... | |
| 257 | >monc list | |
| 258 | >monc help | |
| 259 | >monc setsize <size> [monitor] | |
| 260 | >monc [on/off] | |
| 261 | >monc ... -p <program> [argument1] ...]] | |
| 262 | print(helpdata) | |
| 263 | end | |
| 264 | ||
| 265 | local tArg = {...}
| |
| 266 | if tArg[1] == "help" then | |
| 267 | displayHelp() | |
| 268 | end | |
| 269 | ||
| 270 | local eugh = 4 | |
| 271 | if tArg[1] == "add" then | |
| 272 | local newmons = {}
| |
| 273 | for a = 2, #tArg do | |
| 274 | if tArg[a] == "-p" then | |
| 275 | break | |
| 276 | else | |
| 277 | newmons[#newmons+1] = tArg[a] | |
| 278 | end | |
| 279 | end | |
| 280 | for a = 1, #newmons do | |
| 281 | monname = newmons[a] | |
| 282 | newmon = peripheral.wrap(monname) | |
| 283 | if not newmon then | |
| 284 | return print("'"..monname.."' doesn't exist.")
| |
| 285 | elseif peripheral.getType(monname) ~= "monitor" then | |
| 286 | return print("'"..monname.."' is not a monitor.") --idiot
| |
| 287 | end | |
| 288 | monc.addMonitor(newmon,monname) | |
| 289 | end | |
| 290 | write("Monitor")
| |
| 291 | if #newmons ~= 1 then write("s") end
| |
| 292 | print(" added to list.")
| |
| 293 | elseif tArg[1] == "delete" or tArg[1] == "remove" then | |
| 294 | local delmons = {}
| |
| 295 | for a = 2, #tArg do | |
| 296 | if tArg[a] == "-p" then | |
| 297 | break | |
| 298 | else | |
| 299 | delmons[#delmons+1] = tArg[a] | |
| 300 | end | |
| 301 | end | |
| 302 | for a = 1, #delmons do | |
| 303 | local delname = delmons[a] | |
| 304 | if monc.monitors[delname] then | |
| 305 | monc.removeMonitor(delname) | |
| 306 | else | |
| 307 | print("Skipping nonexistant '"..delname.."'.")
| |
| 308 | end | |
| 309 | end | |
| 310 | write("Deleted monitor")
| |
| 311 | if #delmons > 1 then write("s") end
| |
| 312 | print(" from list.")
| |
| 313 | elseif tArg[1] == "list" then | |
| 314 | local allperiphs = peripheral.getNames() | |
| 315 | local allmons = {}
| |
| 316 | for a = 1, #allperiphs do | |
| 317 | if peripheral.getType(allperiphs[a]) == "monitor" then | |
| 318 | allmons[#allmons+1] = allperiphs[a] | |
| 319 | end | |
| 320 | end | |
| 321 | if #allmons == 0 then | |
| 322 | print("No monitors found.")
| |
| 323 | else | |
| 324 | for a = 1, #allmons do | |
| 325 | if monc.monitors[allmons[a]] then | |
| 326 | write(" ON ")
| |
| 327 | else | |
| 328 | write("OFF ")
| |
| 329 | end | |
| 330 | print("\""..allmons[a].."\"")
| |
| 331 | end | |
| 332 | end | |
| 333 | local good = false --checks for any monitors on the list that were disconnected | |
| 334 | for k,v in pairs(monc.monitors) do | |
| 335 | for a = 1, #allmons do | |
| 336 | if allmons[a] == k then | |
| 337 | good = true | |
| 338 | break | |
| 339 | end | |
| 340 | end | |
| 341 | if not good then | |
| 342 | write("DIS ")
| |
| 343 | print("\""..k.."\"")
| |
| 344 | end | |
| 345 | end | |
| 346 | elseif tArg[1] == "setsize" then | |
| 347 | if not tonumber(tArg[2]) then | |
| 348 | print("Size must be a number.")
| |
| 349 | elseif tonumber(tArg[2]) < 0.5 or tonumber(tArg[2]) > 5 then | |
| 350 | print("Size must be between 0.5 and 5 inclusive.")
| |
| 351 | end | |
| 352 | if tArg[3] then | |
| 353 | if not monc.monitors[tArg[3]] then | |
| 354 | print("No such monitor.")
| |
| 355 | else | |
| 356 | monc.monitors[tArg[3]].setTextScale(tonumber(tArg[2]) or 1) | |
| 357 | end | |
| 358 | else | |
| 359 | for k,v in pairs(monc.monitors) do | |
| 360 | v.setTextScale(tonumber(tArg[2]) or 1) | |
| 361 | end | |
| 362 | end | |
| 363 | write("Resized monitor")
| |
| 364 | if not tArg[3] then | |
| 365 | if getTableSize(monc.monitors) ~= 1 then | |
| 366 | write("s")
| |
| 367 | end | |
| 368 | end | |
| 369 | print(".")
| |
| 370 | elseif tArg[1] == "on" then | |
| 371 | if monc.active then eugh = 3 else eugh = 1 end | |
| 372 | elseif tArg[1] == "off" then | |
| 373 | if not monc.active then eugh = 3 else eugh = 1 end | |
| 374 | elseif tArg[1] == "toggle" then | |
| 375 | eugh = 1 | |
| 376 | elseif tArg[1] == "moo" then | |
| 377 | local mooMsgs = {
| |
| 378 | "There are no Easter Eggs in this program.", | |
| 379 | "There really are no Easter Eggs in this program.", | |
| 380 | "Didn't I already tell you there are no easter eggs in this program?", | |
| 381 | "Stop it!", | |
| 382 | "Okay, okay, if I give you an Easter Egg, will you go away?", | |
| 383 | [[Alright, you win. | |
| 384 | ||
| 385 | /----\ | |
| 386 | -------/ \ | |
| 387 | / \ | |
| 388 | / | | |
| 389 | -----------------/ --------\ | |
| 390 | ----------------------------------------------]], | |
| 391 | "What is it? It's an elephant being eaten by a snake, of course.", | |
| 392 | } | |
| 393 | local mooLvl = 1 | |
| 394 | for a = 1, #tArg do | |
| 395 | if tArg[a]:sub(1,1) == "-" and tArg[a]:gsub("v","") == "-" then
| |
| 396 | mooLvl = mooLvl + #tArg[a]:sub(2) | |
| 397 | end | |
| 398 | end | |
| 399 | print(mooMsgs[mooLvl < #mooMsgs and mooLvl or #mooMsgs]) | |
| 400 | elseif not tArg[1] then | |
| 401 | eugh = 2 | |
| 402 | end | |
| 403 | ||
| 404 | local setTheTerm = function(newterm) | |
| 405 | for k,v in pairs(newterm) do | |
| 406 | term[k] = v | |
| 407 | end | |
| 408 | end | |
| 409 | ||
| 410 | local toggleMonc = function(active) | |
| 411 | if not monc.active then | |
| 412 | monc.active = true | |
| 413 | setTheTerm(monc.term) | |
| 414 | else | |
| 415 | monc.active = false | |
| 416 | setTheTerm(monc.oldterm) | |
| 417 | end | |
| 418 | end | |
| 419 | --time for the craaaaaazy stuff | |
| 420 | if eugh == 1 then | |
| 421 | toggleMonc() | |
| 422 | print("Monc "..(monc.active and "activated!" or "deactivated."))
| |
| 423 | elseif eugh == 2 then | |
| 424 | print("Do 'monc toggle/on/off' to use, or 'monc help' for more info.")
| |
| 425 | elseif eugh == 3 then | |
| 426 | print("It's already in that state.")
| |
| 427 | end | |
| 428 | ||
| 429 | for a = 1, #tArg do | |
| 430 | if tArg[a] == "-p" then | |
| 431 | local filerunname = {}
| |
| 432 | for b = a+1, #tArg do | |
| 433 | filerunname[#filerunname+1] = tArg[b] | |
| 434 | end | |
| 435 | if shell then | |
| 436 | shell.run(unpack(filerunname)) | |
| 437 | else | |
| 438 | dofile(unpack(filerunname)) | |
| 439 | end | |
| 440 | break | |
| 441 | end | |
| 442 | end |