diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-11-20 14:43:20 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-11-20 14:43:20 +1100 |
| commit | effac1917a615660bf76b35b3605ac2d3eeabd2f (patch) | |
| tree | e078b24b8405203fb36a6f83a7235b05f4bf32a0 /src/lua | |
| parent | b7f37f6426c78132d338b032962209bd93771039 (diff) | |
| download | tangara-fw-effac1917a615660bf76b35b3605ac2d3eeabd2f.tar.gz | |
Use C functions for the backstack, instead of a lua module
Working with the default group and root kinda sucks if you have to do it
from lua!
Diffstat (limited to 'src/lua')
| -rw-r--r-- | src/lua/property.cpp | 12 | ||||
| -rw-r--r-- | src/lua/stubs/backstack.lua | 13 |
2 files changed, 20 insertions, 5 deletions
diff --git a/src/lua/property.cpp b/src/lua/property.cpp index 353e01ae..f0383dd8 100644 --- a/src/lua/property.cpp +++ b/src/lua/property.cpp @@ -5,13 +5,10 @@ */ #include "property.hpp" -#include <sys/_stdint.h> #include <memory> #include <string> -#include "lauxlib.h" -#include "lua.h" #include "lua.hpp" #include "lvgl.h" #include "service_locator.hpp" @@ -19,7 +16,7 @@ namespace lua { static const char kPropertyMetatable[] = "property"; -static const char kFunctionMetatable[] = "function"; +static const char kFunctionMetatable[] = "c_func"; static const char kBindingsTable[] = "bindings"; static const char kBinderKey[] = "binder"; @@ -63,7 +60,7 @@ static auto property_bind(lua_State* state) -> int { p->AddLuaBinding(state, ref); - // Pop the bindings table, leaving one of the copiesw of the callback fn at + // Pop the bindings table, leaving one of the copies of the callback fn at // the top of the stack. lua_pop(state, 1); @@ -84,6 +81,11 @@ static auto generic_function_cb(lua_State* state) -> int { size_t* index = reinterpret_cast<size_t*>(luaL_checkudata(state, 1, kFunctionMetatable)); const LuaFunction& fn = binder->GetFunction(*index); + + // Ensure the C++ function is called with a clean stack; we don't want it to + // see the index we just used. + lua_remove(state, 1); + return std::invoke(fn, state); } diff --git a/src/lua/stubs/backstack.lua b/src/lua/stubs/backstack.lua new file mode 100644 index 00000000..d4807d37 --- /dev/null +++ b/src/lua/stubs/backstack.lua @@ -0,0 +1,13 @@ +--- Module for adding and removing screens from the system's backstack. +-- @module backstack + +local backstack = {} + +--- Pushes a new screen onto the backstack. +-- @tparam function constructor Called to create the UI for the new screen. A new default root object and group will be set before calling this function. The function provided should return a table holding any bindings used by this screen; the returned value is retained so long as this screen is present in the backstack. +function backstack.push(constructor) end + +--- Removes the currently active screen, and instead shows the screen underneath it on the backstack. Does nothing if this is the only existing screen. +function backstack.pop() end + +return backstack |
