diff --git a/include/wx/stc/stc.h b/include/wx/stc/stc.h index 559f8823d4..26ee4d5eba 100644 --- a/include/wx/stc/stc.h +++ b/include/wx/stc/stc.h @@ -4292,9 +4292,8 @@ protected: bool m_lastKeyDownConsumed; - // the timestamp that consists of the last wheel event - // added to the time taken to process that event. - long m_lastWheelTimestamp; + // Time until when we should ignore any new mouse wheel events. + wxLongLong m_timeToBlockWheelEventsUntil; friend class ScintillaWX; friend class Platform; diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp index c31f350f55..65713e1b49 100644 --- a/src/stc/stc.cpp +++ b/src/stc/stc.cpp @@ -199,7 +199,7 @@ bool wxStyledTextCtrl::Create(wxWindow *parent, m_swx = new ScintillaWX(this); m_stopWatch.Start(); m_lastKeyDownConsumed = false; - m_lastWheelTimestamp = 0; + m_timeToBlockWheelEventsUntil = 0; m_vScrollBar = NULL; m_hScrollBar = NULL; #if wxUSE_UNICODE @@ -4264,18 +4264,24 @@ void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) { void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) { - // prevent having an event queue with wheel events that cannot be processed - // reasonably fast (see ticket #9057) - if ( m_lastWheelTimestamp <= evt.GetTimestamp() ) + // Prevent having an event queue with wheel events that cannot be processed + // reasonably fast (see ticket #9057) by ignoring all of them that happen + // during the time interval corresponding to the time it took us to handle + // the last one. + // + // Notice the use of TimeInMicro() instead of Time() to avoid overflow in + // long running programs. + if ( m_timeToBlockWheelEventsUntil <= m_stopWatch.TimeInMicro() ) { - m_lastWheelTimestamp = m_stopWatch.Time(); + const wxLongLong beforeMouseWheel = m_stopWatch.TimeInMicro(); m_swx->DoMouseWheel(evt.GetWheelRotation(), evt.GetWheelDelta(), evt.GetLinesPerAction(), evt.ControlDown(), evt.IsPageScroll()); - m_lastWheelTimestamp = m_stopWatch.Time() - m_lastWheelTimestamp; - m_lastWheelTimestamp += evt.GetTimestamp(); + const wxLongLong afterMouseWheel = m_stopWatch.TimeInMicro(); + m_timeToBlockWheelEventsUntil = afterMouseWheel; + m_timeToBlockWheelEventsUntil += afterMouseWheel - beforeMouseWheel; } } diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in index 2dfa4ec02a..ec2e890e47 100644 --- a/src/stc/stc.cpp.in +++ b/src/stc/stc.cpp.in @@ -199,7 +199,7 @@ bool wxStyledTextCtrl::Create(wxWindow *parent, m_swx = new ScintillaWX(this); m_stopWatch.Start(); m_lastKeyDownConsumed = false; - m_lastWheelTimestamp = 0; + m_timeToBlockWheelEventsUntil = 0; m_vScrollBar = NULL; m_hScrollBar = NULL; #if wxUSE_UNICODE @@ -764,18 +764,24 @@ void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) { void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) { - // prevent having an event queue with wheel events that cannot be processed - // reasonably fast (see ticket #9057) - if ( m_lastWheelTimestamp <= evt.GetTimestamp() ) + // Prevent having an event queue with wheel events that cannot be processed + // reasonably fast (see ticket #9057) by ignoring all of them that happen + // during the time interval corresponding to the time it took us to handle + // the last one. + // + // Notice the use of TimeInMicro() instead of Time() to avoid overflow in + // long running programs. + if ( m_timeToBlockWheelEventsUntil <= m_stopWatch.TimeInMicro() ) { - m_lastWheelTimestamp = m_stopWatch.Time(); + const wxLongLong beforeMouseWheel = m_stopWatch.TimeInMicro(); m_swx->DoMouseWheel(evt.GetWheelRotation(), evt.GetWheelDelta(), evt.GetLinesPerAction(), evt.ControlDown(), evt.IsPageScroll()); - m_lastWheelTimestamp = m_stopWatch.Time() - m_lastWheelTimestamp; - m_lastWheelTimestamp += evt.GetTimestamp(); + const wxLongLong afterMouseWheel = m_stopWatch.TimeInMicro(); + m_timeToBlockWheelEventsUntil = afterMouseWheel; + m_timeToBlockWheelEventsUntil += afterMouseWheel - beforeMouseWheel; } } diff --git a/src/stc/stc.h.in b/src/stc/stc.h.in index 73fa5603c9..55e0501f78 100644 --- a/src/stc/stc.h.in +++ b/src/stc/stc.h.in @@ -490,9 +490,8 @@ protected: bool m_lastKeyDownConsumed; - // the timestamp that consists of the last wheel event - // added to the time taken to process that event. - long m_lastWheelTimestamp; + // Time until when we should ignore any new mouse wheel events. + wxLongLong m_timeToBlockWheelEventsUntil; friend class ScintillaWX; friend class Platform;