From 24801680c5eaa0c224dd4715ca042467cf729df5 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Mon, 14 Aug 2023 00:02:20 +0200 Subject: [PATCH] Fixed some memory leaks --- es-app/src/guis/GuiMenu.cpp | 26 ++++++++++++++++++++------ es-app/src/guis/GuiMenu.h | 1 + es-app/src/guis/GuiSettings.cpp | 20 ++++++-------------- es-app/src/guis/GuiSettings.h | 7 +++++-- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/es-app/src/guis/GuiMenu.cpp b/es-app/src/guis/GuiMenu.cpp index 4dde7456b..de8f32cdd 100644 --- a/es-app/src/guis/GuiMenu.cpp +++ b/es-app/src/guis/GuiMenu.cpp @@ -44,6 +44,7 @@ GuiMenu::GuiMenu() : mRenderer {Renderer::getInstance()} , mMenu {"MAIN MENU"} + , mThemeDownloaderReloadCounter {0} { const bool isFullUI {UIModeController::getInstance()->isUIModeFull()}; @@ -477,10 +478,14 @@ void GuiMenu::openUIOptions() if (systemsSorting->getSelectedObjects().size() == 0) systemsSorting->selectEntry(0); s->addWithLabel("SYSTEMS SORTING", systemsSorting); - s->addSaveFunc([systemsSorting, s] { + s->addSaveFunc([this, systemsSorting, s] { if (systemsSorting->getSelected() != Settings::getInstance()->getString("SystemsSorting")) { Settings::getInstance()->setString("SystemsSorting", systemsSorting->getSelected()); s->setNeedsSaving(); + if (mThemeDownloaderReloadCounter == 0) + s->setNeedsCloseMenu([this] { delete this; }); + else + ++mThemeDownloaderReloadCounter; s->setNeedsRescanROMDirectory(); } }); @@ -535,13 +540,16 @@ void GuiMenu::openUIOptions() if (menuColorScheme->getSelectedObjects().size() == 0) menuColorScheme->selectEntry(0); s->addWithLabel("MENU COLOR SCHEME", menuColorScheme); - s->addSaveFunc([menuColorScheme, s] { + s->addSaveFunc([this, menuColorScheme, s] { if (menuColorScheme->getSelected() != Settings::getInstance()->getString("MenuColorScheme")) { Settings::getInstance()->setString("MenuColorScheme", menuColorScheme->getSelected()); ViewController::getInstance()->setMenuColors(); s->setNeedsSaving(); - s->setNeedsCloseAllWindows(); + if (mThemeDownloaderReloadCounter == 0) + s->setNeedsCloseMenu([this] { delete this; }); + else + ++mThemeDownloaderReloadCounter; } }); @@ -1567,7 +1575,7 @@ void GuiMenu::openOtherOptions() if (showQuitMenu->getState() != Settings::getInstance()->getBool("ShowQuitMenu")) { Settings::getInstance()->setBool("ShowQuitMenu", showQuitMenu->getState()); s->setNeedsSaving(); - s->setNeedsCloseAllWindows(); + s->setNeedsCloseMenu([this] { delete this; }); } }); #endif @@ -1746,9 +1754,15 @@ void GuiMenu::openThemeDownloader(GuiSettings* settings) { auto updateFunc = [&, settings]() { LOG(LogDebug) << "GuiMenu::openThemeDownloader(): Theme sets were updated, reloading menu"; + mThemeDownloaderReloadCounter = 1; delete settings; - openUIOptions(); - mWindow->invalidateCachedBackground(); + if (mThemeDownloaderReloadCounter != 1) { + delete this; + } + else { + openUIOptions(); + mWindow->invalidateCachedBackground(); + } }; mWindow->pushGui(new GuiThemeDownloader(updateFunc)); diff --git a/es-app/src/guis/GuiMenu.h b/es-app/src/guis/GuiMenu.h index b48a11349..924f92137 100644 --- a/es-app/src/guis/GuiMenu.h +++ b/es-app/src/guis/GuiMenu.h @@ -50,6 +50,7 @@ private: Renderer* mRenderer; MenuComponent mMenu; TextComponent mVersion; + int mThemeDownloaderReloadCounter; }; #endif // ES_APP_GUIS_GUI_MENU_H diff --git a/es-app/src/guis/GuiSettings.cpp b/es-app/src/guis/GuiSettings.cpp index 1f6ec5220..72d22ecf4 100644 --- a/es-app/src/guis/GuiSettings.cpp +++ b/es-app/src/guis/GuiSettings.cpp @@ -36,7 +36,6 @@ GuiSettings::GuiSettings(std::string title) , mNeedsGoToStart {false} , mNeedsGoToSystem {false} , mNeedsGoToGroupedCollections {false} - , mNeedsCloseAllWindows {false} , mInvalidateCachedBackground {false} { addChild(&mMenu); @@ -72,13 +71,10 @@ void GuiSettings::save() for (auto system : SystemData::sSystemVector) system->writeMetaData(); } + // If a close menu function was passed to us, then run it. + if (mCloseMenuFunction) + mCloseMenuFunction(); ViewController::getInstance()->rescanROMDirectory(); - // Close all open windows. - while (mWindow->getGuiStackSize() > 1) { - GuiComponent* window {mWindow->peekGui()}; - if (window != nullptr) - mWindow->removeGui(window); - } return; } @@ -176,13 +172,9 @@ void GuiSettings::save() ViewController::getInstance()->resetCamera(); } - if (mNeedsCloseAllWindows) { - while (mWindow->getGuiStackSize() > 1) { - GuiComponent* window {mWindow->peekGui()}; - if (window != nullptr) - mWindow->removeGui(window); - } - } + // If a close menu function was passed to us, then run it. + if (mCloseMenuFunction) + mCloseMenuFunction(); if (mInvalidateCachedBackground) { // This delay reduces the likelyhood that the SVG rasterizer which is running in a diff --git a/es-app/src/guis/GuiSettings.h b/es-app/src/guis/GuiSettings.h index 4afcf7eac..f8a24bf84 100644 --- a/es-app/src/guis/GuiSettings.h +++ b/es-app/src/guis/GuiSettings.h @@ -58,7 +58,10 @@ public: mGoToSystem = goToSystem; }; void setNeedsGoToGroupedCollections() { mNeedsGoToGroupedCollections = true; } - void setNeedsCloseAllWindows() { mNeedsCloseAllWindows = true; } + void setNeedsCloseMenu(std::function closeFunction) + { + mCloseMenuFunction = closeFunction; + } void setInvalidateCachedBackground() { mInvalidateCachedBackground = true; } bool input(InputConfig* config, Input input) override; @@ -69,6 +72,7 @@ private: Renderer* mRenderer; MenuComponent mMenu; std::vector> mSaveFuncs; + std::function mCloseMenuFunction; SystemData* mGoToSystem; bool mNeedsSaving; @@ -81,7 +85,6 @@ private: bool mNeedsGoToStart; bool mNeedsGoToSystem; bool mNeedsGoToGroupedCollections; - bool mNeedsCloseAllWindows; bool mInvalidateCachedBackground; };