f7c5cc09ba
A node was a Lua table of ~625 bytes, of which 21 keys pushed it over a
power-of-two hash boundary and eight were style copies inheritance had
splattered down from its parent. A 400 node screen cost ~250 KB and could not
coexist with wifi's buffers.
The tree now lives in src/ui/layout.h as a 16 byte struct in a flat arena, and
splits by lifetime: Node holds what hit testing and repainting need forever,
Spec holds what only measure/place read and is dropped when layout ends. Style
is sparse and resolved by walking parents, so a node naming no colours costs
nothing. Re-layout rebuilds from Lua rather than retaining the inputs.
401 nodes: 8218 B steady, 21050 B peak
Lua: ~250000 B steady
sdcard/lib/ui.lua stays the toolkit and keeps every constructor signature, but
returns integer handles: 627 lines to 374. Composition, the palette and custom
painters are still Lua on the SD card; only primitives now need a reflash.
BREAKING CHANGE: ui constructors return handles, not tables. Use
ui.setText(id, text) and keep per-node app data in a table keyed by id.
34 lines
1.0 KiB
C++
34 lines
1.0 KiB
C++
#pragma once
|
|
|
|
// Shared internals for the binding translation units. Each `gui`, `sys`, ... table
|
|
// lives in its own file so that adding a binding touches one small file rather than
|
|
// the runtime everything else also edits.
|
|
|
|
extern "C" {
|
|
#include <lauxlib.h>
|
|
#include <lua.h>
|
|
}
|
|
|
|
#include <Arduino.h>
|
|
|
|
class LuaApp;
|
|
|
|
// The owning app, recovered from the state itself rather than a file-static, so a
|
|
// second lua_State (a coroutine, or a future second app) cannot reach the wrong one.
|
|
LuaApp* app(lua_State* L);
|
|
void bindApp(lua_State* L, LuaApp* owner);
|
|
|
|
void registerGui(lua_State* L);
|
|
void registerNode(lua_State* L);
|
|
void registerSys(lua_State* L);
|
|
void registerSettings(lua_State* L);
|
|
void registerInput(lua_State* L);
|
|
void registerFs(lua_State* L);
|
|
void registerWifi(lua_State* L);
|
|
void registerHttp(lua_State* L);
|
|
|
|
// Reads a script through the SD mount; Lua's stock loaders use stdio, which cannot
|
|
// see it. Shared because both `require` and the app launcher need it.
|
|
bool readScript(const char* path, String& out);
|
|
int loadScript(lua_State* L, const char* path);
|