https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8bb9434d3eeeb3434348bb...
commit 8bb9434d3eeeb3434348bb88f05a87ca31ba115e Author: Joachim Henze Joachim.Henze@reactos.org AuthorDate: Wed Mar 11 00:01:46 2020 +0100 Commit: Joachim Henze Joachim.Henze@reactos.org CommitDate: Thu Mar 12 22:55:04 2020 +0100
[WIN32SS] Fix regression CORE-16721
"Scrolling by pressing the scrollbar arrows does not draw the arrows as pressed" Fixed by a patch of JIRA-user 'I_kill_bugs'. Thank you very much!
The regression was introduced by 0.4.11-dev-586-g 929a2c6637b18cc14e259fe2f2d3d9635a10b2e9 (which itself aimed to fix CORE-13986, but not CORE-13918 as erroneously stated in commit comment)
I intend to port this back into 0.4.13-RC later. --- win32ss/user/ntuser/scrollbar.c | 7 +++-- win32ss/user/user32/controls/scrollbar.c | 52 ++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 11 deletions(-)
diff --git a/win32ss/user/ntuser/scrollbar.c b/win32ss/user/ntuser/scrollbar.c index 6bbc7ae7bc6..ece40873a49 100644 --- a/win32ss/user/ntuser/scrollbar.c +++ b/win32ss/user/ntuser/scrollbar.c @@ -540,7 +540,6 @@ co_IntSetScrollInfo(PWND Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) OldPos = Info->nPos; Info->nPos = lpsi->nPos; pSBData->pos = lpsi->nPos; - bChangeParams = TRUE; } }
@@ -614,11 +613,15 @@ co_IntSetScrollInfo(PWND Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) else /* Show and enable scroll-bar only if no page only changed. */ if (lpsi->fMask != SIF_PAGE) { - new_flags = ESB_ENABLE_BOTH; if ((nBar != SB_CTL) && bChangeParams) { + new_flags = ESB_ENABLE_BOTH; action |= SA_SSI_SHOW; } + else if (nBar == SB_CTL) + { + new_flags = ESB_ENABLE_BOTH; + } }
if (Window->pSBInfo->WSBflags != new_flags) /* Check arrow flags */ diff --git a/win32ss/user/user32/controls/scrollbar.c b/win32ss/user/user32/controls/scrollbar.c index 1e1249e296c..8e5983e5d7b 100644 --- a/win32ss/user/user32/controls/scrollbar.c +++ b/win32ss/user/user32/controls/scrollbar.c @@ -318,6 +318,26 @@ IntGetScrollBarInfo(HWND Wnd, INT Bar, PSCROLLBARINFO ScrollBarInfo) return NtUserGetScrollBarInfo(Wnd, IntScrollGetObjectId(Bar), ScrollBarInfo); }
+static VOID FASTCALL +IntUpdateScrollArrows(HWND Wnd, HDC hDC, PSCROLLBARINFO ScrollBarInfo, + SETSCROLLBARINFO *info, INT SBType, INT Arrow, + BOOL Vertical, BOOL Pressed) +{ + if (Pressed) + { + ScrollBarInfo->rgstate[Arrow] |= STATE_SYSTEM_PRESSED; + } + else + { + ScrollBarInfo->rgstate[Arrow] &= ~STATE_SYSTEM_PRESSED; + } + /* Update arrow state */ + info->rgstate[Arrow] = ScrollBarInfo->rgstate[Arrow]; + NtUserSetScrollBarInfo(Wnd, IntScrollGetObjectId(SBType), info); + + IntDrawScrollArrows(hDC, ScrollBarInfo, Vertical); +} + void IntDrawScrollBar(HWND Wnd, HDC DC, INT Bar) { @@ -834,9 +854,7 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt) /* Don't update scrollbar if disabled. */ if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE) { - ScrollBarInfo.rgstate[ScrollTrackHitTest] |= STATE_SYSTEM_PRESSED; - NewInfo.rgstate[ScrollTrackHitTest] = ScrollBarInfo.rgstate[ScrollTrackHitTest]; - NtUserSetScrollBarInfo(Wnd, IntScrollGetObjectId(SBType), &NewInfo); + IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, TRUE); } break;
@@ -853,12 +871,8 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt) /* Don't update scrollbar if disabled. */ if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE) { - ScrollBarInfo.rgstate[ScrollTrackHitTest] &= ~STATE_SYSTEM_PRESSED; - NewInfo.rgstate[ScrollTrackHitTest] = ScrollBarInfo.rgstate[ScrollTrackHitTest]; - NtUserSetScrollBarInfo(Wnd, IntScrollGetObjectId(SBType), &NewInfo); - + IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, FALSE); IntDrawScrollInterior(Wnd,Dc,SBType,Vertical,&ScrollBarInfo); - IntDrawScrollArrows(Dc, &ScrollBarInfo, Vertical); } break;
@@ -890,9 +904,17 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt) SetSystemTimer(Wnd, SCROLL_TIMER, (WM_LBUTTONDOWN == Msg) ? SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, (TIMERPROC) NULL); + if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE) + { + if (!(ScrollBarInfo.rgstate[ScrollTrackHitTest] &= STATE_SYSTEM_PRESSED)) + { + IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, TRUE); + } + } } else { + IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, FALSE); KillSystemTimer(Wnd, SCROLL_TIMER); } break; @@ -992,8 +1014,20 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt) SetSystemTimer(Wnd, SCROLL_TIMER, (WM_LBUTTONDOWN == Msg) ? SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, (TIMERPROC) NULL); + if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE) + { + if (!(ScrollBarInfo.rgstate[ScrollTrackHitTest] &= STATE_SYSTEM_PRESSED)) + { + TRACE("Set Arrow\n"); + IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, TRUE); + } + } } - else KillSystemTimer(Wnd, SCROLL_TIMER); + else + { + IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, FALSE); + KillSystemTimer(Wnd, SCROLL_TIMER); + } break; }