Handle mouse capture lost events instead of polling for the mouse status in
EVT_IDLE handler. This is not only more efficient but also catches the cases
when the capture was lost before OnIdle() could be executed which could result
in assertion failures and, before the previous commit, even crashes.
The idle-time code is still used for wxOSX/Carbon because it doesn't seem to
generate mouse capture loss events currently -- but should be removed as soon
as support for these events is added.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69350
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// get alerted when child gets deleted from under us
void OnDestroy(wxWindowDestroyEvent& event);
// get alerted when child gets deleted from under us
void OnDestroy(wxWindowDestroyEvent& event);
-#if defined( __WXMSW__ ) || defined( __WXMAC__)
+ // wxOSX/Carbon doesn't generate mouse capture loss events currently so
+ // poll for the capture loss ourselves.
+#if wxOSX_USE_CARBON
// check if the mouse needs captured or released
void OnIdle(wxIdleEvent& event);
#endif
// check if the mouse needs captured or released
void OnIdle(wxIdleEvent& event);
#endif
protected:
// event handlers
void OnLeftDown(wxMouseEvent& event);
protected:
// event handlers
void OnLeftDown(wxMouseEvent& event);
+ void OnCaptureLost(wxMouseCaptureLostEvent& event);
private:
wxPopupTransientWindow *m_popup;
private:
wxPopupTransientWindow *m_popup;
BEGIN_EVENT_TABLE(wxPopupWindowHandler, wxEvtHandler)
EVT_LEFT_DOWN(wxPopupWindowHandler::OnLeftDown)
BEGIN_EVENT_TABLE(wxPopupWindowHandler, wxEvtHandler)
EVT_LEFT_DOWN(wxPopupWindowHandler::OnLeftDown)
+ EVT_MOUSE_CAPTURE_LOST(wxPopupWindowHandler::OnCaptureLost)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxPopupFocusHandler, wxEvtHandler)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxPopupFocusHandler, wxEvtHandler)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxPopupTransientWindow, wxPopupWindow)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxPopupTransientWindow, wxPopupWindow)
-#if defined( __WXMSW__ ) || ( defined( __WXMAC__ ) && wxOSX_USE_CARBON )
EVT_IDLE(wxPopupTransientWindow::OnIdle)
#endif
END_EVENT_TABLE()
EVT_IDLE(wxPopupTransientWindow::OnIdle)
#endif
END_EVENT_TABLE()
-#if defined( __WXMSW__ ) || ( defined( __WXMAC__ ) && wxOSX_USE_CARBON )
void wxPopupTransientWindow::OnIdle(wxIdleEvent& event)
{
event.Skip();
void wxPopupTransientWindow::OnIdle(wxIdleEvent& event)
{
event.Skip();
#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__)
#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__)
#endif // __WXUNIVERSAL__ && wxUSE_SCROLLBAR
}
#endif // __WXUNIVERSAL__ && wxUSE_SCROLLBAR
}
+void
+wxPopupWindowHandler::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event))
+{
+ m_popup->DismissAndNotify();
+
+ // There is no need to skip the event here, normally we've already dealt
+ // with the focus loss.
+}
+
// ----------------------------------------------------------------------------
// wxPopupFocusHandler
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// wxPopupFocusHandler
// ----------------------------------------------------------------------------