mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +00:00
[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
929a2c6637
(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.
This commit is contained in:
parent
6bd0c70f15
commit
8bb9434d3e
2 changed files with 48 additions and 11 deletions
|
@ -540,7 +540,6 @@ co_IntSetScrollInfo(PWND Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw)
|
||||||
OldPos = Info->nPos;
|
OldPos = Info->nPos;
|
||||||
Info->nPos = lpsi->nPos;
|
Info->nPos = lpsi->nPos;
|
||||||
pSBData->pos = 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. */
|
else /* Show and enable scroll-bar only if no page only changed. */
|
||||||
if (lpsi->fMask != SIF_PAGE)
|
if (lpsi->fMask != SIF_PAGE)
|
||||||
{
|
{
|
||||||
new_flags = ESB_ENABLE_BOTH;
|
|
||||||
if ((nBar != SB_CTL) && bChangeParams)
|
if ((nBar != SB_CTL) && bChangeParams)
|
||||||
{
|
{
|
||||||
|
new_flags = ESB_ENABLE_BOTH;
|
||||||
action |= SA_SSI_SHOW;
|
action |= SA_SSI_SHOW;
|
||||||
}
|
}
|
||||||
|
else if (nBar == SB_CTL)
|
||||||
|
{
|
||||||
|
new_flags = ESB_ENABLE_BOTH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Window->pSBInfo->WSBflags != new_flags) /* Check arrow flags */
|
if (Window->pSBInfo->WSBflags != new_flags) /* Check arrow flags */
|
||||||
|
|
|
@ -318,6 +318,26 @@ IntGetScrollBarInfo(HWND Wnd, INT Bar, PSCROLLBARINFO ScrollBarInfo)
|
||||||
return NtUserGetScrollBarInfo(Wnd, IntScrollGetObjectId(Bar), 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
|
void
|
||||||
IntDrawScrollBar(HWND Wnd, HDC DC, INT Bar)
|
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. */
|
/* Don't update scrollbar if disabled. */
|
||||||
if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE)
|
if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE)
|
||||||
{
|
{
|
||||||
ScrollBarInfo.rgstate[ScrollTrackHitTest] |= STATE_SYSTEM_PRESSED;
|
IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, TRUE);
|
||||||
NewInfo.rgstate[ScrollTrackHitTest] = ScrollBarInfo.rgstate[ScrollTrackHitTest];
|
|
||||||
NtUserSetScrollBarInfo(Wnd, IntScrollGetObjectId(SBType), &NewInfo);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -853,12 +871,8 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt)
|
||||||
/* Don't update scrollbar if disabled. */
|
/* Don't update scrollbar if disabled. */
|
||||||
if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE)
|
if (ScrollBarInfo.rgstate[ScrollTrackHitTest] != STATE_SYSTEM_UNAVAILABLE)
|
||||||
{
|
{
|
||||||
ScrollBarInfo.rgstate[ScrollTrackHitTest] &= ~STATE_SYSTEM_PRESSED;
|
IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, FALSE);
|
||||||
NewInfo.rgstate[ScrollTrackHitTest] = ScrollBarInfo.rgstate[ScrollTrackHitTest];
|
|
||||||
NtUserSetScrollBarInfo(Wnd, IntScrollGetObjectId(SBType), &NewInfo);
|
|
||||||
|
|
||||||
IntDrawScrollInterior(Wnd,Dc,SBType,Vertical,&ScrollBarInfo);
|
IntDrawScrollInterior(Wnd,Dc,SBType,Vertical,&ScrollBarInfo);
|
||||||
IntDrawScrollArrows(Dc, &ScrollBarInfo, Vertical);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -890,9 +904,17 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt)
|
||||||
SetSystemTimer(Wnd, SCROLL_TIMER, (WM_LBUTTONDOWN == Msg) ?
|
SetSystemTimer(Wnd, SCROLL_TIMER, (WM_LBUTTONDOWN == Msg) ?
|
||||||
SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
|
SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
|
||||||
(TIMERPROC) NULL);
|
(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
|
else
|
||||||
{
|
{
|
||||||
|
IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, FALSE);
|
||||||
KillSystemTimer(Wnd, SCROLL_TIMER);
|
KillSystemTimer(Wnd, SCROLL_TIMER);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -992,8 +1014,20 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt)
|
||||||
SetSystemTimer(Wnd, SCROLL_TIMER, (WM_LBUTTONDOWN == Msg) ?
|
SetSystemTimer(Wnd, SCROLL_TIMER, (WM_LBUTTONDOWN == Msg) ?
|
||||||
SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
|
SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
|
||||||
(TIMERPROC) NULL);
|
(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
|
||||||
|
{
|
||||||
|
IntUpdateScrollArrows (Wnd, Dc, &ScrollBarInfo, &NewInfo, SBType, ScrollTrackHitTest, Vertical, FALSE);
|
||||||
|
KillSystemTimer(Wnd, SCROLL_TIMER);
|
||||||
}
|
}
|
||||||
else KillSystemTimer(Wnd, SCROLL_TIMER);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue