From 24801680c5eaa0c224dd4715ca042467cf729df5 Mon Sep 17 00:00:00 2001
From: Leon Styhre <leon@leonstyhre.com>
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<void()> 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<std::function<void()>> mSaveFuncs;
+    std::function<void()> mCloseMenuFunction;
     SystemData* mGoToSystem;
 
     bool mNeedsSaving;
@@ -81,7 +85,6 @@ private:
     bool mNeedsGoToStart;
     bool mNeedsGoToSystem;
     bool mNeedsGoToGroupedCollections;
-    bool mNeedsCloseAllWindows;
     bool mInvalidateCachedBackground;
 };