removing event handlers on non-owned windows when the destroy event is sent

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62985 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor 2009-12-25 09:47:30 +00:00
parent 22a2e3fa6b
commit 0aaa6ace7e
9 changed files with 22 additions and 11 deletions

View File

@ -1005,7 +1005,7 @@ public :
wxNonOwnedWindowCarbonImpl();
virtual ~wxNonOwnedWindowCarbonImpl();
virtual void Destroy() ;
virtual void WillBeDestroyed() ;
void Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,
long style, long extraStyle, const wxString& name ) ;

View File

@ -193,7 +193,7 @@ public :
virtual ~wxNonOwnedWindowCocoaImpl();
virtual void Destroy() ;
virtual void WillBeDestroyed() ;
void Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,
long style, long extraStyle, const wxString& name ) ;

View File

@ -653,7 +653,7 @@ public :
{
}
virtual void Destroy()
virtual void WillBeDestroyed()
{
}

View File

@ -125,7 +125,7 @@ public :
virtual ~wxNonOwnedWindowIPhoneImpl();
virtual void Destroy() ;
virtual void WillBeDestroyed() ;
void Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,
long style, long extraStyle, const wxString& name ) ;

View File

@ -116,6 +116,8 @@ protected:
virtual bool OSXShowWithEffect(bool show,
wxShowEffect effect,
unsigned timeout);
void OnWindowDestroy( wxWindowDestroyEvent &event);
wxNonOwnedWindowImpl* m_nowpeer ;

View File

@ -1144,15 +1144,13 @@ wxNonOwnedWindowCarbonImpl::~wxNonOwnedWindowCarbonImpl()
}
void wxNonOwnedWindowCarbonImpl::Destroy()
void wxNonOwnedWindowCarbonImpl::WillBeDestroyed()
{
if ( m_macEventHandler )
{
::RemoveEventHandler((EventHandlerRef) m_macEventHandler);
m_macEventHandler = NULL ;
}
wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) ) ;
}
void wxNonOwnedWindowInstallTopLevelWindowEventHandler(WindowRef window, EventHandlerRef* handler, void *ref)

View File

@ -351,9 +351,9 @@ wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl()
[m_macWindow release];
}
void wxNonOwnedWindowCocoaImpl::Destroy()
void wxNonOwnedWindowCocoaImpl::WillBeDestroyed()
{
wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) );
[m_macWindow setDelegate:nil];
}
void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), const wxPoint& pos, const wxSize& size,

View File

@ -90,9 +90,8 @@ wxNonOwnedWindowIPhoneImpl::~wxNonOwnedWindowIPhoneImpl()
[m_macWindow release];
}
void wxNonOwnedWindowIPhoneImpl::Destroy()
void wxNonOwnedWindowIPhoneImpl::WillBeDestroyed()
{
wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) );
}
void wxNonOwnedWindowIPhoneImpl::Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,

View File

@ -147,6 +147,9 @@ bool wxNonOwnedWindow::Create(wxWindow *parent,
if ( parent )
parent->AddChild(this);
wxBIND_OR_CONNECT_HACK(this, wxEVT_DESTROY, wxWindowDestroyEventHandler,
wxNonOwnedWindow::OnWindowDestroy, this);
return true;
}
@ -159,12 +162,21 @@ wxNonOwnedWindow::~wxNonOwnedWindow()
DestroyChildren();
delete m_nowpeer;
m_nowpeer = NULL;
// avoid dangling refs
if ( s_macDeactivateWindow == this )
s_macDeactivateWindow = NULL;
}
void wxNonOwnedWindow::OnWindowDestroy( wxWindowDestroyEvent &event)
{
event.Skip();
if ( m_nowpeer )
m_nowpeer->WillBeDestroyed();
}
// ----------------------------------------------------------------------------
// wxNonOwnedWindow misc
// ----------------------------------------------------------------------------