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 |