X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d7cff34d1f6a2088edcfce3ea5934cdfc6658eb4..21689736a7139bc341463ab3db9329029fb93b85:/src/common/popupcmn.cpp diff --git a/src/common/popupcmn.cpp b/src/common/popupcmn.cpp index dd72510c5f..d0f204c4c9 100644 --- a/src/common/popupcmn.cpp +++ b/src/common/popupcmn.cpp @@ -34,6 +34,8 @@ #ifndef WX_PRECOMP #include "wx/combobox.h" // wxComboControl + #include "wx/app.h" // wxPostEvent + #include "wx/log.h" #endif //WX_PRECOMP #ifdef __WXUNIVERSAL__ @@ -215,12 +217,13 @@ void wxPopupTransientWindow::PopHandlers() if ( m_focus ) { +#ifndef __WXX11__ if ( !m_focus->RemoveEventHandler(m_handlerFocus) ) { // see above m_handlerFocus = NULL; } - +#endif m_focus = NULL; } } @@ -250,6 +253,8 @@ void wxPopupTransientWindow::Popup(wxWindow *winFocus) m_focus = winFocus ? winFocus : this; m_focus->SetFocus(); +#ifndef __WXX11__ + #ifdef __WXMSW__ // MSW doesn't allow to set focus to the popup window, but we need to // subclass the window which has the focus, and not winFocus passed in or @@ -263,6 +268,8 @@ void wxPopupTransientWindow::Popup(wxWindow *winFocus) m_focus->PushEventHandler(m_handlerFocus); } + +#endif // !__WXX11__ } void wxPopupTransientWindow::Dismiss() @@ -354,11 +361,34 @@ void wxPopupWindowHandler::OnLeftDown(wxMouseEvent& event) wxWindow *sbar = NULL; wxWindow *win = (wxWindow *)event.GetEventObject(); + switch ( win->HitTest(pos.x, pos.y) ) { case wxHT_WINDOW_OUTSIDE: - // clicking outside a popup dismisses it - m_popup->DismissAndNotify(); + { + // do the coords translation now as after DismissAndNotify() + // m_popup may be destroyed + wxMouseEvent event2(event); + + m_popup->ClientToScreen(&event2.m_x, &event2.m_y); + + // clicking outside a popup dismisses it + m_popup->DismissAndNotify(); + + // dismissing a tooltip shouldn't waste a click, i.e. you + // should be able to dismiss it and press the button with the + // same click, so repost this event to the window beneath us + wxWindow *win = wxFindWindowAtPoint(event2.GetPosition()); + if ( win ) + { + // translate the event coords to the ones of the window + // which is going to get the event + win->ScreenToClient(&event2.m_x, &event2.m_y); + + event2.SetEventObject(win); + wxPostEvent(win, event2); + } + } break; #ifdef __WXUNIVERSAL__ @@ -418,8 +448,15 @@ void wxPopupFocusHandler::OnKillFocus(wxFocusEvent& event) // when we lose focus we always disappear - unless it goes to the popup (in // which case we don't really lose it) - if ( event.GetWindow() != m_popup ) - m_popup->DismissAndNotify(); + wxWindow *win = event.GetWindow(); + while ( win ) + { + if ( win == m_popup ) + return; + win = win->GetParent(); + } + + m_popup->DismissAndNotify(); } void wxPopupFocusHandler::OnKeyDown(wxKeyEvent& event)