Author: jimtabor Date: Mon Mar 6 18:28:03 2017 New Revision: 74116
URL: http://svn.reactos.org/svn/reactos?rev=74116&view=rev Log: [NtUser] - Remove scroll bar search that sends another WM_NCCALCSIZE message. Use wine as an example. See CORE-12827.
Modified: trunk/reactos/win32ss/user/ntuser/nonclient.c trunk/reactos/win32ss/user/ntuser/scrollbar.c
Modified: trunk/reactos/win32ss/user/ntuser/nonclient.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/nonclie... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/nonclient.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/nonclient.c [iso-8859-1] Mon Mar 6 18:28:03 2017 @@ -1171,7 +1171,8 @@ LRESULT Result = 0; SIZE WindowBorders; RECT OrigRect; - DWORD Style = Wnd->style; + LONG Style = Wnd->style; + LONG exStyle = Wnd->ExStyle;
if (Rect == NULL) { @@ -1239,83 +1240,30 @@ RECTL_vInflateRect(Rect, -2 * UserGetSystemMetrics(SM_CXBORDER), -2 * UserGetSystemMetrics(SM_CYBORDER)); }
- if (Wnd->style & (WS_VSCROLL | WS_HSCROLL)) - { - SCROLLBARINFO sbi; - SETSCROLLBARINFO ssbi; - - sbi.cbSize = sizeof(SCROLLBARINFO); - if ((Style & WS_VSCROLL) && co_IntGetScrollBarInfo(Wnd, OBJID_VSCROLL, &sbi)) - { - int i; - LONG sx = Rect->right; - - Wnd->state |= WNDS_HASVERTICALSCROOLLBAR; - - sx -= UserGetSystemMetrics(SM_CXVSCROLL); - - for (i = 0; i <= CCHILDREN_SCROLLBAR; i++) - ssbi.rgstate[i] = sbi.rgstate[i]; - - if (sx <= Rect->left) - ssbi.rgstate[0] |= STATE_SYSTEM_OFFSCREEN; - else - ssbi.rgstate[0] &= ~STATE_SYSTEM_OFFSCREEN; - - co_IntSetScrollBarInfo(Wnd, OBJID_VSCROLL, &ssbi); - - if (ssbi.rgstate[0] & STATE_SYSTEM_OFFSCREEN) - Style &= ~WS_VSCROLL; - } - else - Style &= ~WS_VSCROLL; - - if ((Style & WS_HSCROLL) && co_IntGetScrollBarInfo(Wnd, OBJID_HSCROLL, &sbi)) - { - int i; - LONG sy = Rect->bottom; - - Wnd->state |= WNDS_HASHORIZONTALSCROLLBAR; - - sy -= UserGetSystemMetrics(SM_CYHSCROLL); - - for (i = 0; i <= CCHILDREN_SCROLLBAR; i++) - ssbi.rgstate[i] = sbi.rgstate[i]; - - if (sy <= Rect->top) - ssbi.rgstate[0] |= STATE_SYSTEM_OFFSCREEN; - else - ssbi.rgstate[0] &= ~STATE_SYSTEM_OFFSCREEN; - - co_IntSetScrollBarInfo(Wnd, OBJID_HSCROLL, &ssbi); - - if (ssbi.rgstate[0] & STATE_SYSTEM_OFFSCREEN) - Style &= ~WS_HSCROLL; - } - else - Style &= ~WS_HSCROLL; - } - - if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL)) - { - if ((Wnd->ExStyle & WS_EX_LEFTSCROLLBAR) != 0) - Rect->left += UserGetSystemMetrics(SM_CXVSCROLL); - else - Rect->right -= UserGetSystemMetrics(SM_CXVSCROLL); - - Rect->bottom -= UserGetSystemMetrics(SM_CYHSCROLL); - } - else - { - if (Style & WS_VSCROLL) + if (Style & WS_VSCROLL) + { + if (Rect->right - Rect->left >= UserGetSystemMetrics(SM_CXVSCROLL)) { - if ((Wnd->ExStyle & WS_EX_LEFTSCROLLBAR) != 0) - Rect->left += UserGetSystemMetrics(SM_CXVSCROLL); - else - Rect->right -= UserGetSystemMetrics(SM_CXVSCROLL); + Wnd->state |= WNDS_HASVERTICALSCROOLLBAR; + + /* rectangle is in screen coords when wparam is false */ + if (!wparam && (exStyle & WS_EX_LAYOUTRTL)) exStyle ^= WS_EX_LEFTSCROLLBAR; + + if((exStyle & WS_EX_LEFTSCROLLBAR) != 0) + Rect->left += UserGetSystemMetrics(SM_CXVSCROLL); + else + Rect->right -= UserGetSystemMetrics(SM_CXVSCROLL); + } + } + + if (Style & WS_HSCROLL) + { + if( Rect->bottom - Rect->top > UserGetSystemMetrics(SM_CYHSCROLL)) + { + Wnd->state |= WNDS_HASHORIZONTALSCROLLBAR; + + Rect->bottom -= UserGetSystemMetrics(SM_CYHSCROLL); } - else if (Style & WS_HSCROLL) - Rect->bottom -= UserGetSystemMetrics(SM_CYHSCROLL); }
if (Rect->top > Rect->bottom)
Modified: trunk/reactos/win32ss/user/ntuser/scrollbar.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/scrollb... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/scrollbar.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/scrollbar.c [iso-8859-1] Mon Mar 6 18:28:03 2017 @@ -358,6 +358,106 @@ return (Mask & SIF_ALL) !=0; }
+/************************************************************************* + * SCROLL_GetScrollBarInfo + * + * Internal helper for the API function + * + * PARAMS + * hwnd [I] Handle of window with scrollbar(s) + * idObject [I] One of OBJID_CLIENT, OBJID_HSCROLL, or OBJID_VSCROLL + * info [IO] cbSize specifies the size of the structure + * + * RETURNS + * FALSE if failed + */ +#if 0 +static BOOL SCROLL_GetScrollBarInfo(HWND hwnd, LONG idObject, LPSCROLLBARINFO info) +{ + LPSCROLLBAR_INFO infoPtr; + INT nBar; + INT nDummy; + DWORD style = GetWindowLongW(hwnd, GWL_STYLE); + BOOL pressed; + RECT rect; + + switch (idObject) + { + case OBJID_CLIENT: nBar = SB_CTL; break; + case OBJID_HSCROLL: nBar = SB_HORZ; break; + case OBJID_VSCROLL: nBar = SB_VERT; break; + default: return FALSE; + } + + /* handle invalid data structure */ + if (info->cbSize != sizeof(*info)) + return FALSE; + + SCROLL_GetScrollBarRect(hwnd, nBar, &info->rcScrollBar, &nDummy, + &info->dxyLineButton, &info->xyThumbTop); + /* rcScrollBar needs to be in screen coordinates */ + GetWindowRect(hwnd, &rect); + OffsetRect(&info->rcScrollBar, rect.left, rect.top); + + info->xyThumbBottom = info->xyThumbTop + info->dxyLineButton; + + infoPtr = SCROLL_GetInternalInfo(hwnd, nBar, TRUE); + if (!infoPtr) + return FALSE; + + /* Scroll bar state */ + info->rgstate[0] = 0; + if ((nBar == SB_HORZ && !(style & WS_HSCROLL)) + || (nBar == SB_VERT && !(style & WS_VSCROLL))) + info->rgstate[0] |= STATE_SYSTEM_INVISIBLE; + if (infoPtr->minVal >= infoPtr->maxVal - max(infoPtr->page - 1, 0)) + { + if (!(info->rgstate[0] & STATE_SYSTEM_INVISIBLE)) + info->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE; + else + info->rgstate[0] |= STATE_SYSTEM_OFFSCREEN; + } + if (nBar == SB_CTL && !IsWindowEnabled(hwnd)) + info->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE; + + pressed = ((nBar == SB_VERT) == SCROLL_trackVertical && GetCapture() == hwnd); + + /* Top/left arrow button state. MSDN says top/right, but I don't believe it */ + info->rgstate[1] = 0; + if (pressed && SCROLL_trackHitTest == SCROLL_TOP_ARROW) + info->rgstate[1] |= STATE_SYSTEM_PRESSED; + if (infoPtr->flags & ESB_DISABLE_LTUP) + info->rgstate[1] |= STATE_SYSTEM_UNAVAILABLE; + + /* Page up/left region state. MSDN says up/right, but I don't believe it */ + info->rgstate[2] = 0; + if (infoPtr->curVal == infoPtr->minVal) + info->rgstate[2] |= STATE_SYSTEM_INVISIBLE; + if (pressed && SCROLL_trackHitTest == SCROLL_TOP_RECT) + info->rgstate[2] |= STATE_SYSTEM_PRESSED; + + /* Thumb state */ + info->rgstate[3] = 0; + if (pressed && SCROLL_trackHitTest == SCROLL_THUMB) + info->rgstate[3] |= STATE_SYSTEM_PRESSED; + + /* Page down/right region state. MSDN says down/left, but I don't believe it */ + info->rgstate[4] = 0; + if (infoPtr->curVal >= infoPtr->maxVal - 1) + info->rgstate[4] |= STATE_SYSTEM_INVISIBLE; + if (pressed && SCROLL_trackHitTest == SCROLL_BOTTOM_RECT) + info->rgstate[4] |= STATE_SYSTEM_PRESSED; + + /* Bottom/right arrow button state. MSDN says bottom/left, but I don't believe it */ + info->rgstate[5] = 0; + if (pressed && SCROLL_trackHitTest == SCROLL_BOTTOM_ARROW) + info->rgstate[5] |= STATE_SYSTEM_PRESSED; + if (infoPtr->flags & ESB_DISABLE_RTDN) + info->rgstate[5] |= STATE_SYSTEM_UNAVAILABLE; + + return TRUE; +} +#endif static DWORD FASTCALL co_IntSetScrollInfo(PWND Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) { @@ -575,6 +675,21 @@ IntGetScrollBarRect(Window, Bar, &(sbi->rcScrollBar)); IntCalculateThumb(Window, Bar, sbi, pSBData);
+ /* Scroll bar state */ + psbi->rgstate[0] = 0; + if ((Bar == SB_HORZ && !(Window->style & WS_HSCROLL)) + || (Bar == SB_VERT && !(Window->style & WS_VSCROLL))) + psbi->rgstate[0] |= STATE_SYSTEM_INVISIBLE; + if (pSBData->posMin >= pSBData->posMax - max(pSBData->page - 1, 0)) + { + if (!(psbi->rgstate[0] & STATE_SYSTEM_INVISIBLE)) + psbi->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE; + else + psbi->rgstate[0] |= STATE_SYSTEM_OFFSCREEN; + } + if (Bar == SB_CTL && !(Window->style & WS_DISABLED)) + psbi->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE; + RtlCopyMemory(psbi, sbi, sizeof(SCROLLBARINFO));
return TRUE;