1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-05 15:09:08 +02:00

Delay creation of tool docks and bars...

... after construction time for ToolManager, so that ToolManager can be
constructed earlier than ProjectWindow, and therefore the unspecified sequence
of invocation of factories of attached objects in the project won't lead to a
crash on any platform
This commit is contained in:
Paul Licameli 2020-06-08 15:06:48 -04:00
parent 9e2a13128a
commit a085057b66
3 changed files with 14 additions and 9 deletions

@ -393,6 +393,7 @@ void InitProjectWindow( ProjectWindow &window )
//
// Create the ToolDock
//
ToolManager::Get( project ).CreateWindows();
ToolManager::Get( project ).LayoutToolBars();
//

@ -342,9 +342,7 @@ auto ToolManager::SetGetTopPanelHook( const GetTopPanelHook &hook )
static const AudacityProject::AttachedObjects::RegisteredFactory key{
[]( AudacityProject &parent ){
auto &window = GetProjectFrame( parent );
return std::make_shared< ToolManager >(
&parent, getTopPanelHook()( window ) ); }
return std::make_shared< ToolManager >( &parent ); }
};
ToolManager &ToolManager::Get( AudacityProject &project )
@ -360,13 +358,9 @@ const ToolManager &ToolManager::Get( const AudacityProject &project )
//
// Constructor
//
ToolManager::ToolManager( AudacityProject *parent, wxWindow *topDockParent )
ToolManager::ToolManager( AudacityProject *parent )
: wxEvtHandler()
{
if ( !topDockParent )
THROW_INCONSISTENCY_EXCEPTION;
auto &window = GetProjectFrame( *parent );
wxPoint pt[ 3 ];
#if defined(__WXMAC__)
@ -430,6 +424,12 @@ ToolManager::ToolManager( AudacityProject *parent, wxWindow *topDockParent )
// It's a little shy
mIndicator->Hide();
}
void ToolManager::CreateWindows()
{
auto parent = mParent;
auto &window = GetProjectFrame( *parent );
// Hook the parents mouse events...using the parent helps greatly
// under GTK
@ -443,6 +443,8 @@ ToolManager::ToolManager( AudacityProject *parent, wxWindow *topDockParent )
&ToolManager::OnCaptureLost,
this );
wxWindow *topDockParent = getTopPanelHook()( window );
// Create the top and bottom docks
mTopDock = safenew ToolDock( this, topDockParent, TopDockID );
mBotDock = safenew ToolDock( this, &window, BotDockID );

@ -61,11 +61,13 @@ class ToolManager final
static ToolManager &Get( AudacityProject &project );
static const ToolManager &Get( const AudacityProject &project );
ToolManager( AudacityProject *parent, wxWindow *topDockParent );
ToolManager( AudacityProject *parent );
ToolManager( const ToolManager & ) PROHIBITED;
ToolManager &operator=( const ToolManager & ) PROHIBITED;
~ToolManager();
void CreateWindows();
void LayoutToolBars();
bool IsDocked( int type );