From d84e1cc45e17c9eb0e741981bdf3c2c805192083 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 14 Aug 2016 10:20:50 -0400 Subject: [PATCH] Fix memory leaks, though in unused code... ... Is this kept around for future use? --- src/widgets/ExpandingToolBar.cpp | 20 ++++++++++++++------ src/widgets/ExpandingToolBar.h | 6 +++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/widgets/ExpandingToolBar.cpp b/src/widgets/ExpandingToolBar.cpp index 031d1d554..2808661ee 100644 --- a/src/widgets/ExpandingToolBar.cpp +++ b/src/widgets/ExpandingToolBar.cpp @@ -132,7 +132,6 @@ ExpandingToolBar::ExpandingToolBar(wxWindow* parent, mDialogParent(NULL), mAreaParent(NULL), mSavedArrangement{}, - mDragImage(NULL), mTopLevelParent(NULL) { mMainPanel = safenew wxPanelWrapper(this, -1, @@ -280,11 +279,15 @@ class ExpandingToolBarEvtHandler final : public wxEvtHandler { public: ExpandingToolBarEvtHandler(ExpandingToolBar *toolbar, + wxWindow *window, wxEvtHandler *inheritedEvtHandler) { mToolBar = toolbar; + mWindow = window; mInheritedEvtHandler = inheritedEvtHandler; - } + + window->PushEventHandler(this); +} bool ProcessEvent(wxEvent& evt) override { @@ -296,8 +299,14 @@ class ExpandingToolBarEvtHandler final : public wxEvtHandler return mInheritedEvtHandler->ProcessEvent(evt); } + ~ExpandingToolBarEvtHandler() + { + mWindow->RemoveEventHandler(this); + } + protected: ExpandingToolBar *mToolBar; + wxWindow *mWindow; wxEvtHandler *mInheritedEvtHandler; DECLARE_NO_COPY_CLASS(ExpandingToolBarEvtHandler); @@ -306,9 +315,8 @@ protected: void ExpandingToolBar::RecursivelyPushEventHandlers(wxWindow *win) { if (!mWindowHash[win]) { - ExpandingToolBarEvtHandler *evtHandler = - new ExpandingToolBarEvtHandler(this, win->GetEventHandler()); - win->PushEventHandler(evtHandler); + mHandlers.push_back(make_movable + (this, win, win->GetEventHandler())); mWindowHash[win] = 1; } @@ -556,7 +564,7 @@ void ExpandingToolBar::StartMoving() mAreaParent->SetCapturedChild(this); - mDragImage = new wxDragImage(toolbarBitmap); + mDragImage = std::make_unique(toolbarBitmap); mDragImage->BeginDrag(hotSpot, mAreaParent, mTopLevelParent); mDragImage->Show(); mDragImage->Move(ScreenToClient(wxGetMousePosition())); diff --git a/src/widgets/ExpandingToolBar.h b/src/widgets/ExpandingToolBar.h index 24783f96b..42c122cd2 100644 --- a/src/widgets/ExpandingToolBar.h +++ b/src/widgets/ExpandingToolBar.h @@ -12,6 +12,7 @@ #define __AUDACITY_EXPANDING_TOOL_BAR__ #include "../MemoryX.h" +#include #include #include #include @@ -39,6 +40,8 @@ WX_DECLARE_VOIDPTR_HASH_MAP(int, WindowHash); WX_DEFINE_ARRAY(ExpandingToolBar *, ExpandingToolBarArray); WX_DECLARE_OBJARRAY(wxRect, wxArrayRect); +class ExpandingToolBarEvtHandler; + // // A smart ToolBar class that has a "MainPanel" which is always // displayed, and an "ExtraPanel" that can be hidden to save space. @@ -111,7 +114,7 @@ class ExpandingToolBar final : public wxPanelWrapper ToolBarArea *mAreaParent; std::unique_ptr mSavedArrangement; ImageRollPanel *mTargetPanel; - wxDragImage *mDragImage; + std::unique_ptr mDragImage; wxWindow *mTopLevelParent; wxArrayRect mDropTargets; wxRect mDropTarget; @@ -121,6 +124,7 @@ class ExpandingToolBar final : public wxPanelWrapper DECLARE_EVENT_TABLE(); friend class ExpandingToolBarEvtHandler; + std::vector< movable_ptr< ExpandingToolBarEvtHandler > > mHandlers; }; class ToolBarGrabber final : public wxPanelWrapper