diff --git a/radio/src/gui/colorlcd/widget.cpp b/radio/src/gui/colorlcd/widget.cpp index b6e3afb9c..350762fd8 100644 --- a/radio/src/gui/colorlcd/widget.cpp +++ b/radio/src/gui/colorlcd/widget.cpp @@ -196,6 +196,12 @@ void registerWidget(const WidgetFactory * factory) getRegisteredWidgets().push_back(factory); } +void unregisterWidget(const WidgetFactory * factory) +{ + TRACE("unregister widget %s", factory->getName()); + getRegisteredWidgets().remove(factory); +} + const WidgetFactory * getWidgetFactory(const char * name) { auto it = getRegisteredWidgets().cbegin(); diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 1656af236..7906e1a61 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -114,6 +114,7 @@ class Widget : public Button }; void registerWidget(const WidgetFactory * factory); +void unregisterWidget(const WidgetFactory * factory); class WidgetFactory { @@ -125,6 +126,8 @@ class WidgetFactory registerWidget(this); } + virtual ~WidgetFactory() {} + inline const char * getName() const { return name; diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 2860e470c..36f658d1a 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -187,6 +187,9 @@ void registerBitmapClass(lua_State * L); void luaSetInstructionsLimit(lua_State* L, int count); int luaLoadScriptFileToState(lua_State * L, const char * filename, const char * mode); +// Unregister LUA widget factories +void luaUnregisterWidgets(); + #if LCD_W > 350 #define RADIO_TOOL_NAME_MAXLEN 40 #else diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 1ffe6d182..b1d0bc489 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -225,6 +225,11 @@ class LuaWidgetFactory: public WidgetFactory { } + ~LuaWidgetFactory() + { + unregisterWidget(this); + } + Widget * create(FormGroup * parent, const rect_t & rect, Widget::PersistentData * persistentData, bool init=true) const override { if (lsWidgets == 0) return 0; @@ -507,3 +512,13 @@ void luaInitThemesAndWidgets() luaDoGc(lsWidgets, true); } } + +void luaUnregisterWidgets() +{ + std::list regWidgets(getRegisteredWidgets()); + for (auto w : regWidgets) { + if (dynamic_cast(w)) { + delete w; + } + } +} diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 79ded3d83..923ebb6a0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1518,7 +1518,10 @@ void opentxClose(uint8_t shutdown) //TODO: In fact we want only to empty the trash (private method) MainWindow::instance()->run(); + + luaUnregisterWidgets(); luaClose(&lsWidgets); + lsWidgets = 0; #endif #if defined(SDCARD) @@ -1532,6 +1535,11 @@ void opentxResume() TRACE("opentxResume"); sdMount(); +#if defined(COLORLCD) + // reload widgets + luaInitThemesAndWidgets(); +#endif + storageReadAll(); #if defined(COLORLCD)