Clear the playerFrame lookup cache when closing frames.
WindowIds aren't actually guaranteed to be unique, and we don't
perform a dynamic_cast on the result of FindWindowById() because
of linker issues....
This is an attempt to fix KICAD-39.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/14928
(cherry picked from commit d6aefc458c
)
This commit is contained in:
parent
7b1e75e6ed
commit
370bdef8d0
|
@ -495,7 +495,7 @@ bool KIWAY::PlayerClose( FRAME_T aFrameType, bool doForce )
|
|||
return false;
|
||||
}
|
||||
|
||||
KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
|
||||
KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
|
||||
|
||||
if( frame == nullptr ) // Already closed
|
||||
return true;
|
||||
|
@ -523,14 +523,18 @@ bool KIWAY::PlayersClose( bool doForce )
|
|||
bool ret = true;
|
||||
|
||||
for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
|
||||
{
|
||||
ret = ret && PlayerClose( FRAME_T( i ), doForce );
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void KIWAY::PlayerDidClose( FRAME_T aFrameType )
|
||||
{
|
||||
m_playerFrameId[aFrameType] = wxID_NONE;
|
||||
}
|
||||
|
||||
|
||||
void KIWAY::ExpressMail( FRAME_T aDestination, MAIL_T aCommand, std::string& aPayload,
|
||||
wxWindow* aSource )
|
||||
{
|
||||
|
|
|
@ -169,6 +169,8 @@ bool KIWAY_PLAYER::ShowModal( wxString* aResult, wxWindow* aResultantFocusWindow
|
|||
|
||||
bool KIWAY_PLAYER::Destroy()
|
||||
{
|
||||
Kiway().PlayerDidClose( GetFrameType() );
|
||||
|
||||
return EDA_BASE_FRAME::Destroy();
|
||||
}
|
||||
|
||||
|
|
|
@ -358,6 +358,11 @@ public:
|
|||
*/
|
||||
virtual bool PlayersClose( bool doForce );
|
||||
|
||||
/**
|
||||
* Notifies a Kiway that a player has been closed.
|
||||
*/
|
||||
void PlayerDidClose( FRAME_T aFrameType );
|
||||
|
||||
/**
|
||||
* Send @a aPayload to @a aDestination from @a aSource.
|
||||
*
|
||||
|
@ -434,11 +439,6 @@ private:
|
|||
/// Get the [path &] name of the DSO holding the requested FACE_T.
|
||||
const wxString dso_search_path( FACE_T aFaceId );
|
||||
|
||||
#if 0
|
||||
/// hooked into m_top in SetTop(), marks child frame as closed.
|
||||
void player_destroy_handler( wxWindowDestroyEvent& event );
|
||||
#endif
|
||||
|
||||
bool set_kiface( FACE_T aFaceType, KIFACE* aKiface )
|
||||
{
|
||||
if( (unsigned) aFaceType < (unsigned) KIWAY_FACE_COUNT )
|
||||
|
|
Loading…
Reference in New Issue