All: Fix crash on close Kicad, when a quasi modal dialog is open, and Kicad is closed from the Kicad project manager.
This commit is contained in:
parent
3d83434275
commit
020a0ae477
|
@ -44,6 +44,7 @@
|
||||||
#include <wxstruct.h>
|
#include <wxstruct.h>
|
||||||
#include <macros.h>
|
#include <macros.h>
|
||||||
#include <menus_helpers.h>
|
#include <menus_helpers.h>
|
||||||
|
#include <dialog_shim.h>
|
||||||
|
|
||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
@ -107,6 +108,39 @@ EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType,
|
||||||
|
|
||||||
void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
|
void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
|
||||||
{
|
{
|
||||||
|
DIALOG_SHIM* dlg = NULL;
|
||||||
|
wxWindowList list = GetChildren();
|
||||||
|
|
||||||
|
// Quasi modal dialogs create issues (crashes) when closing Kicad.
|
||||||
|
// I am guessing they are delete too late, when deleting main frames.
|
||||||
|
// AFAIK, only these DIALOG_SHIM dialogs create such issues.
|
||||||
|
// The policy is do not allow closing Kicad if a Quasi modal dialog is open.
|
||||||
|
// (Anyway, closing without prompting the user is certainly bad,
|
||||||
|
// because an edit is in preogress)
|
||||||
|
// Therefore, iterate through the child list to find at least
|
||||||
|
// a DIALOG_SHIM opened in quasi modal mode
|
||||||
|
for( wxWindowList::iterator iter = list.begin(); iter != list.end(); ++iter )
|
||||||
|
{
|
||||||
|
if( (dlg = dynamic_cast<DIALOG_SHIM*> (*iter) ) != NULL )
|
||||||
|
{
|
||||||
|
if( dlg->IsQuasiModal() )
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
dlg = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( dlg )
|
||||||
|
{
|
||||||
|
// Happens when a quasi modal dialog is currently open.
|
||||||
|
// For example: if the Kicad manager try to close Kicad.
|
||||||
|
wxMessageBox( _(
|
||||||
|
"The program cannot be closed\n"
|
||||||
|
"A quasi-modal dialog window is currently open, please close it first." ) );
|
||||||
|
event.Veto();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
wxConfigBase* cfg = config();
|
wxConfigBase* cfg = config();
|
||||||
|
|
||||||
if( cfg )
|
if( cfg )
|
||||||
|
|
|
@ -617,7 +617,7 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the find dialog and perserve it's setting if it is displayed.
|
// Close the find dialog and preserve it's setting if it is displayed.
|
||||||
if( m_dlgFindReplace )
|
if( m_dlgFindReplace )
|
||||||
{
|
{
|
||||||
m_findDialogPosition = m_dlgFindReplace->GetPosition();
|
m_findDialogPosition = m_dlgFindReplace->GetPosition();
|
||||||
|
|
|
@ -107,7 +107,7 @@ class EDA_BASE_FRAME : public wxFrame
|
||||||
* SaveSettings(). SaveSettings() is called for all derived wxFrames in this
|
* SaveSettings(). SaveSettings() is called for all derived wxFrames in this
|
||||||
* base class overload. (Calling it from a destructor is deprecated since the
|
* base class overload. (Calling it from a destructor is deprecated since the
|
||||||
* wxFrame's position is not available in the destructor on linux.) In other words,
|
* wxFrame's position is not available in the destructor on linux.) In other words,
|
||||||
* you should not need to call call SaveSettings() anywhere, except in this
|
* you should not need to call SaveSettings() anywhere, except in this
|
||||||
* one function found only in this class.
|
* one function found only in this class.
|
||||||
*/
|
*/
|
||||||
void windowClosing( wxCloseEvent& event );
|
void windowClosing( wxCloseEvent& event );
|
||||||
|
|
Loading…
Reference in New Issue