diff --git a/Generals/Code/GameEngine/Include/GameClient/GameWindowManager.h b/Generals/Code/GameEngine/Include/GameClient/GameWindowManager.h index a3a4f53a4a6..05e200a2492 100644 --- a/Generals/Code/GameEngine/Include/GameClient/GameWindowManager.h +++ b/Generals/Code/GameEngine/Include/GameClient/GameWindowManager.h @@ -335,6 +335,7 @@ friend class GameWindow; protected: void processDestroyList(); ///< process windows waiting to be killed + void removeWindowFromModalStack( GameWindow *window ); Int drawWindow( GameWindow *window ); ///< draw this window diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp index d3d2afadcdc..19e3dbf5841 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp @@ -103,9 +103,6 @@ void GameWindowManager::processDestroyList() if( m_keyboardFocus == doDestroy ) winSetFocus( nullptr ); - if( (m_modalHead != nullptr) && (doDestroy == m_modalHead->window) ) - winUnsetModal( m_modalHead->window ); - if( m_currMouseRgn == doDestroy ) m_currMouseRgn = nullptr; @@ -1422,8 +1419,7 @@ Int GameWindowManager::winDestroy( GameWindow *window ) if( m_keyboardFocus == window ) winSetFocus( nullptr ); - if( (m_modalHead != nullptr) && (window == m_modalHead->window) ) - winUnsetModal( m_modalHead->window ); + removeWindowFromModalStack( window ); if( m_currMouseRgn == window ) m_currMouseRgn = nullptr; @@ -1555,6 +1551,26 @@ Int GameWindowManager::winUnsetModal( GameWindow *window ) } +// TheSuperHackers @bugfix arcticdolphin 27/08/2026 Remove destroyed windows from the entire modal stack. +void GameWindowManager::removeWindowFromModalStack( GameWindow *window ) +{ + ModalWindow **link = &m_modalHead; + + while( *link ) + { + ModalWindow *modal = *link; + + if( modal->window != window ) + { + link = &modal->next; + continue; + } + + *link = modal->next; + deleteInstance(modal); + } +} + //------------------------------------------------------------------------------------------------- /** Get the grabbed window */ //------------------------------------------------------------------------------------------------- diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/GameWindowManager.h b/GeneralsMD/Code/GameEngine/Include/GameClient/GameWindowManager.h index e976c6f5735..0bced418645 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/GameWindowManager.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/GameWindowManager.h @@ -335,6 +335,7 @@ friend class GameWindow; protected: void processDestroyList(); ///< process windows waiting to be killed + void removeWindowFromModalStack( GameWindow *window ); Int drawWindow( GameWindow *window ); ///< draw this window diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp index 773c22dd94e..9e22745b90d 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GameWindowManager.cpp @@ -103,9 +103,6 @@ void GameWindowManager::processDestroyList() if( m_keyboardFocus == doDestroy ) winSetFocus( nullptr ); - if( (m_modalHead != nullptr) && (doDestroy == m_modalHead->window) ) - winUnsetModal( m_modalHead->window ); - if( m_currMouseRgn == doDestroy ) m_currMouseRgn = nullptr; @@ -1422,8 +1419,7 @@ Int GameWindowManager::winDestroy( GameWindow *window ) if( m_keyboardFocus == window ) winSetFocus( nullptr ); - if( (m_modalHead != nullptr) && (window == m_modalHead->window) ) - winUnsetModal( m_modalHead->window ); + removeWindowFromModalStack( window ); if( m_currMouseRgn == window ) m_currMouseRgn = nullptr; @@ -1555,6 +1551,26 @@ Int GameWindowManager::winUnsetModal( GameWindow *window ) } +// TheSuperHackers @bugfix arcticdolphin 27/08/2026 Remove destroyed windows from the entire modal stack. +void GameWindowManager::removeWindowFromModalStack( GameWindow *window ) +{ + ModalWindow **link = &m_modalHead; + + while( *link ) + { + ModalWindow *modal = *link; + + if( modal->window != window ) + { + link = &modal->next; + continue; + } + + *link = modal->next; + deleteInstance(modal); + } +} + //------------------------------------------------------------------------------------------------- /** Get the grabbed window */ //-------------------------------------------------------------------------------------------------