diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 1b2a56c9f..7906e1a61 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -126,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 38cfb596c..b1d0bc489 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -512,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..4d8cf4d76 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1518,6 +1518,8 @@ void opentxClose(uint8_t shutdown) //TODO: In fact we want only to empty the trash (private method) MainWindow::instance()->run(); + + luaUnregisterWidgets(); luaClose(&lsWidgets); #endif