X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aef94d68609474317f4e6ce2394466750e992da9..211cc8dc907ee50ca6d383b8df16bba9a4d3ce2d:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 7c9aa3741f..72d8437e63 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -1047,13 +1047,29 @@ void wxApp::Dispatch() bool wxApp::ProcessMessage(WXMSG *wxmsg) { MSG *msg = (MSG *)wxmsg; - HWND hWnd = msg->hwnd; - wxWindow *wndThis = wxGetWindowFromHWND((WXHWND)hWnd); + HWND hwnd = msg->hwnd; + wxWindow *wndThis = wxGetWindowFromHWND((WXHWND)hwnd); + + // this may happen if the event occured in a standard modeless dialog (the + // only example of which I know of is the find/replace dialog) - then call + // IsDialogMessage() to make TAB navigation in it work + if ( !wndThis ) + { + // we need to find the dialog containing this control as + // IsDialogMessage() just eats all the messages (i.e. returns TRUE for + // them) if we call it for the control itself + while ( ::GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD ) + { + hwnd = ::GetParent(hwnd); + } + + return ::IsDialogMessage(hwnd, msg) != 0; + } #if wxUSE_TOOLTIPS // we must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to // popup the tooltip bubbles - if ( wndThis && (msg->message == WM_MOUSEMOVE) ) + if ( (msg->message == WM_MOUSEMOVE) ) { wxToolTip *tt = wndThis->GetToolTip(); if ( tt ) @@ -1063,25 +1079,39 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg) } #endif // wxUSE_TOOLTIPS - // Try translations first; find the youngest window with - // a translation table. + // allow the window to prevent certain messages from being + // translated/processed (this is currently used by wxTextCtrl to always + // grab Ctrl-C/V/X, even if they are also accelerators in some parent) + if ( !wndThis->MSWShouldPreProcessMessage(wxmsg) ) + { + return FALSE; + } + + // try translations first: the accelerators override everything wxWindow *wnd; - bool pastTopLevelWindow = FALSE; for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) { - if ( !pastTopLevelWindow && wnd->MSWTranslateMessage(wxmsg)) - return TRUE; - if ( wnd->MSWProcessMessage(wxmsg) ) + if ( wnd->MSWTranslateMessage(wxmsg)) return TRUE; // stop at first top level window, i.e. don't try to process the key // strokes originating in a dialog using the accelerators of the parent // frame - this doesn't make much sense if ( wnd->IsTopLevel() ) - pastTopLevelWindow = TRUE; + break; + } + + // now try the other hooks (kbd navigation is handled here): we start from + // wndThis->GetParent() because wndThis->MSWProcessMessage() was already + // called above + for ( wnd = wndThis->GetParent(); wnd; wnd = wnd->GetParent() ) + { + if ( wnd->MSWProcessMessage(wxmsg) ) + return TRUE; } + // no special preprocessing for this message, dispatch it normally return FALSE; } @@ -1116,7 +1146,7 @@ void wxApp::OnIdle(wxIdleEvent& event) // automated DC cache management: clear the cached DCs and bitmap // if it's likely that the app has finished with them, that is, we // get an idle event and we're not dragging anything. - if (!::GetKeyState(MK_LBUTTON) && !::GetKeyState(MK_MBUTTON) && ::GetKeyState(MK_RBUTTON)) + if (!::GetKeyState(MK_LBUTTON) && !::GetKeyState(MK_MBUTTON) && !::GetKeyState(MK_RBUTTON)) wxDC::ClearCache(); #endif // wxUSE_DC_CACHEING