diff --git a/radio/src/lua/api_colorlcd.cpp b/radio/src/lua/api_colorlcd.cpp index f41dc0f75..6279b0daf 100644 --- a/radio/src/lua/api_colorlcd.cpp +++ b/radio/src/lua/api_colorlcd.cpp @@ -22,10 +22,11 @@ #include #include "opentx.h" #include "libopenui.h" - +#include "widget.h" #include "api_colorlcd.h" BitmapBuffer* luaLcdBuffer = nullptr; +Widget* runningFS = nullptr; static int8_t getTextHorizontalOffset(LcdFlags flags) { @@ -1216,6 +1217,25 @@ static int luaLcdDrawHudRectangle(lua_State *L) return 0; } +/*luadoc +@function lcd.exitFullScreen() + +Exit full screen widget mode. + +@notice Only available on radios with color display + +@status current Introduced in 2.5.0 +*/ +static int luaLcdExitFullScreen(lua_State *L) +{ + if (runningFS) { + Widget* rfs = runningFS; + runningFS = nullptr; + rfs->setFullscreen(false); + } + return 0; +} + const luaL_Reg lcdLib[] = { { "refresh", luaLcdRefresh }, { "clear", luaLcdClear }, @@ -1246,5 +1266,6 @@ const luaL_Reg lcdLib[] = { { "drawAnnulus", luaLcdDrawAnnulus }, { "drawLineWithClipping", luaLcdDrawLineWithClipping }, { "drawHudRectangle", luaLcdDrawHudRectangle }, + { "exitFullScreen", luaLcdExitFullScreen }, { NULL, NULL } /* sentinel */ }; diff --git a/radio/src/lua/api_colorlcd.h b/radio/src/lua/api_colorlcd.h index 74c53e183..6f6d35e12 100644 --- a/radio/src/lua/api_colorlcd.h +++ b/radio/src/lua/api_colorlcd.h @@ -39,5 +39,6 @@ constexpr int8_t text_vertical_offset[7] {2,2,0,2,3,3,7}; extern bool luaLcdAllowed; extern BitmapBuffer * luaLcdBuffer; +extern Widget * runningFS; LcdFlags flagsRGB(LcdFlags flags); \ No newline at end of file diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index e6f252fa0..23807e9e5 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -515,10 +515,12 @@ void LuaWidget::refresh(BitmapBuffer* dc) // This little hack is needed to not interfere with the LCD usage of preempted scripts bool lla = luaLcdAllowed; luaLcdAllowed = true; + runningFS = this; if (lua_pcall(lsWidgets, 3, 0, 0) != 0) { setErrorMessage("refresh()"); } + runningFS = nullptr; // Remove LCD luaLcdAllowed = lla; luaLcdBuffer = nullptr; @@ -537,9 +539,11 @@ void LuaWidget::background() if (factory->backgroundFunction) { lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, factory->backgroundFunction); lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, luaWidgetDataRef); + runningFS = this; if (lua_pcall(lsWidgets, 1, 0, 0) != 0) { setErrorMessage("background()"); } + runningFS = nullptr; } }