1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-06 07:29:07 +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

View File

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

View File

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

View File

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