start work on a livedisk
init.lua should run correctly in the absence of any other file (except a user-created /etc/init.lua), so things like the terminal and lua repl will come with the livedisk insteadmain
parent
50c749c2d1
commit
3c2a9f50d5
@ -0,0 +1,72 @@
|
|||||||
|
local gpu, screen = ...
|
||||||
|
checkArg(1, gpu, 'string')
|
||||||
|
checkArg(2, screen, 'string')
|
||||||
|
|
||||||
|
local keyboards = component.invoke(screen, 'getKeyboards')
|
||||||
|
local function isAttachedKeyboard(address)
|
||||||
|
checkArg(1, address, 'string')
|
||||||
|
for i, kb in ipairs(keyboards) do
|
||||||
|
if kb == address then
|
||||||
|
return i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
gpu = component.proxy(gpu)
|
||||||
|
gpu.bind(screen)
|
||||||
|
gpu.setForeground(0xffffff)
|
||||||
|
gpu.setBackground(0x000000)
|
||||||
|
local w, h = gpu.getResolution()
|
||||||
|
gpu.fill(1, 1, w, h, ' ')
|
||||||
|
gpu.set(1, 1, string.format('%s // %s', _VERSION, _OSVERSION))
|
||||||
|
|
||||||
|
|
||||||
|
local cmd, x, y = '', 1, 2
|
||||||
|
|
||||||
|
local function onKey(ch, code)
|
||||||
|
gpu.bind(screen)
|
||||||
|
if code == 14 then --backspace
|
||||||
|
if cmd == '' then return end
|
||||||
|
local last = cmd:sub(-1)
|
||||||
|
local widthLast = unicode.charWidth(last)
|
||||||
|
gpu.fill(x - widthLast, y, widthLast, 1, ' ')
|
||||||
|
x = x - widthLast
|
||||||
|
cmd = cmd:sub(1, -2)
|
||||||
|
elseif code == 28 then --enter
|
||||||
|
gpu.set(1, y + 1, '> ')
|
||||||
|
gpu.set(3, y + 1, cmd)
|
||||||
|
cmd = ''
|
||||||
|
x, y = 1, y + 2
|
||||||
|
else
|
||||||
|
ch = unicode.char(ch)
|
||||||
|
gpu.set(x, y, ch)
|
||||||
|
cmd = cmd .. ch
|
||||||
|
x = x + unicode.charWidth(ch)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tick(signal, addr, ...)
|
||||||
|
if signal == 'component_removed' then
|
||||||
|
if addr == screen then
|
||||||
|
return --screen went away, exit
|
||||||
|
elseif (...) == 'keyboard' then
|
||||||
|
--intentionally don't call getKeyboards here; if the screen was removed at the same time but the keyboard's
|
||||||
|
--component_removed signal was delivered first, invoking a method on the screen will crash
|
||||||
|
local idx = isAttachedKeyboard(addr)
|
||||||
|
if idx then table.remove(keyboards, idx) end
|
||||||
|
end
|
||||||
|
elseif signal == 'component_added' then
|
||||||
|
if (...) == 'keyboard' then
|
||||||
|
keyboards = component.invoke(screen, 'getKeyboards')
|
||||||
|
end
|
||||||
|
elseif signal == 'key_down' and isAttachedKeyboard(addr) then
|
||||||
|
onKey(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
return tick(computer.pullSignal())
|
||||||
|
end
|
||||||
|
|
||||||
|
return tick(computer.pullSignal())
|
||||||
|
|
||||||
|
-- vi: set ts=2:
|
@ -0,0 +1,28 @@
|
|||||||
|
--/etc/init.lua for the kitn livedisk and installer
|
||||||
|
|
||||||
|
--find highest-tier gpu available
|
||||||
|
local bestGpu, bestMem
|
||||||
|
for addr in component.list('gpu') do
|
||||||
|
local mem = component.invoke(addr, 'totalMemory')
|
||||||
|
if mem > (bestMem or 0) then
|
||||||
|
bestGpu, bestMem = addr, mem
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(bestGpu, 'please install a gpu or apu to continue')
|
||||||
|
|
||||||
|
for screen in component.list('screen') do
|
||||||
|
local proc, err = kitn.createProcess('/bin/tty.lua', bestGpu, screen)
|
||||||
|
if not proc then error('spawn for ' .. screen:sub(1, 4) .. ' failed: ' .. err) end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tick(signal, addr, ty)
|
||||||
|
if signal == 'component_added' and ty == 'screen' then
|
||||||
|
local proc, err = kitn.createProcess('/bin/tty.lua', bestGpu, addr)
|
||||||
|
if not proc then error('spawn for ' .. screen:sub(1, 4) .. ' failed: ' .. err) end
|
||||||
|
end
|
||||||
|
|
||||||
|
return tick(computer.pullSignal())
|
||||||
|
end
|
||||||
|
|
||||||
|
return tick(computer.pullSignal())
|
Loading…
Reference in New Issue