Unbind event handlers in the DIALOG_SHIM destructor to prevent late event crashes
Fixes KICAD-1XF
(cherry picked from commit 3a567a3ae1
)
This commit is contained in:
parent
838eadd47f
commit
6096b5c4d8
|
@ -133,12 +133,41 @@ DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& titl
|
||||||
Pgm().App().SetTopWindow( (EDA_BASE_FRAME*) kiwayHolder );
|
Pgm().App().SetTopWindow( (EDA_BASE_FRAME*) kiwayHolder );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Connect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_SHIM::OnPaint ) );
|
Bind( wxEVT_PAINT, &DIALOG_SHIM::OnPaint, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DIALOG_SHIM::~DIALOG_SHIM()
|
DIALOG_SHIM::~DIALOG_SHIM()
|
||||||
{
|
{
|
||||||
|
Unbind( wxEVT_CLOSE_WINDOW, &DIALOG_SHIM::OnCloseWindow, this );
|
||||||
|
Unbind( wxEVT_BUTTON, &DIALOG_SHIM::OnButton, this );
|
||||||
|
Unbind( wxEVT_PAINT, &DIALOG_SHIM::OnPaint, this );
|
||||||
|
|
||||||
|
std::function<void( wxWindowList& )> disconnectFocusHandlers = [&]( wxWindowList& children )
|
||||||
|
{
|
||||||
|
for( wxWindow* child : children )
|
||||||
|
{
|
||||||
|
if( wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( child ) )
|
||||||
|
{
|
||||||
|
textCtrl->Disconnect( wxEVT_SET_FOCUS,
|
||||||
|
wxFocusEventHandler( DIALOG_SHIM::onChildSetFocus ), nullptr,
|
||||||
|
this );
|
||||||
|
}
|
||||||
|
else if( wxStyledTextCtrl* scintilla = dynamic_cast<wxStyledTextCtrl*>( child ) )
|
||||||
|
{
|
||||||
|
scintilla->Disconnect( wxEVT_SET_FOCUS,
|
||||||
|
wxFocusEventHandler( DIALOG_SHIM::onChildSetFocus ), nullptr,
|
||||||
|
this );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
disconnectFocusHandlers( child->GetChildren() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
disconnectFocusHandlers( GetChildren() );
|
||||||
|
|
||||||
// if the dialog is quasi-modal, this will end its event loop
|
// if the dialog is quasi-modal, this will end its event loop
|
||||||
if( IsQuasiModal() )
|
if( IsQuasiModal() )
|
||||||
EndQuasiModal( wxID_CANCEL );
|
EndQuasiModal( wxID_CANCEL );
|
||||||
|
|
Loading…
Reference in New Issue