Do proper cleanup of event handlers in wxWebKitCtrl and wxMacUnicodeTextCtrl, and unset the window focus when destroying a top level window to ensure that controls do not receive events after the wx portion of the control has been destroyed.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@56767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Kevin Ollivier
2008-11-14 23:02:15 +00:00
parent 85c62cec4d
commit 085dae419f
5 changed files with 26 additions and 3 deletions

View File

@@ -103,10 +103,11 @@ protected :
// contains the tag for the content (is different for password and non-password controls) // contains the tag for the content (is different for password and non-password controls)
OSType m_valueTag ; OSType m_valueTag ;
WXEVENTHANDLERREF m_macTextCtrlEventHandler ;
public : public :
ControlEditTextSelectionRec m_selection ; ControlEditTextSelectionRec m_selection ;
}; };
#endif // TARGET_API_MAC_OSX #endif // TARGET_API_MAC_OSX
#endif // _WX_MAC_PRIVATE_MACTEXT_H_ #endif // _WX_MAC_PRIVATE_MACTEXT_H_

View File

@@ -48,6 +48,8 @@ public:
const wxString& name = wxFrameNameStr); const wxString& name = wxFrameNameStr);
virtual ~wxTopLevelWindowMac(); virtual ~wxTopLevelWindowMac();
virtual bool Destroy();
virtual wxPoint GetClientAreaOrigin() const; virtual wxPoint GetClientAreaOrigin() const;

View File

@@ -468,7 +468,16 @@ bool wxWebKitCtrl::Create(wxWindow *parent,
wxWebKitCtrl::~wxWebKitCtrl() wxWebKitCtrl::~wxWebKitCtrl()
{ {
MyFrameLoadMonitor* myFrameLoadMonitor = [m_webView frameLoadDelegate];
MyPolicyDelegate* myPolicyDelegate = [m_webView policyDelegate];
[m_webView setFrameLoadDelegate: nil];
[m_webView setPolicyDelegate: nil];
if (myFrameLoadMonitor)
[myFrameLoadMonitor release];
if (myPolicyDelegate)
[myPolicyDelegate release];
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -1393,13 +1393,14 @@ bool wxMacUnicodeTextControl::Create( wxTextCtrl *wxPeer,
InstallControlEventHandler( m_controlRef , GetwxMacUnicodeTextControlEventHandlerUPP(), InstallControlEventHandler( m_controlRef , GetwxMacUnicodeTextControlEventHandlerUPP(),
GetEventTypeCount(unicodeTextControlEventList), unicodeTextControlEventList, this, GetEventTypeCount(unicodeTextControlEventList), unicodeTextControlEventList, this,
NULL); (EventHandlerRef*) &m_macTextCtrlEventHandler);
return true; return true;
} }
wxMacUnicodeTextControl::~wxMacUnicodeTextControl() wxMacUnicodeTextControl::~wxMacUnicodeTextControl()
{ {
::RemoveEventHandler((EventHandlerRef) m_macTextCtrlEventHandler);
} }
void wxMacUnicodeTextControl::VisibilityChanged(bool shown) void wxMacUnicodeTextControl::VisibilityChanged(bool shown)

View File

@@ -970,6 +970,16 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent,
return true; return true;
} }
bool wxTopLevelWindowMac::Destroy()
{
// NB: this will get called during destruction if we don't do it now,
// and may fire a kill focus event on a control being destroyed
if (m_macWindow)
ClearKeyboardFocus( (WindowRef)m_macWindow );
return wxTopLevelWindowBase::Destroy();
}
wxTopLevelWindowMac::~wxTopLevelWindowMac() wxTopLevelWindowMac::~wxTopLevelWindowMac()
{ {
if ( m_macWindow ) if ( m_macWindow )