From 5de087e8e076ced5334e4e09f500b556aa9320ca Mon Sep 17 00:00:00 2001 From: omigamedev Date: Mon, 19 Jan 2026 22:51:19 +0100 Subject: [PATCH] fix document global for external Lua scripts in designer and Android --- designer/main.cpp | 20 +++++++++++++- src/main/cpp/kernel.cpp | 17 ++++++++++++ test-apps/com.mosis.sandbox-test/app.lua | 35 +++--------------------- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/designer/main.cpp b/designer/main.cpp index 1ea508b..73624e7 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -16,6 +16,7 @@ #include "testing/ui_inspector.h" #include "testing/visual_capture.h" #include +#include #include #include #include @@ -77,6 +78,18 @@ bool LoadDocument(const std::string& path); void ReloadDocument(); void PopulateSimulatorApps(); +// Helper to set the 'document' global in Lua to the current document +static void SetLuaDocumentGlobal(Rml::ElementDocument* doc) { + if (!doc) return; + lua_State* L = Rml::Lua::Interpreter::GetLuaState(); + if (!L) return; + + // Push the document using RmlUi's Lua type system + Rml::Lua::LuaType::push(L, doc, false); + lua_setglobal(L, "document"); + std::cout << "Set Lua 'document' global to: " << doc->GetTitle() << std::endl; +} + // GLFW callbacks static void ErrorCallback(int error, const char* description) { std::cerr << "GLFW Error " << error << ": " << description << std::endl; @@ -788,6 +801,7 @@ bool InitializeRmlUi(const std::string& assets_path, int fb_width, int fb_height auto* document = g_context->LoadDocument(path); if (document) { document->Show(); + SetLuaDocumentGlobal(document); // Set 'document' global for Lua scripts g_current_document_path = path; g_current_screen_url = path; // Track current screen for hierarchy dump // Log using RmlUi logging so it appears in log file @@ -840,6 +854,7 @@ bool InitializeRmlUi(const std::string& assets_path, int fb_width, int fb_height auto* document = g_context->LoadDocument(home_path); if (document) { document->Show(); + SetLuaDocumentGlobal(document); // Set 'document' global for Lua scripts g_current_document_path = home_path; g_current_screen_url = home_path; g_current_app_id = ""; // Clear current app @@ -929,6 +944,7 @@ bool InitializeRmlUi(const std::string& assets_path, int fb_width, int fb_height auto* document = g_context->LoadDocument(entry); if (document) { document->Show(); + SetLuaDocumentGlobal(document); // Set 'document' global for Lua scripts g_current_document_path = entry; g_current_screen_url = entry; std::cout << "Simulator: App launched successfully" << std::endl; @@ -973,6 +989,7 @@ bool InitializeRmlUi(const std::string& assets_path, int fb_width, int fb_height auto* document = g_context->LoadDocument(g_simulator_home_path); if (document) { document->Show(); + SetLuaDocumentGlobal(document); // Set 'document' global for Lua scripts g_current_document_path = g_simulator_home_path; g_current_screen_url = g_simulator_home_path; @@ -1207,8 +1224,9 @@ bool LoadDocument(const std::string& path) { std::cerr << "Failed to load: " << path << std::endl; return false; } - + document->Show(); + SetLuaDocumentGlobal(document); // Set 'document' global for Lua scripts g_current_document_path = path; g_current_screen_url = path; // Track current screen for hierarchy dump std::cout << "Loaded: " << path << std::endl; diff --git a/src/main/cpp/kernel.cpp b/src/main/cpp/kernel.cpp index eb83126..94b1456 100644 --- a/src/main/cpp/kernel.cpp +++ b/src/main/cpp/kernel.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "RmlUi_Renderer_GL3.h" #include #include @@ -46,6 +47,19 @@ static std::string g_data_root; // Forward declarations static void SwitchAppSandbox(const std::string& app_id, const std::string& app_data_path); +// Helper to set the 'document' global in Lua to the current document +// This is needed for external script files (app.lua) that reference 'document' +static void SetLuaDocumentGlobal(Rml::ElementDocument* doc) { + if (!doc) return; + lua_State* L = Rml::Lua::Interpreter::GetLuaState(); + if (!L) return; + + // Push the document using RmlUi's Lua type system + Rml::Lua::LuaType::push(L, doc, false); + lua_setglobal(L, "document"); + Logger::Log(std::format("Set Lua 'document' global to: {}", doc->GetTitle().empty() ? "(untitled)" : doc->GetTitle().c_str())); +} + using namespace aidl::com::omixlab::mosis; using namespace aidl::android::hardware; @@ -334,6 +348,7 @@ static int LuaLoadScreen(lua_State* L) if (g_document) { g_document->Show(); + SetLuaDocumentGlobal(g_document); Logger::Log(std::format("Loaded screen: {}", path)); lua_pushboolean(L, true); } @@ -390,6 +405,7 @@ static int LuaGoHome(lua_State* L) if (g_document) { g_document->Show(); + SetLuaDocumentGlobal(g_document); Logger::Log("Returned to home screen"); lua_pushboolean(L, true); } @@ -626,6 +642,7 @@ void Kernel::main_loop() return; } g_document->Show(); + SetLuaDocumentGlobal(g_document); while (true) { diff --git a/test-apps/com.mosis.sandbox-test/app.lua b/test-apps/com.mosis.sandbox-test/app.lua index 98a3a82..a7e1fe8 100644 --- a/test-apps/com.mosis.sandbox-test/app.lua +++ b/test-apps/com.mosis.sandbox-test/app.lua @@ -3,34 +3,11 @@ local results = {} local logCounter = 0 -local currentDocument = nil -- Cache the document reference --- Helper to get document (try multiple methods) +-- Helper to get document (use global set by C++) local function getDocument() - -- First try the cached document - if currentDocument then - return currentDocument - end - -- Try the global document - if document then - currentDocument = document - return document - end - -- Try to get from RmlUi context (our context is named "default") - if rmlui and rmlui.contexts then - -- Try both "default" and "main" context names - local ctx = rmlui.contexts["default"] or rmlui.contexts.main - if ctx and ctx.documents then - -- documents is a proxy, iterate to get first doc - for i, doc in ipairs(ctx.documents) do - if doc then - currentDocument = doc - return currentDocument - end - end - end - end - return nil + -- The C++ code sets 'document' global after loading + return document end local function log(msg) @@ -241,10 +218,6 @@ function testStorage() end end --- Initialize: cache the document when script loads -if document then - currentDocument = document - print("[LUA] Document cached on load") -end +-- Initialize log("Sandbox Test App loaded") log("Lua version: " .. (_VERSION or "unknown"))