Protect move tool from re-entrancy.

m_dragInProgress is usually sufficient, except when we haven't started
one yet.  In any case, conflating the two is probably a bad idea.

Fixes https://gitlab.com/kicad/code/kicad/issues/12936
This commit is contained in:
Jeff Young 2022-11-18 17:07:02 +00:00
parent e09e521162
commit bc271a8d15
3 changed files with 13 additions and 0 deletions

View File

@ -217,6 +217,10 @@ void SELECTION_TOOL::onDisambiguationExpire( wxTimerEvent& aEvent )
if( selection().GetSize() >= 2 ) if( selection().GetSize() >= 2 )
return; return;
// If another tool has since started running then we don't want to interrupt
if( !getEditFrame<EDA_DRAW_FRAME>()->ToolStackIsEmpty() )
return;
m_toolMgr->ProcessEvent( EVENTS::DisambiguatePoint ); m_toolMgr->ProcessEvent( EVENTS::DisambiguatePoint );
} }

View File

@ -49,6 +49,7 @@
SCH_MOVE_TOOL::SCH_MOVE_TOOL() : SCH_MOVE_TOOL::SCH_MOVE_TOOL() :
EE_TOOL_BASE<SCH_EDIT_FRAME>( "eeschema.InteractiveMove" ), EE_TOOL_BASE<SCH_EDIT_FRAME>( "eeschema.InteractiveMove" ),
m_inMoveTool( false ),
m_moveInProgress( false ), m_moveInProgress( false ),
m_isDrag( false ), m_isDrag( false ),
m_moveOffset( 0, 0 ) m_moveOffset( 0, 0 )
@ -400,6 +401,11 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
return 0; return 0;
} }
if( m_inMoveTool ) // Must come after m_moveInProgress checks above...
return 0;
REENTRANCY_GUARD guard( &m_inMoveTool );
// Be sure that there is at least one item that we can move. If there's no selection try // Be sure that there is at least one item that we can move. If there's no selection try
// looking for the stuff under mouse cursor (i.e. Kicad old-style hover selection). // looking for the stuff under mouse cursor (i.e. Kicad old-style hover selection).
EE_SELECTION& selection = m_selectionTool->RequestSelection( EE_COLLECTOR::MovableItems ); EE_SELECTION& selection = m_selectionTool->RequestSelection( EE_COLLECTOR::MovableItems );

View File

@ -84,6 +84,9 @@ private:
void setTransitions() override; void setTransitions() override;
private: private:
///< Re-entrancy guard
bool m_inMoveTool;
///< Flag determining if anything is being dragged right now ///< Flag determining if anything is being dragged right now
bool m_moveInProgress; bool m_moveInProgress;
bool m_isDrag; bool m_isDrag;