mirror of
https://github.com/20kdc/OC-KittenOS.git
synced 2024-12-24 09:58:06 +11:00
Loads of documentation & adjustments. I should probably commit more.
This commit is contained in:
parent
3e43cd3aaa
commit
c5b58e79ff
@ -50,6 +50,7 @@ function regenCore()
|
||||
fd.close()
|
||||
busy = false
|
||||
neoux.startDialog("Got the data!", nil, true)
|
||||
window.reset(regenCore())
|
||||
end))
|
||||
table.insert(elems, neoux.tcbutton(6, l + 1, "set", function (window)
|
||||
if busy then return end
|
||||
@ -62,6 +63,7 @@ function regenCore()
|
||||
report = (wasOk and tostring(report)) or "Flash successful.\nI recommend relabelling the EEPROM."
|
||||
busy = false
|
||||
neoux.startDialog(report, nil, true)
|
||||
window.reset(regenCore())
|
||||
end))
|
||||
local function dHandler(set, get, wd)
|
||||
local setter = v[set]
|
||||
@ -85,5 +87,11 @@ end
|
||||
local window = neoux.create(regenCore())
|
||||
|
||||
while running do
|
||||
event.pull()
|
||||
local s = {event.pull()}
|
||||
if (s[1] == "h.component_added" or s[1] == "h.component_removed") and busy then
|
||||
-- Anything important?
|
||||
if s[3] == "gpu" or s[3] == "screen" then
|
||||
window.reset(regenCore())
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -408,13 +408,8 @@ while true do
|
||||
-- always shutdown
|
||||
shutdownFin(shutdownMode)
|
||||
end
|
||||
if s[1] == "h.component_added" then
|
||||
-- Before doing anything, is it worth it?
|
||||
if s[3] == "gpu" or s[3] == "screen" then
|
||||
rescanDevs()
|
||||
end
|
||||
end
|
||||
if s[1] == "h.component_removed" then
|
||||
if s[1] == "h.component_added" or s[1] == "h.component_removed" then
|
||||
-- Anything important?
|
||||
if s[3] == "gpu" or s[3] == "screen" then
|
||||
rescanDevs()
|
||||
end
|
||||
|
@ -410,6 +410,8 @@ local function initializeSystem()
|
||||
else
|
||||
local v, err = neo.executeAsync(steps[w])
|
||||
if not v then
|
||||
neo.emergency(steps[w] .. " STF")
|
||||
neo.emergency(err)
|
||||
table.insert(warnings, steps[w] .. " STF")
|
||||
table.insert(warnings, err)
|
||||
end
|
||||
|
@ -1,3 +1,5 @@
|
||||
-- This is released into the public domain.
|
||||
-- No warranty is provided, implied or otherwise.
|
||||
return {
|
||||
["neo"] = {
|
||||
desc = "KittenOS NEO Kernel & Base Libs",
|
||||
@ -123,7 +125,7 @@ return {
|
||||
},
|
||||
["app-flash"] = {
|
||||
desc = "KittenOS NEO EEPROM Flasher",
|
||||
v = 0,
|
||||
v = 2,
|
||||
deps = {
|
||||
"neo"
|
||||
},
|
||||
|
@ -17,6 +17,16 @@ if ocemu then
|
||||
emergencyFunction = ocemu.log
|
||||
end
|
||||
|
||||
if load(string.dump(function()end)) then
|
||||
-- This is your first and only warning.
|
||||
-- allowBytecode has effects *outside the game.*
|
||||
-- If it is enabled, any program with load can take over your host system.
|
||||
-- I refuse to allow KittenOS NEO to operate in this environment for your safety.
|
||||
-- If you are truly unable to change it, tell someone who can.
|
||||
emergencyFunction("Please set allowBytecode = false in OCEmu config.")
|
||||
error("Please set allowBytecode = false in OC config.")
|
||||
end
|
||||
|
||||
primaryDisk = component.proxy(computer.getBootAddress())
|
||||
|
||||
-- {{time, func, arg1...}...}
|
||||
@ -149,7 +159,7 @@ function ensureType(a, t)
|
||||
end
|
||||
|
||||
function ensurePathComponent(s)
|
||||
if not string.match(s, "^[a-zA-Z0-9_%-%+%,%#%~%@%'%;%[%]%(%)%&%%%$%! %=%{%}%^]+$") then error("chars disallowed") end
|
||||
if not string.match(s, "^[a-zA-Z0-9_%-%+%,%.%#%~%@%'%;%[%]%(%)%&%%%$%! %=%{%}%^]+$") then error("chars disallowed: " .. s) end
|
||||
if s == "." then error("single dot disallowed") end
|
||||
if s == ".." then error("double dot disallowed") end
|
||||
end
|
||||
@ -245,6 +255,7 @@ function loadLibraryInner(library)
|
||||
if l then
|
||||
local ok, al = pcall(l)
|
||||
if ok then
|
||||
al = wrapMeta(al)
|
||||
libraries[library] = al
|
||||
return al
|
||||
else
|
||||
@ -355,6 +366,15 @@ function runProgramPolicy(ipkg, pkg, pid, ...)
|
||||
return true
|
||||
end
|
||||
|
||||
-- This is hidden here to protect you.
|
||||
-- I beg of you, don't remove it.
|
||||
if load(string.dump(function()end)) then
|
||||
local oldLoad = load
|
||||
load = function (c, n, m, ...)
|
||||
return oldLoad(c, n, "t", ...)
|
||||
end
|
||||
end
|
||||
|
||||
function retrieveAccess(perm, pkg, pid)
|
||||
-- Return the access lib and the death callback.
|
||||
|
||||
@ -467,7 +487,8 @@ function start(pkg, ...)
|
||||
|
||||
local function startFromUser(ipkg, ...)
|
||||
ensureType(ipkg, "string")
|
||||
ensurePathComponent(ipkg .. ".lua")
|
||||
local ok, n = pcall(ensurePathComponent, ipkg .. ".lua")
|
||||
if not ok then return nil, n end
|
||||
local k, r = runProgramPolicy(ipkg, pkg, pid, ...)
|
||||
if k then
|
||||
return start(ipkg, pkg, pid, ...)
|
||||
|
@ -1,8 +1,11 @@
|
||||
-- This is released into the public domain.
|
||||
-- No warranty is provided, implied or otherwise.
|
||||
|
||||
-- Braille Neoux Component
|
||||
-- Callbacks :
|
||||
-- Braille Converter & NeoUX component
|
||||
-- While the Neoux part isn't OS-independent,
|
||||
-- the converter itself is. Enjoy.
|
||||
|
||||
-- Braille Neoux Component Callbacks :
|
||||
-- selectable (boolean)
|
||||
-- key(window, update, a, c, d)
|
||||
-- touch(window, update, x, y, button)
|
||||
@ -164,7 +167,7 @@ local function calcLine(x, y, w, span, get, colour)
|
||||
span(x, y, str, bg, fg)
|
||||
end
|
||||
end
|
||||
heldRef = neo.wrapMeta({
|
||||
heldRef = {
|
||||
calcLine = calcLine,
|
||||
new = function (x, y, w, h, cbs, colour)
|
||||
local control
|
||||
@ -189,5 +192,5 @@ heldRef = neo.wrapMeta({
|
||||
}
|
||||
return control
|
||||
end,
|
||||
})
|
||||
}
|
||||
return heldRef
|
||||
|
@ -18,6 +18,7 @@ fmt = {
|
||||
end
|
||||
return t
|
||||
end,
|
||||
-- Expects safeTextFormat'd input
|
||||
fmtText = function (text, w)
|
||||
local nl = text:find("\n")
|
||||
if nl then
|
||||
@ -67,4 +68,4 @@ fmt = {
|
||||
return {fmt.pad(text, w)}
|
||||
end
|
||||
}
|
||||
return neo.wrapMeta(fmt)
|
||||
return fmt
|
||||
|
@ -82,7 +82,10 @@ newNeoux = function (event, neo)
|
||||
return window
|
||||
end
|
||||
-- Padding function
|
||||
neoux.pad = require("fmttext").pad
|
||||
neoux.pad = function (...)
|
||||
local fmt = require("fmttext")
|
||||
return fmt.pad(...)
|
||||
end
|
||||
-- Text dialog formatting function.
|
||||
-- Assumes you've run unicode.safeTextFormat if need be
|
||||
neoux.fmtText = function (...)
|
||||
|
@ -26,12 +26,16 @@ function doSerialize(s)
|
||||
end
|
||||
error("Cannot serialize " .. type(s))
|
||||
end
|
||||
return neo.wrapMeta({
|
||||
return {
|
||||
serialize = function (x) return "return " .. doSerialize(x) end,
|
||||
deserialize = function (s)
|
||||
local r1, r2 = pcall(function() return load(s, "=serial", "t", {})() end)
|
||||
local r1, r2 = pcall(function()
|
||||
return load(s, "=serial", "t", {})()
|
||||
end)
|
||||
if r1 then
|
||||
return r2
|
||||
else
|
||||
return nil, tostring(r2)
|
||||
end
|
||||
end
|
||||
})
|
||||
}
|
||||
|
@ -21,6 +21,10 @@ local actualPolicy = function (pkg, pid, perm)
|
||||
if perm:sub(1, 10) == "x.neo.pub." then
|
||||
return "allow"
|
||||
end
|
||||
-- These signals are harmless, though they identify HW (as does everything in OC...)
|
||||
if perm == "s.h.component_added" or perm == "s.h.component_removed" then
|
||||
return "allow"
|
||||
end
|
||||
-- This is to ensure the prefix naming scheme is FOLLOWED!
|
||||
-- sys- : System, part of KittenOS NEO and thus tries to present a "unified fragmented interface" in 'neo'
|
||||
-- app- : Application - these can have ad-hoc relationships. It is EXPECTED these have a GUI
|
||||
|
@ -33,8 +33,10 @@ return {
|
||||
"docs/kn-sched",
|
||||
"docs/kn-perms",
|
||||
"docs/us-perms",
|
||||
"docs/us-nxapp",
|
||||
"docs/ul-seria",
|
||||
"docs/ul-event",
|
||||
"docs/ul-fmttx",
|
||||
"docs/ul-neoux",
|
||||
"docs/ul-broil",
|
||||
"docs/gp-pedan"
|
||||
|
@ -51,7 +51,11 @@ This is a critical memory management
|
||||
(This also means libraries can have
|
||||
security side-effects, but they
|
||||
always can in any system, arguably,
|
||||
and it's worth it for the memory.)
|
||||
and it's worth it for the memory.
|
||||
Notably, library values get
|
||||
wrapMeta'd automatically since R2,
|
||||
in order to reduce NEO-specific
|
||||
code.)
|
||||
|
||||
The processes are applications and
|
||||
services, that communicate with the
|
||||
|
@ -78,7 +78,21 @@ unicode is extended with:
|
||||
safe to pass to a GPU without any
|
||||
odd graphical glitches.
|
||||
|
||||
os is replaced with:
|
||||
The KittenOS NEO kernel also reserves
|
||||
the ability to take advantage of any
|
||||
full de-UTF16'd support for Unicode
|
||||
available on the system, but will
|
||||
not include such support as a shim
|
||||
for memory usage reasons.
|
||||
|
||||
Programs that thus try to work around
|
||||
this problem should delegate this
|
||||
task to a library, in a separate
|
||||
package, which can then be updated
|
||||
as-needed if and when the issue is
|
||||
resolved.
|
||||
|
||||
os is replaced with (wrapMeta'd):
|
||||
totalMemory = computer.totalMemory,
|
||||
freeMemory = computer.freeMemory,
|
||||
energy = computer.energy,
|
||||
@ -89,9 +103,9 @@ os is replaced with:
|
||||
uptime = computer.uptime,
|
||||
address = computer.address
|
||||
|
||||
The following are just wrapMeta'd
|
||||
host functions
|
||||
(*: wrapped for security):
|
||||
The following are just host functions
|
||||
(*: wrapped for security - these
|
||||
functions detect metatable abuse):
|
||||
|
||||
assert, ipairs, load, next*,
|
||||
pairs, pcall, xpcall, select,
|
||||
@ -99,6 +113,20 @@ The following are just wrapMeta'd
|
||||
setmetatable, getmetatable*,
|
||||
rawset*, rawget, rawlen, rawequal
|
||||
|
||||
(NOTE: Before you consider that load
|
||||
has no checks: The policy regarding
|
||||
load is taken from the host system.
|
||||
Which means bytecode loading is
|
||||
almost certainly off. If it's not
|
||||
off, then this is the user's fault,
|
||||
as doing so is marked as a security
|
||||
risk for very obvious reasons.
|
||||
As for trying to use the environment
|
||||
to bypass a metatable, I tested.
|
||||
Metatables do apply to environments,
|
||||
including global creation.
|
||||
There is no way to win.)
|
||||
|
||||
"require" and "neo" are the parts of
|
||||
the environment where a NEO-specific
|
||||
nature presents itself.
|
||||
@ -107,6 +135,13 @@ require takes a string, and returns
|
||||
the value returned by the library at
|
||||
"libs/" .. str .. ".lua" on the
|
||||
primary disk.
|
||||
Since R2, the value is automatically
|
||||
wrapMeta'd, just in case.
|
||||
Before R2, libraries did this on
|
||||
their own, but this caused NEO-only
|
||||
code to crop up in libraries that
|
||||
did not need NEO-only code.
|
||||
|
||||
The library name must be a valid path
|
||||
component, and the library path must
|
||||
also be valid - see
|
||||
@ -285,4 +320,3 @@ With that, I hope I have documented
|
||||
the public domain.
|
||||
-- No warranty is provided,
|
||||
implied or otherwise.
|
||||
|
||||
|
55
repository/docs/ul-fmttx
Normal file
55
repository/docs/ul-fmttx
Normal file
@ -0,0 +1,55 @@
|
||||
The "fmttext" library is used for
|
||||
formatting text in various places in
|
||||
KittenOS NEO.
|
||||
|
||||
It's recommended that you only load
|
||||
this library when you need it, and
|
||||
release the value immediately after,
|
||||
as it is rarely called, and has no
|
||||
sticky objects that could cause
|
||||
duplicated library issues.
|
||||
|
||||
If using neoux, the pad and fmtText
|
||||
functions are proxied there in a
|
||||
load-on-demand form, such that you
|
||||
can call them, and the library is
|
||||
loaded for that call.
|
||||
|
||||
Essentially, it's job is to take some
|
||||
safeTextFormat'd text, and turn it
|
||||
into a column of a given width.
|
||||
|
||||
It has two functions for this task:
|
||||
pad(text, len[, centre[, cut]]):
|
||||
Pads the given safeTextFormat'd
|
||||
string to a given width, returning
|
||||
the resulting string.
|
||||
If centre is true, then the text is
|
||||
centred within the area given -
|
||||
otherwise, it is left-justified.
|
||||
(Values that are not nil or true
|
||||
are reserved for future use.)
|
||||
If cut is true, then the text may
|
||||
be reduced in size if necessary.
|
||||
Otherwise, text that is too long is
|
||||
not reduced.
|
||||
|
||||
fmtText(text, width):
|
||||
Formats the given text to a given
|
||||
width in a wrapping fashion.
|
||||
Returns a series of lines that are
|
||||
padded to the given width.
|
||||
If there are newlines in the text,
|
||||
these newlines are respected.
|
||||
If possible, the wrapping is a word
|
||||
wrap style, but words are broken
|
||||
if necessary.
|
||||
If the width is less than 2, then
|
||||
this function may fail in various
|
||||
ways, up to and including freezes.
|
||||
|
||||
-- This is released into
|
||||
the public domain.
|
||||
-- No warranty is provided,
|
||||
implied or otherwise.
|
||||
|
@ -1,4 +1,49 @@
|
||||
Hello World.
|
||||
The "neoux" (aka NeoUX) library is a
|
||||
UI framework for KittenOS NEO, meant
|
||||
to provide a consistent set of
|
||||
controls and a consistent way to
|
||||
navigate the UI in any given case.
|
||||
|
||||
Thus, it's not used by text editing
|
||||
programs such as Neolithic.
|
||||
|
||||
To get ahold of NeoUX in your app,
|
||||
use code similar to:
|
||||
|
||||
local event, neoux
|
||||
event = require("event")(neo)
|
||||
neoux = require("neoux")(event, neo)
|
||||
|
||||
The neo table is used for retrieving
|
||||
the required accesses for APIs.
|
||||
|
||||
The NeoUX API is divided into three
|
||||
parts - the part that connects it to
|
||||
Everest & utility functions, the UI
|
||||
framework's "tcwindow" root, and the
|
||||
basic set of controls.
|
||||
|
||||
The most reliable reference on the
|
||||
API a control implements is given
|
||||
at the top of libs/neoux.lua, and
|
||||
for updatability reasons will not
|
||||
be repeated here, except with the
|
||||
note that "xI"/"yI" is within-char
|
||||
position from 0 to 1.
|
||||
|
||||
TODO, TODO, TODO, TODO, TODO, TODO
|
||||
|
||||
neoux.fileDialog = function (forWrite, callback)
|
||||
neoux.create = function (w, h, title, callback)
|
||||
neoux.pad = require("fmttext").pad
|
||||
neoux.fmtText = function (...)
|
||||
neoux.tcwindow = function (w, h, controls, closing, bg, fg, selIndex)
|
||||
neoux.tcrawview = function (x, y, lines)
|
||||
neoux.tchdivider = function (x, y, w)
|
||||
neoux.tcvdivider = function (x, y, h)
|
||||
neoux.tcbutton = function (x, y, text, callback)
|
||||
neoux.tcfield = function (x, y, w, textprop)
|
||||
neoux.startDialog = function (fmt, title, wait)
|
||||
|
||||
-- This is released into
|
||||
the public domain.
|
||||
|
@ -1,4 +1,54 @@
|
||||
Hello World.
|
||||
The "serial" library is a library to
|
||||
serialize and deserialize Lua values
|
||||
in a relatively safe* manner.
|
||||
|
||||
* Serialization cannot handle a
|
||||
recursive loop correctly,
|
||||
and may error() if certain values
|
||||
are passed to it.
|
||||
The deserialization has unbounded
|
||||
time and memory only limited by
|
||||
the host. It is possible to kill
|
||||
a process indirectly via a
|
||||
poisonous file, but it is not
|
||||
possible to directly break the
|
||||
sandbox without Lua interpreter
|
||||
bugs.
|
||||
|
||||
It is not recommended to use serial
|
||||
for data that is not from a known
|
||||
source, but it is not dangerous to
|
||||
system security (but certainly to
|
||||
stability) to use it for other
|
||||
data so long as no function that
|
||||
originated from the data is ever
|
||||
executed with objects that can be
|
||||
used to elevate privilege.
|
||||
|
||||
(In other words, don't call any
|
||||
function if you can't tell where it
|
||||
came from. This should be obvious.)
|
||||
|
||||
The serial library has merely two
|
||||
functions available to it.
|
||||
|
||||
serialize(val):
|
||||
Returns the serialized data as a
|
||||
string. The serialized data will
|
||||
be in the form of "return ",
|
||||
followed by a Lua 5.2-parsable
|
||||
value of some sort.
|
||||
|
||||
deserialize(str):
|
||||
Returns the deserialized data as a
|
||||
Lua value.
|
||||
A value of nil is an ambiguity:
|
||||
it could be the actual data, or it
|
||||
could be a deserialization error.
|
||||
Check for this situation by reading
|
||||
the second returned value.
|
||||
If it is not nil, deserialization
|
||||
failed with the given error.
|
||||
|
||||
-- This is released into
|
||||
the public domain.
|
||||
|
35
repository/docs/us-nxapp
Normal file
35
repository/docs/us-nxapp
Normal file
@ -0,0 +1,35 @@
|
||||
A Quick Note On NeoUX Application
|
||||
Structure
|
||||
|
||||
A typical NeoUX application has one
|
||||
window, which it uses .reset on in
|
||||
order to change the window contents
|
||||
to different things.
|
||||
|
||||
This is typically achieved with a
|
||||
callback to regenerate the window,
|
||||
used like this:
|
||||
|
||||
window = neoux.create(mainWin())
|
||||
|
||||
and to regenerate the window:
|
||||
|
||||
window.reset(mainWin())
|
||||
|
||||
This allows a simple way to write big
|
||||
UI trees without going totally nuts.
|
||||
|
||||
A good example of this is app-flash,
|
||||
but unlike most of the examples, it
|
||||
does not change the regeneration
|
||||
callback (it never has to - the
|
||||
labelling window never needs to be
|
||||
regenerated after it's switched to,
|
||||
so the only regeneration is for the
|
||||
main window)
|
||||
|
||||
-- This is released into
|
||||
the public domain.
|
||||
-- No warranty is provided,
|
||||
implied or otherwise.
|
||||
|
Loading…
Reference in New Issue
Block a user