protected:
// event handlers
void OnLeftDown(wxMouseEvent& event);
+ void OnCaptureLost(wxMouseCaptureLostEvent& event);
private:
wxPopupTransientWindow *m_popup;
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(wxPopupTransientWindow, wxPopupWindow)
-#if defined( __WXMSW__ ) || ( defined( __WXMAC__ ) && wxOSX_USE_CARBON )
+#if defined(__WXMSW__) ||(defined(__WXMAC__) && wxOSX_USE_CARBON)
EVT_IDLE(wxPopupTransientWindow::OnIdle)
#endif
END_EVENT_TABLE()
return ret;
}
+bool wxPopupTransientWindow::Destroy()
+{
+ // The popup window can be deleted at any moment, even while some events
+ // are still being processed for it, so delay its real destruction until
+ // the next idle time when we're sure that it's safe to really destroy it.
+
+ wxCHECK_MSG( !wxPendingDelete.Member(this), false,
+ wxS("Shouldn't destroy the popup twice.") );
+
+ wxPendingDelete.Append(this);
+
+ return true;
+}
+
void wxPopupTransientWindow::Dismiss()
{
Hide();
return false;
}
-#if defined( __WXMSW__ ) || ( defined( __WXMAC__ ) && wxOSX_USE_CARBON )
+#if defined(__WXMSW__) ||(defined(__WXMAC__) && wxOSX_USE_CARBON)
void wxPopupTransientWindow::OnIdle(wxIdleEvent& event)
{
event.Skip();
}
}
}
-#endif // __WXMSW__
+#endif // wxOSX/Carbon
#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__)
#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
// ----------------------------------------------------------------------------