From: Vadim Zeitlin Date: Sun, 5 Aug 2001 15:07:28 +0000 (+0000) Subject: fixed processing of the implicit wxTextCtrl accelerators (Ctrl-C/V/X) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a37d422a667124e4cb9c7413deda637d3b1926ec fixed processing of the implicit wxTextCtrl accelerators (Ctrl-C/V/X) without breaking all the others by using a new MSWShouldPreProcessMessage() function git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11282 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/textctrl.h b/include/wx/msw/textctrl.h index b516b8c8a3..b76a6d5fb8 100644 --- a/include/wx/msw/textctrl.h +++ b/include/wx/msw/textctrl.h @@ -172,6 +172,8 @@ protected: // limit is big enough) void AdjustSpaceLimit(); + // override some base class virtuals + virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg); virtual wxSize DoGetBestSize() const; private: diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 27432a415d..587deb23ca 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -347,8 +347,20 @@ public: // Calls an appropriate default window procedure virtual long MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + // message processing helpers + + // return FALSE if the message shouldn't be translated/preprocessed but + // dispatched normally + virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg); + + // return TRUE if the message was preprocessed and shouldn't be dispatched virtual bool MSWProcessMessage(WXMSG* pMsg); + + // return TRUE if the message was translated and shouldn't be dispatched virtual bool MSWTranslateMessage(WXMSG* pMsg); + + // called when the window is about to be destroyed virtual void MSWDestroyWindow(); // Detach "Window" menu from menu bar so it doesn't get deleted diff --git a/src/msw/app.cpp b/src/msw/app.cpp index ed4fa69c07..72d8437e63 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -1079,6 +1079,14 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg) } #endif // wxUSE_TOOLTIPS + // 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; @@ -1094,13 +1102,16 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg) break; } - // now try the other hooks (kbd navigation is handled here) - for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) + // 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; } diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index f692d48578..c6beb418d7 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -928,6 +928,52 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event) } } +// ---------------------------------------------------------------------------- +// kbd input processing +// ---------------------------------------------------------------------------- + +bool wxTextCtrl::MSWShouldPreProcessMessage(WXMSG* pMsg) +{ + MSG *msg = (MSG *)pMsg; + + // check for our special keys here: if we don't do it and the parent frame + // uses them as accelerators, they wouldn't work at all, so we disable + // usual preprocessing for them + if ( msg->message == WM_KEYDOWN ) + { + WORD vkey = msg->wParam; + if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN ) + { + if ( vkey == VK_BACK ) + return FALSE; + } + else // no Alt + { + if ( wxIsCtrlDown() ) + { + switch ( vkey ) + { + case 'C': + case 'V': + case 'X': + case VK_INSERT: + case VK_DELETE: + case VK_HOME: + case VK_END: + return FALSE; + } + } + else if ( wxIsShiftDown() ) + { + if ( vkey == VK_INSERT || vkey == VK_DELETE ) + return FALSE; + } + } + } + + return wxControl::MSWShouldPreProcessMessage(pMsg); +} + void wxTextCtrl::OnChar(wxKeyEvent& event) { switch ( event.KeyCode() ) diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 27298fab61..05e43c34de 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1958,6 +1958,12 @@ bool wxWindowMSW::MSWTranslateMessage(WXMSG* pMsg) #endif // wxUSE_ACCEL } +bool wxWindowMSW::MSWShouldPreProcessMessage(WXMSG* pMsg) +{ + // preprocess all messages by default + return TRUE; +} + // --------------------------------------------------------------------------- // message params unpackers (different for Win16 and Win32) // ---------------------------------------------------------------------------