From 98eadf4b9d1508bacdd4e1a4783622bb9583cdef Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Thu, 9 Aug 2007 09:38:19 +0000 Subject: [PATCH] Scrolling didn't work correctly if the user didn't move the mouse all the time. Fixed. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21868 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/TextView.cpp | 59 +++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/src/kits/interface/TextView.cpp b/src/kits/interface/TextView.cpp index 4620353062..93da49d8bc 100644 --- a/src/kits/interface/TextView.cpp +++ b/src/kits/interface/TextView.cpp @@ -90,23 +90,10 @@ enum { class _BTextTrackState_ { public: - _BTextTrackState_(BMessenger messenger) - : - clickOffset(0), - shiftDown(false), - anchor(0), - selStart(0), - selEnd(0), - fRunner(NULL) - { - BMessage message(_PING_); - fRunner = new (nothrow) BMessageRunner(messenger, &message, 300000); - } + _BTextTrackState_(BMessenger messenger); + ~_BTextTrackState_(); - ~_BTextTrackState_() - { - delete fRunner; - } + void SimulateMouseMovement(BTextView *view); int32 clickOffset; bool shiftDown; @@ -906,8 +893,10 @@ BTextView::MessageReceived(BMessage *message) delete fClickRunner; fClickRunner = NULL; } - } else + } else if (fTrackingMouse) { + fTrackingMouse->SimulateMouseMovement(this); PerformAutoScrolling(); + } break; } @@ -4539,3 +4528,39 @@ BTextView::UnlockWidthBuffer() if (atomic_add(&sWidthAtom, -1) > 1) release_sem(sWidthSem); } + + +// _BTextTrackState_ +_BTextTrackState_::_BTextTrackState_(BMessenger messenger) + : + clickOffset(0), + shiftDown(false), + anchor(0), + selStart(0), + selEnd(0), + fRunner(NULL) +{ + BMessage message(_PING_); + fRunner = new (nothrow) BMessageRunner(messenger, &message, 300000); +} + + +_BTextTrackState_::~_BTextTrackState_() +{ + delete fRunner; +} + + +void +_BTextTrackState_::SimulateMouseMovement(BTextView *textView) +{ + BPoint where; + ulong buttons; + // When the mouse cursor is still and outside the textview, + // no B_MOUSE_MOVED message are sent, obviously. But scrolling + // has to work neverthless, so we "fake" a MouseMoved() call here. + textView->GetMouse(&where, &buttons); + textView->PerformMouseMoved(where, B_INSIDE_VIEW); +} + +