1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +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
//
ToolManager::Get( project ).CreateWindows();
ToolManager::Get( project ).LayoutToolBars();
//

View File

@ -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 );

View File

@ -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 );