Fixed crash when exiting menu and recalc_pos/all_menus
authorIngo Ruhnke <grumbel@gmail.com>
Fri, 8 Aug 2014 04:16:52 +0000 (06:16 +0200)
committerIngo Ruhnke <grumbel@gmail.com>
Fri, 8 Aug 2014 04:53:52 +0000 (06:53 +0200)
src/gui/menu.cpp
src/gui/menu_manager.hpp

index 6625ba8..240f2fa 100644 (file)
@@ -49,6 +49,8 @@ Menu::Menu() :
   arrange_left(),
   active_item()
 {
+  MenuManager::instance().m_all_menus.push_back(this);
+
   hit_item = -1;
   menuaction = MENU_ACTION_NONE;
   delete_character = 0;
@@ -65,6 +67,13 @@ Menu::Menu() :
 
 Menu::~Menu()
 {
+  MenuManager::instance().m_all_menus.remove(this);
+
+  if (MenuManager::instance().current() == this)
+    MenuManager::instance().m_current = nullptr;
+
+  if (MenuManager::instance().get_previous() == this)
+    MenuManager::instance().m_previous = nullptr;
 }
 
 void
@@ -195,7 +204,7 @@ Menu::update()
     effect_progress = 1.0f;
 
     if (close) {
-      MenuManager::instance().current(0);
+      MenuManager::instance().m_current = 0;
       close = false;
     }
   }
index b0fb4be..a390c6f 100644 (file)
@@ -31,11 +31,15 @@ public:
 
 public:
   std::vector<Menu*> m_last_menus;
-  std::vector<Menu*> m_all_menus;
+  std::list<Menu*> m_all_menus;
 
+  /** Used only for transition effects */
   Menu* m_previous;
+
   Menu* m_current;
 
+  friend class Menu;
+
 public:
   MenuManager();
   ~MenuManager();
@@ -59,13 +63,6 @@ public:
     return m_current;
   }
 
-
-  /** Return the current active menu or NULL if none is active */
-  void current(Menu* menu)
-  {
-    m_current = menu;
-  }
-
 private:
   MenuManager(const MenuManager&);
   MenuManager& operator=(const MenuManager&);