From 951b725b8c001003b38f0b009b6d6df55cb6ec02 Mon Sep 17 00:00:00 2001 From: rubidium Date: Fri, 15 Oct 2010 11:16:14 +0000 Subject: (svn r20922) -Fix [FS#4071]: accidentally moving the mouse of the scrollbar arrows while pressing it clicks the button next to the arrow --- src/widget.cpp | 6 +++--- src/widget_type.h | 1 + src/window.cpp | 9 +++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/widget.cpp b/src/widget.cpp index 4a1ce8507..fe0f2ce4b 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -89,7 +89,7 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in _scroller_click_timeout = 3; sb->UpdatePosition(rtl ? 1 : -1); } - _left_button_clicked = false; + w->scrolling_scrollbar = sb->index; } else if (pos >= ma - 10) { /* Pressing the lower button? */ SetBit(sb->disp_flags, NDB_SCROLLBAR_DOWN); @@ -98,7 +98,7 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in _scroller_click_timeout = 3; sb->UpdatePosition(rtl ? -1 : 1); } - _left_button_clicked = false; + w->scrolling_scrollbar = sb->index; } else { Point pt = HandleScrollbarHittest(sb, mi, ma, sb->type == NWID_HSCROLLBAR); @@ -1686,7 +1686,7 @@ void NWidgetScrollbar::Draw(const Window *w) bool up_lowered = HasBit(this->disp_flags, NDB_SCROLLBAR_UP); bool down_lowered = HasBit(this->disp_flags, NDB_SCROLLBAR_DOWN); - bool middle_lowered = (w->scrolling_scrollbar == this->index); + bool middle_lowered = !(this->disp_flags & ND_SCROLLBAR_BTN) && w->scrolling_scrollbar == this->index; if (this->type == NWID_HSCROLLBAR) { DrawHorizontalScrollbar(r, this->colour, up_lowered, middle_lowered, down_lowered, this); diff --git a/src/widget_type.h b/src/widget_type.h index 467680fd4..96d40d95c 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -262,6 +262,7 @@ enum NWidgetDisplay { ND_DROPDOWN_ACTIVE = 1 << NDB_DROPDOWN_ACTIVE, ///< Bit value of the 'dropdown active' flag. ND_SCROLLBAR_UP = 1 << NDB_SCROLLBAR_UP, ///< Bit value of the 'scrollbar up' flag. ND_SCROLLBAR_DOWN = 1 << NDB_SCROLLBAR_DOWN, ///< Bit value of the 'scrollbar down' flag. + ND_SCROLLBAR_BTN = ND_SCROLLBAR_UP | ND_SCROLLBAR_DOWN, ///< Bit value of the 'scrollbar up' or 'scrollbar down' flag. }; DECLARE_ENUM_AS_BIT_SET(NWidgetDisplay) diff --git a/src/window.cpp b/src/window.cpp index b362ffcc8..6b03e23d5 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1861,6 +1861,15 @@ static EventState HandleScrollbarScrolling() i = _cursor.pos.y - _cursorpos_drag_start.y; } + if (sb->disp_flags & ND_SCROLLBAR_BTN) { + if (_scroller_click_timeout == 1) { + _scroller_click_timeout = 3; + sb->UpdatePosition(rtl == HasBit(sb->disp_flags, NDB_SCROLLBAR_UP) ? 1 : -1); + w->SetDirty(); + } + return ES_HANDLED; + } + /* Find the item we want to move to and make sure it's inside bounds. */ int pos = min(max(0, i + _scrollbar_start_pos) * sb->GetCount() / _scrollbar_size, max(0, sb->GetCount() - sb->GetCapacity())); if (rtl) pos = max(0, sb->GetCount() - sb->GetCapacity() - pos); -- cgit v1.2.3-54-g00ecf