From ad32dcc2df408567782f4cbcf855123711ceeee1 Mon Sep 17 00:00:00 2001 From: "kepler155c@gmail.com" Date: Mon, 11 May 2020 17:26:43 -0600 Subject: [PATCH] updates for environment handling changes --- common/Appstore.lua | 5 +- common/Events.lua | 2 +- common/Turtles.lua | 6 +- common/debugMonitor.lua | 1 + common/edit.lua | 4 +- common/etc/scripts/goHome | 1 - common/etc/scripts/moveTo.lua | 2 - common/etc/scripts/setHome | 1 - common/etc/scripts/summon | 3 - common/recorder.lua | 2 +- monitor/mwm.lua | 18 ++--- neural/Scanner.lua | 2 +- neural/autorun/splash.lua | 2 +- neural/nwm.lua | 134 ++++++++++++++++++++++--------- screenSaver/autorun/saver.lua | 2 +- secure/autorun/lock.lua | 144 +++++++++++++++++----------------- secure/unlock.lua | 20 ++--- 17 files changed, 200 insertions(+), 149 deletions(-) diff --git a/common/Appstore.lua b/common/Appstore.lua index 7e0ad85..8e87ef1 100644 --- a/common/Appstore.lua +++ b/common/Appstore.lua @@ -57,7 +57,7 @@ local function downloadApp(app) end local function runApp(app, checkExists, ...) - local env = shell.makeEnv() + local env = shell.makeEnv(_ENV) local path, fn local args = { ... } @@ -83,9 +83,8 @@ local function runApp(app, checkExists, ...) end end - multishell.openTab({ + multishell.openTab(_ENV, { title = app.name, - env = env, path = path, fn = fn, focused = true, diff --git a/common/Events.lua b/common/Events.lua index ae58ca2..f2539af 100644 --- a/common/Events.lua +++ b/common/Events.lua @@ -67,7 +67,7 @@ local page = UI.Page { self.menuBar:draw() elseif event.type == 'grid_select' then - multishell.openTab({ + multishell.openTab(_ENV, { path = 'sys/apps/Lua.lua', args = { event.selected }, focused = true, diff --git a/common/Turtles.lua b/common/Turtles.lua index 07d89e6..66c6a54 100644 --- a/common/Turtles.lua +++ b/common/Turtles.lua @@ -223,7 +223,7 @@ page = UI.Page { fn = 'turtle.turnRight', }, info = UI.TextArea { - x = 15, y = 2, + x = 15, y = 1, inactive = true, }, showBlocks = function(self) @@ -240,13 +240,13 @@ page = UI.Page { return string.format('%s\n%s\n%s', bu, bf, bd) ]] - local s, m = self:runFunction(script, true) + local s, m = page:runFunction(script, true) self.info:setText(s or m) end, eventHandler = function(self, event) if event.type == 'button_press' then if event.button.fn then - self:runFunction(event.button.fn, event.button.nowrap) + page:runFunction(event.button.fn, event.button.nowrap) self:showBlocks() end return true diff --git a/common/debugMonitor.lua b/common/debugMonitor.lua index d198f77..949375a 100644 --- a/common/debugMonitor.lua +++ b/common/debugMonitor.lua @@ -24,6 +24,7 @@ _G._syslog = function(...) local oldTerm = term.redirect(mon) Util.print(...) term.redirect(oldTerm) + oldDebug(...) end repeat diff --git a/common/edit.lua b/common/edit.lua index ee61066..d702e1f 100644 --- a/common/edit.lua +++ b/common/edit.lua @@ -1024,7 +1024,7 @@ actions = { else local fn, msg = load(_concat(tLines, '\n'), fileInfo.path) if fn then - multishell.openTab({ + multishell.openTab(_ENV, { fn = fn, focused = true, title = fs.getName(fileInfo.path), @@ -1544,5 +1544,5 @@ local s, m = pcall(function() UI:start() end) if not s then actions.save('/crash.txt') print('Editor has crashed. File saved as /crash.txt') - error(m) + error(m, -1) end diff --git a/common/etc/scripts/goHome b/common/etc/scripts/goHome index 94fd138..6e12c25 100644 --- a/common/etc/scripts/goHome +++ b/common/etc/scripts/goHome @@ -1,4 +1,3 @@ -_G.requireInjector(_ENV) local config = require('opus.config').load('gps') if config.home then if turtle.enableGPS() then diff --git a/common/etc/scripts/moveTo.lua b/common/etc/scripts/moveTo.lua index 72d597a..f62520e 100644 --- a/common/etc/scripts/moveTo.lua +++ b/common/etc/scripts/moveTo.lua @@ -1,8 +1,6 @@ local turtle = _G.turtle turtle.run(function() - _G.requireInjector(_ENV) - local GPS = require('opus.gps') if not turtle.enableGPS() then diff --git a/common/etc/scripts/setHome b/common/etc/scripts/setHome index be69170..2b347a7 100644 --- a/common/etc/scripts/setHome +++ b/common/etc/scripts/setHome @@ -1,4 +1,3 @@ -_G.requireInjector(_ENV) local Config = require('opus.config') local pt = turtle.enableGPS() if pt then diff --git a/common/etc/scripts/summon b/common/etc/scripts/summon index 66dcded..17c514c 100644 --- a/common/etc/scripts/summon +++ b/common/etc/scripts/summon @@ -1,7 +1,4 @@ local function summon(id) - - _G.requireInjector(_ENV) - local GPS = require('opus.gps') local Point = require('opus.point') local Socket = require('opus.socket') diff --git a/common/recorder.lua b/common/recorder.lua index 86dfc3c..bd5e7d5 100644 --- a/common/recorder.lua +++ b/common/recorder.lua @@ -61,7 +61,7 @@ end if options.daemon then _G.device.keyboard.addHotkey('control-P', function() - multishell.openTab({ + multishell.openTab(_ENV, { path = 'sys/apps/shell.lua', args = { arg[0], '--noResize', '--rawOutput', 'recorder.gif' }, }) diff --git a/monitor/mwm.lua b/monitor/mwm.lua index 9eda98f..73ec2ee 100644 --- a/monitor/mwm.lua +++ b/monitor/mwm.lua @@ -1,3 +1,4 @@ +local Alt = require('opus.alternate') local Terminal = require('opus.terminal') local trace = require('opus.trace') local Util = require('opus.util') @@ -25,8 +26,7 @@ local monName = args[1] local running local parentMon -local defaultEnv = Util.shallowCopy(_ENV) -defaultEnv.multishell = multishell +_ENV.multishell = multishell if monName then parentMon = peripheral.wrap(monName) or syntax() else @@ -93,8 +93,8 @@ end --[[ A runnable process ]]-- local Process = { } -function Process:new(args) - args.env = args.env or Util.shallowCopy(defaultEnv) +function Process:new(env, args) + args.env = shell.makeEnv(env) args.width = args.width or termDim.width args.height = args.height or termDim.height @@ -329,7 +329,7 @@ function multishell.getTabs() end function multishell.launch(env, file, ...) - return multishell.openTab({ + return multishell.openTab(env, { path = file, env = env, title = 'shell', @@ -337,8 +337,8 @@ function multishell.launch(env, file, ...) }) end -function multishell.openTab(tabInfo) - local process = Process:new(tabInfo) +function multishell.openTab(env, tabInfo) + local process = Process:new(env, tabInfo) table.insert(processes, 1, process) @@ -380,7 +380,7 @@ function multishell.loadSession(filename) local config = Util.readTable(filename) if config then for k = #config, 1, -1 do - multishell.openTab(config[k]) + multishell.openTab(_ENV, config[k]) end end end @@ -497,7 +497,7 @@ local function addShell() process.co = coroutine.create(function() print('To run a program on the monitor, type "fg "') print('To quit, type "exit"') - os.run(Util.shallowCopy(defaultEnv), shell.resolveProgram('shell')) + os.run(shell.makeEnv(_ENV), Alt.get('shell')) multishell.stop() end) diff --git a/neural/Scanner.lua b/neural/Scanner.lua index 4dd6be5..5debfd7 100644 --- a/neural/Scanner.lua +++ b/neural/Scanner.lua @@ -188,7 +188,7 @@ function page:eventHandler(event) self:scan() elseif event.type == 'grid_select' and event.element == self.detail.grid then - multishell.openTab({ + multishell.openTab(_ENV, { path = 'sys/apps/Lua.lua', args = { event.selected }, focused = true, diff --git a/neural/autorun/splash.lua b/neural/autorun/splash.lua index ac92708..e5b32d9 100644 --- a/neural/autorun/splash.lua +++ b/neural/autorun/splash.lua @@ -50,7 +50,7 @@ local function update() end end -kernel.run({ +kernel.run(_ENV, { hidden = true, fn = update, }) diff --git a/neural/nwm.lua b/neural/nwm.lua index 0fa4d29..6100cd0 100644 --- a/neural/nwm.lua +++ b/neural/nwm.lua @@ -11,10 +11,11 @@ local Glasses = require('neural.glasses') local UI = require('opus.ui') local Util = require('opus.util') -local fs = _G.fs -local kernel = _G.kernel -local multishell = _ENV.multishell -local shell = _ENV.shell +local device = _G.device +local fs = _G.fs +local kernel = _G.kernel +local shell = _ENV.shell +local window = _G.window local config = Config.load('nwm', { session = { } }) @@ -22,6 +23,14 @@ local config = Config.load('nwm', { session = { } }) local scale = .5 local xs, ys = 6 * scale, 9 * scale local dragging +local canvas = device['plethora:glasses'].canvas() +local cw, ch = canvas.getSize() +local opacity = 127 + +local multishell = Util.shallowCopy(_ENV.multishell) +_ENV.multishell = multishell + +cw, ch = cw / xs, ch / ys local events = { glasses_click = 'mouse_click', @@ -42,7 +51,7 @@ local function hook(e, eventData) elseif e == 'glasses_drag' then local dx = x - dragging.ax local dy = y - dragging.ay - dragging.tab.window.move(dragging.wx + dx, dragging.wy + dy) + dragging.tab.gwindow.move(dragging.wx + dx, dragging.wy + dy) dragging.tab.titleBar.move(dragging.wx + dx, dragging.wy + dy - 1) dragging.tab.wmargs.x = dragging.wx + dx @@ -53,9 +62,9 @@ local function hook(e, eventData) end for _,tab in ipairs(kernel.routines) do - if tab.window.type == 'glasses' then - local wx, wy = tab.window.getPosition() - local ww, wh = tab.window.getSize() + if tab.gwindow then + local wx, wy = tab.gwindow.getPosition() + local ww, wh = tab.gwindow.getSize() if x >= wx and x <= wx + ww and y > wy and y < wy + wh then clicked = tab @@ -75,46 +84,90 @@ local function hook(e, eventData) if clicked then if clicked ~= current then - clicked.window.raise() + clicked.gwindow.raise() kernel.raise(clicked.uid) end kernel.event(events[e], { - eventData[1], x, y, clicked.window.side, + eventData[1], x, y, clicked.gwindow.side, }) end return true end -local function run(args) +function multishell.openTab(env, tab) + if not tab.wmargs then + tab.wmargs = { + x = math.random(1, cw - 51 + 1), + y = math.random(1, ch - 19 + 1), + width = 51, + height = 19, + opacity = opacity, + path = tab.path, + args = tab.args, + } + table.insert(config.session, tab.wmargs) + Config.update('nwm', config) + else + tab.path = tab.wmargs.path + tab.args = tab.wmargs.args + end + + if tab.path ~= 'sys/apps/shell.lua' then + if tab.args and #tab.args > 0 then + tab.args = { tab.path .. ' ' .. table.concat(tab.args or { }, ' ') } + else + tab.args = { tab.path } + end + tab.path = 'sys/apps/shell.lua' + end + + local wmargs = tab.wmargs + local titleBar = Glasses.create({ - x = args.x, - y = args.y - 1, + x = wmargs.x, + y = wmargs.y - 1, height = 1, - width = args.width, - opacity = args.opacity, + width = wmargs.width, + opacity = wmargs.opacity, }) titleBar.canvas:clear('yellow') - titleBar.canvas:write(1, 1, ' ' .. fs.getName(args.path), nil, 'black') - titleBar.canvas:write(args.width - 2, 1, ' x ', nil, 'black') + titleBar.canvas:write(1, 1, ' ' .. fs.getName(tab.path), nil, 'black') + titleBar.canvas:write(wmargs.width - 2, 1, ' x ', nil, 'black') titleBar.redraw() - kernel.run({ - path = args.path, - args = args.args, - hidden = true, - title = fs.getName(args.path), - onExit = function(self) - Util.removeByValue(config.session, args) - Config.update('nwm', config) - self.window.destroy() - titleBar.destroy() - end, - window = Glasses.create(args), - titleBar = titleBar, - wmargs = args, - }) + if not tab.title and tab.path then + tab.title = fs.getName(tab.path):match('([^%.]+)') + end + tab.hidden = true + tab.title = tab.title or 'untitled' + + local w, h = device.terminal.getSize() + tab.window = window.create(device.terminal, 1, 2, w, h - 1, false) + tab.gwindow = Glasses.create(wmargs) + tab.terminal = tab.gwindow + tab.titleBar = titleBar + tab.onExit = tab.onExit or function(self) + Util.removeByValue(config.session, tab.wmargs) + Config.update('nwm', config) + self.gwindow.destroy() + self.titleBar.destroy() + end + + local routine, message = kernel.run(env, tab) + return routine and routine.uid, message +end + +function multishell.setTitle(tabId, title) + local tab = kernel.find(tabId) + if tab then + tab.title = title + tab.titleBar.canvas:clear('yellow') + tab.titleBar.canvas:write(1, 1, ' ' .. title, nil, 'black') + tab.titleBar.canvas:write(tab.wmargs.width - 2, 1, ' x ', nil, 'black') + tab.titleBar.redraw() + end end UI:setPage(UI.Page { @@ -131,6 +184,12 @@ UI:setPage(UI.Page { formLabel = 'Opacity', formKey = 'opacity', formIndex = 3, labelWidth = 3, transform = math.floor, + eventHandler = function(self, event) + if event.type == 'slider_update' then + opacity = event.value + end + return UI.Slider.eventHandler(self, event) + end, }, UI.Text { x = 10, y = 5, @@ -168,14 +227,15 @@ UI:setPage(UI.Page { if event.type == 'form_complete' then local opts = Util.shallowCopy(event.values) local words = Util.split(opts.run, '(.-) ') - opts.path = shell.resolveProgram(table.remove(words, 1)) - if not opts.path then + words[1] = shell.resolveProgram(words[1]) + if not words[1] then self.notification:error('Invalid program') else - opts.args = #words > 0 and words + opts.path = 'sys/apps/shell.lua' + opts.args = table.concat(words, ' ') table.insert(config.session, opts) Config.update('nwm', config) - run(opts) + multishell.openTab(_ENV, { wmargs = opts }) self.notification:success('Started program') end @@ -190,7 +250,7 @@ local hookEvents = Util.keys(events) kernel.hook(hookEvents, hook) for _,v in pairs(config.session) do - run(v) + multishell.openTab(_ENV, { wmargs = v }) end UI:start() diff --git a/screenSaver/autorun/saver.lua b/screenSaver/autorun/saver.lua index db33bc6..318968a 100644 --- a/screenSaver/autorun/saver.lua +++ b/screenSaver/autorun/saver.lua @@ -31,7 +31,7 @@ local function showScreenSaver() local w, h = kernel.terminal.getSize() local win = window.create(kernel.terminal, 1, 1, w, h, true) - saverUid = multishell.openTab({ + saverUid = multishell.openTab(_ENV, { path = saver, focused = true, title = 'Saver', diff --git a/secure/autorun/lock.lua b/secure/autorun/lock.lua index eadff4c..c71ac38 100644 --- a/secure/autorun/lock.lua +++ b/secure/autorun/lock.lua @@ -7,109 +7,107 @@ local keyboard = device.keyboard local multishell = _ENV.multishell if not multishell then - return + return end local config = Config.load('secure', { enabled = false, - timeout = 60, + timeout = 60, }) local timer = config.enabled and os.startTimer(config.timeout) local function buildLockScreen() - _G.requireInjector(_ENV) + local Event = require('opus.event') + local Security = require('opus.security') + local SHA = require('opus.crypto.sha2') + local UI = require('opus.ui') - local Event = require('opus.event') - local Security = require('opus.security') - local SHA = require('opus.crypto.sha2') - local UI = require('opus.ui') + local counter = .1 - local counter = .1 + local page = UI.Page { + pass = UI.TextEntry { + x = 10, ex = -10, y = "50%", + limit = 32, + mask = true, + shadowText = 'password', + accelerators = { + enter = 'password', + }, + }, + notification = UI.Notification(), + } + function page:eventHandler(event) + if event.type == 'password' then - local page = UI.Page { - pass = UI.TextEntry { - x = 10, ex = -10, y = "50%", - limit = 32, - mask = true, - shadowText = 'password', - accelerators = { - enter = 'password', - }, - }, - notification = UI.Notification(), - } - function page:eventHandler(event) - if event.type == 'password' then + if self.pass.value and + #self.pass.value > 0 and + Security.verifyPassword(SHA.compute(self.pass.value)) then - if self.pass.value and - #self.pass.value > 0 and - Security.verifyPassword(SHA.compute(self.pass.value)) then + UI:quit() -- valid + else + self.notification:error('Invalid password', math.max(counter, 2)) + self:sync() + os.sleep(counter) + counter = counter * 2 - UI:quit() -- valid - else - self.notification:error('Invalid password', math.max(counter, 2)) - self:sync() - os.sleep(counter) - counter = counter * 2 + self.pass:reset() + end + else + UI.Page.eventHandler(self, event) + end + end - self.pass:reset() - end - else - UI.Page.eventHandler(self, event) - end - end + Event.onTerminate(function() return false end) - Event.onTerminate(function() return false end) + UI:setPage(page) + UI:start() - UI:setPage(page) - UI:start() - - -- restart lock timer - timer = os.startTimer(config.timeout) + -- restart lock timer + timer = os.startTimer(config.timeout) end local function showLockScreen() - timer = nil - multishell.openTab({ - path = 'sys/apps/Lock.lua', - fn = buildLockScreen, - noTerminate = true, - pinned = true, - focused = true, - title = 'Lock', - }) + timer = nil + multishell.openTab(_ENV, { + path = 'sys/apps/Lock.lua', + fn = buildLockScreen, + noTerminate = true, + pinned = true, + focused = true, + title = 'Lock', + }) end keyboard.addHotkey('control-l', function() - if timer then - os.cancelTimer(timer) - showLockScreen() - end + if timer then + os.cancelTimer(timer) + showLockScreen() + end end) kernel.hook({ 'mouse_up', 'mouse_drag', 'key_up', 'mouse_scroll' }, function() - if timer then - os.cancelTimer(timer) - timer = os.startTimer(config.timeout) - end + if timer then + os.cancelTimer(timer) + timer = os.startTimer(config.timeout) + end end) kernel.hook('timer', function(_, eventData) - if timer and eventData[1] == timer then - showLockScreen() - end + if timer and eventData[1] == timer then + showLockScreen() + end end) kernel.hook('config_update', function(_, eventData) - if eventData[1] == 'secure' then - Util.merge(config, eventData[2]) - if timer then - os.cancelTimer(timer) - timer = nil - end - if config.enabled then - timer = os.startTimer(config.timeout) - end - end + if eventData[1] == 'secure' then + Util.merge(config, eventData[2]) + if timer then + os.cancelTimer(timer) + timer = nil + end + if config.enabled then + timer = os.startTimer(config.timeout) + end + end end) diff --git a/secure/unlock.lua b/secure/unlock.lua index 6fc5e58..0cdeb02 100644 --- a/secure/unlock.lua +++ b/secure/unlock.lua @@ -16,15 +16,15 @@ term.setCursorPos(1, 1) term.clear() repeat - local s, m = pcall(function() - local password = Terminal.readPassword('Enter password: ') + local s, m = pcall(function() + local password = Terminal.readPassword('Enter password: ') - if password and Security.verifyPassword(SHA.compute(password)) then - return true - end - error('Invalid password') - end) - if not s and m then - _G.printError(m) - end + if password and Security.verifyPassword(SHA.compute(password)) then + return true + end + error('Invalid password') + end) + if not s and m then + _G.printError(m) + end until s