mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
Re-entrancy guard for sym/fp change timers.
(Potentially KICAD-XJN.) (cherry picked from commit 273ca3de7744cccfd4ffc36bc8ac4b66a1485940)
This commit is contained in:
parent
1e881c6a36
commit
777b731687
@ -98,7 +98,8 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aWindo
|
||||
EDA_DRAW_FRAME( aKiway, aParent, aWindowType, aTitle, aPosition, aSize, aStyle,
|
||||
aFrameName, schIUScale ),
|
||||
m_base_frame_defaults( nullptr, "base_Frame_defaults" ),
|
||||
m_selectionFilterPanel( nullptr )
|
||||
m_selectionFilterPanel( nullptr ),
|
||||
m_inSymChangeTimerEvent( false )
|
||||
{
|
||||
if( ( aStyle & wxFRAME_NO_TASKBAR ) == 0 )
|
||||
createCanvas();
|
||||
@ -743,6 +744,12 @@ void SCH_BASE_FRAME::OnSymChangeDebounceTimer( wxTimerEvent& aEvent )
|
||||
return;
|
||||
}
|
||||
|
||||
if( m_inSymChangeTimerEvent )
|
||||
{
|
||||
wxLogTrace( "KICAD_LIB_WATCH", "Restarting debounce timer" );
|
||||
m_watcherDebounceTimer.StartOnce( 3000 );
|
||||
}
|
||||
|
||||
wxLogTrace( "KICAD_LIB_WATCH", "OnSymChangeDebounceTimer" );
|
||||
|
||||
// Disable logging to avoid spurious messages and check if the file has changed
|
||||
@ -755,6 +762,8 @@ void SCH_BASE_FRAME::OnSymChangeDebounceTimer( wxTimerEvent& aEvent )
|
||||
|
||||
m_watcherLastModified = lastModified;
|
||||
|
||||
m_inSymChangeTimerEvent = true;
|
||||
|
||||
if( !GetScreen()->IsContentModified()
|
||||
|| IsOK( this, _( "The library containing the current symbol has changed.\n"
|
||||
"Do you want to reload the library?" ) ) )
|
||||
@ -764,4 +773,6 @@ void SCH_BASE_FRAME::OnSymChangeDebounceTimer( wxTimerEvent& aEvent )
|
||||
Kiway().ExpressMail( FRAME_SCH_VIEWER, MAIL_REFRESH_SYMBOL, libName );
|
||||
Kiway().ExpressMail( FRAME_SCH_SYMBOL_EDITOR, MAIL_REFRESH_SYMBOL, libName );
|
||||
}
|
||||
|
||||
m_inSymChangeTimerEvent = false;
|
||||
}
|
||||
|
@ -306,6 +306,7 @@ private:
|
||||
wxFileName m_watcherFileName;
|
||||
wxDateTime m_watcherLastModified;
|
||||
wxTimer m_watcherDebounceTimer;
|
||||
bool m_inSymChangeTimerEvent;
|
||||
|
||||
std::unique_ptr<NL_SCHEMATIC_PLUGIN> m_spaceMouse;
|
||||
};
|
||||
|
@ -433,12 +433,13 @@ protected:
|
||||
PCB_ORIGIN_TRANSFORMS m_originTransforms;
|
||||
|
||||
private:
|
||||
std::unique_ptr<NL_PCBNEW_PLUGIN> m_spaceMouse;
|
||||
std::unique_ptr<NL_PCBNEW_PLUGIN> m_spaceMouse;
|
||||
|
||||
std::unique_ptr<wxFileSystemWatcher> m_watcher;
|
||||
wxFileName m_watcherFileName;
|
||||
wxDateTime m_watcherLastModified;
|
||||
wxTimer m_watcherDebounceTimer;
|
||||
std::unique_ptr<wxFileSystemWatcher> m_watcher;
|
||||
wxFileName m_watcherFileName;
|
||||
wxDateTime m_watcherLastModified;
|
||||
wxTimer m_watcherDebounceTimer;
|
||||
bool m_inFpChangeTimerEvent;
|
||||
|
||||
std::vector<wxEvtHandler*> m_boardChangeListeners;
|
||||
};
|
||||
|
@ -81,7 +81,8 @@ PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame
|
||||
EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName,
|
||||
pcbIUScale ),
|
||||
m_pcb( nullptr ),
|
||||
m_originTransforms( *this )
|
||||
m_originTransforms( *this ),
|
||||
m_inFpChangeTimerEvent( false )
|
||||
{
|
||||
m_watcherDebounceTimer.Bind( wxEVT_TIMER, &PCB_BASE_FRAME::OnFpChangeDebounceTimer, this );
|
||||
}
|
||||
@ -1189,6 +1190,18 @@ void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
|
||||
|
||||
void PCB_BASE_FRAME::OnFpChangeDebounceTimer( wxTimerEvent& aEvent )
|
||||
{
|
||||
if( aEvent.GetId() != m_watcherDebounceTimer.GetId() )
|
||||
{
|
||||
aEvent.Skip();
|
||||
return;
|
||||
}
|
||||
|
||||
if( m_inFpChangeTimerEvent )
|
||||
{
|
||||
wxLogTrace( "KICAD_LIB_WATCH", "Restarting debounce timer" );
|
||||
m_watcherDebounceTimer.StartOnce( 3000 );
|
||||
}
|
||||
|
||||
wxLogTrace( "KICAD_LIB_WATCH", "OnFpChangeDebounceTimer" );
|
||||
|
||||
// Disable logging to avoid spurious messages and check if the file has changed
|
||||
@ -1211,6 +1224,8 @@ void PCB_BASE_FRAME::OnFpChangeDebounceTimer( wxTimerEvent& aEvent )
|
||||
if( !fp || !tbl )
|
||||
return;
|
||||
|
||||
m_inFpChangeTimerEvent = true;
|
||||
|
||||
if( !GetScreen()->IsContentModified()
|
||||
|| IsOK( this, _( "The library containing the current footprint has changed.\n"
|
||||
"Do you want to reload the footprint?" ) ) )
|
||||
@ -1227,10 +1242,7 @@ void PCB_BASE_FRAME::OnFpChangeDebounceTimer( wxTimerEvent& aEvent )
|
||||
std::vector<KIID> selectedItems;
|
||||
|
||||
for( const EDA_ITEM* item : GetCurrentSelection() )
|
||||
{
|
||||
wxString uuidStr = item->m_Uuid.AsString();
|
||||
selectedItems.emplace_back( item->m_Uuid );
|
||||
}
|
||||
|
||||
m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD );
|
||||
|
||||
@ -1260,4 +1272,6 @@ void PCB_BASE_FRAME::OnFpChangeDebounceTimer( wxTimerEvent& aEvent )
|
||||
DisplayError( this, ioe.What() );
|
||||
}
|
||||
}
|
||||
|
||||
m_inFpChangeTimerEvent = false;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user