From 391364946e8905c4d6af342b9a3641cb6b8d4f79 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 2 Apr 1999 22:08:39 +0000 Subject: [PATCH] a simpler fix of textctrl key doubling bug git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/textctrl.cpp | 46 ++++++++++++++------------------------------ src/msw/window.cpp | 30 ++++++++--------------------- 2 files changed, 22 insertions(+), 54 deletions(-) diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 558855f000..63bcc632f2 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -443,7 +443,7 @@ long wxTextCtrl::GetLastPosition() const // This gets the char index for the _beginning_ of the last line int charIndex = (int)SendMessage(hWnd, EM_LINEINDEX, (WPARAM)(noLines-1), (LPARAM)0L); - + // Get number of characters in the last line. We'll add this to the character // index for the last line, 1st position. int lineLength = (int)SendMessage(hWnd, EM_LINELENGTH, (WPARAM)charIndex, (LPARAM)0L); @@ -457,7 +457,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) HWND hWnd = (HWND) GetHWND(); long fromChar = from; long toChar = to; - + // Set selection and remove it #ifdef __WIN32__ SendMessage(hWnd, EM_SETSEL, fromChar, toChar); @@ -481,7 +481,7 @@ void wxTextCtrl::Remove(long from, long to) HWND hWnd = (HWND) GetHWND(); long fromChar = from; long toChar = to; - + // Cut all selected text #ifdef __WIN32__ SendMessage(hWnd, EM_SETSEL, fromChar, toChar); @@ -504,7 +504,7 @@ void wxTextCtrl::SetSelection(long from, long to) fromChar = 0; toChar = -1; } - + #ifdef __WIN32__ SendMessage(hWnd, EM_SETSEL, (WPARAM)fromChar, (LPARAM)toChar); SendMessage(hWnd, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0); @@ -659,7 +659,7 @@ void wxTextCtrl::DiscardEdits() * Some of the following functions are yet to be implemented * */ - + int wxTextCtrl::GetNumberOfLines() const { return (int)SendMessage((HWND) GetHWND(), EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0); @@ -705,7 +705,7 @@ void wxTextCtrl::ShowPosition(long pos) int currentLineLineNo = (int)SendMessage(hWnd, EM_GETFIRSTVISIBLELINE, (WPARAM)0, (LPARAM)0L); int specifiedLineLineNo = (int)SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)pos, (LPARAM)0L); - + int linesToScroll = specifiedLineLineNo - currentLineLineNo; if (linesToScroll != 0) @@ -732,7 +732,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const /* * Text item */ - + void wxTextCtrl::Command(wxCommandEvent & event) { SetValue (event.GetString()); @@ -752,7 +752,7 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event) // AT&T's "C++ Lanuage System Release 3.0 Library Manual" - Stein Somers //========================================================================= -// Called then the buffer is full (gcc 2.6.3) +// Called then the buffer is full (gcc 2.6.3) // or when "endl" is output (Borland 4.5) //========================================================================= // Class declaration using multiple inheritance doesn't work properly for @@ -770,7 +770,7 @@ int wxTextCtrl::overflow(int c) return EOF; } #endif - + // Verify that there are no characters in get area if ( gptr() && gptr() < egptr() ) { @@ -955,26 +955,8 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) { switch( event.KeyCode() ) { - // VZ: commented out until somebody explains to me what it does -#if 0 - // Fix by Marcel Rasche to allow Alt-Ctrl insertion of special characters - case '{': - case '}': - case '[': - case ']': - case '|': - case '~': - case '\\': - { - char c = (char)event.KeyCode(); - WriteText(c); - } - break; -#endif // 0 - case WXK_RETURN: - { - if ( (m_windowStyle & wxTE_MULTILINE) == 0 ) + if ( !(m_windowStyle & wxTE_MULTILINE) ) { wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); event.SetEventObject( this ); @@ -984,7 +966,6 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) //else: multiline controls need Enter for themselves break; - } case WXK_TAB: // only produce navigation event if we don't process TAB ourself or @@ -999,7 +980,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) eventNav.SetDirection(!event.ShiftDown()); eventNav.SetWindowChange(FALSE); eventNav.SetEventObject(this); - + if ( GetEventHandler()->ProcessEvent(eventNav) ) return; } @@ -1007,8 +988,9 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) default: event.Skip(); + return; } - + // don't just call event.Skip() because this will cause TABs and ENTERs // be passed upwards and we don't always want this - instead process it // right here @@ -1032,7 +1014,7 @@ long wxTextCtrl::MSWGetDlgCode() lRc |= DLGC_WANTMESSAGE; if ( m_windowStyle & wxTE_PROCESS_TAB ) lRc |= DLGC_WANTTAB; - + return lRc; } diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 2a3c008acf..7149e45154 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -2038,27 +2038,23 @@ long wxWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) long wxWindow::Default() { - // Ignore 'fake' events (perhaps generated as a result of a separate real event) - if (m_lastMsg == 0) + // Ignore 'fake' events (perhaps generated as a result of a separate real + // event) + if ( m_lastMsg == 0 ) return 0; #ifdef __WXDEBUG__ wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.", - wxGetMessageName(m_lastMsg)); + wxGetMessageName(m_lastMsg)); #endif // __WXDEBUG__ - long ret = this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); - - // The idea here is to prevent MSWDefWindowProc from being called twice, - // which it can be where OnChar/OnKeyDown are concerned (because OnChar is - // sometimes called in wxWin where it isn't in MSW) - m_lastMsg = 0; - return ret; + return MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam); } bool wxWindow::MSWProcessMessage(WXMSG* pMsg) { - if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) { + if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) + { // intercept dialog navigation keys MSG *msg = (MSG *)pMsg; bool bProcess = TRUE; @@ -3790,17 +3786,7 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) void wxWindow::OnChar(wxKeyEvent& event) { - bool isVirtual; - int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual); - - if ( id == -1 ) - id= m_lastWParam; - - if ( !event.ControlDown() ) // Why this test? - { - if (m_lastMsg != 0) - (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam); - } + event.Skip(); } void wxWindow::OnKeyDown(wxKeyEvent& event)