- Removed NtUserGetScrollInfo and replaced it, move more type names in window object to WND.

svn path=/trunk/; revision=45021
This commit is contained in:
James Tabor 2010-01-10 07:50:57 +00:00
parent ba16f69763
commit 3d60e751ce
14 changed files with 123 additions and 131 deletions

View file

@ -573,7 +573,7 @@ IntScrollGetScrollBarRect(HWND Wnd, INT Bar, RECT *Rect,
{ {
SCROLLINFO Info; SCROLLINFO Info;
NtUserGetScrollInfo(Wnd, Bar, &Info); NtUserSBGetParms(Wnd, Bar, NULL, &Info);
*ArrowSize = GetSystemMetrics(SM_CXVSCROLL); *ArrowSize = GetSystemMetrics(SM_CXVSCROLL);
Pixels -= (2 * GetSystemMetrics(SM_CXVSCROLL)); Pixels -= (2 * GetSystemMetrics(SM_CXVSCROLL));
@ -637,7 +637,7 @@ IntScrollGetThumbVal(HWND Wnd, INT SBType, PSCROLLBARINFO ScrollBarInfo,
si.cbSize = sizeof(SCROLLINFO); si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE | SIF_PAGE; si.fMask = SIF_RANGE | SIF_PAGE;
NtUserGetScrollInfo(Wnd, SBType, &si); NtUserSBGetParms(Wnd, SBType, NULL, &si);
if ((Pixels -= 2 * ScrollBarInfo->dxyLineButton) <= 0) if ((Pixels -= 2 * ScrollBarInfo->dxyLineButton) <= 0)
{ {
return si.nMin; return si.nMin;
@ -1139,7 +1139,7 @@ IntScrollGetScrollPos(HWND Wnd, INT Bar)
ScrollInfo.cbSize = sizeof(SCROLLINFO); ScrollInfo.cbSize = sizeof(SCROLLINFO);
ScrollInfo.fMask = SIF_POS; ScrollInfo.fMask = SIF_POS;
if (! NtUserGetScrollInfo(Wnd, Bar, &ScrollInfo)) if (! NtUserSBGetParms(Wnd, Bar, NULL, &ScrollInfo))
{ {
return 0; return 0;
} }
@ -1161,7 +1161,7 @@ IntScrollGetScrollRange(HWND Wnd, int Bar, LPINT MinPos, LPINT MaxPos)
ScrollInfo.cbSize = sizeof(SCROLLINFO); ScrollInfo.cbSize = sizeof(SCROLLINFO);
ScrollInfo.fMask = SIF_RANGE; ScrollInfo.fMask = SIF_RANGE;
Result = NtUserGetScrollInfo(Wnd, Bar, &ScrollInfo); Result = NtUserSBGetParms(Wnd, Bar, NULL, &ScrollInfo);
if (Result) if (Result)
{ {
*MinPos = ScrollInfo.nMin; *MinPos = ScrollInfo.nMin;
@ -1431,7 +1431,7 @@ ScrollBarWndProc(WNDPROC DefWindowProc, HWND Wnd, UINT Msg, WPARAM wParam, LPARA
return NtUserSetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam, wParam); return NtUserSetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam, wParam);
case SBM_GETSCROLLINFO: case SBM_GETSCROLLINFO:
return NtUserGetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam); return NtUserSBGetParms(Wnd, SB_CTL, NULL, (SCROLLINFO *) lParam);
case 0x00e5: case 0x00e5:
case 0x00e7: case 0x00e7:
@ -1502,14 +1502,24 @@ BOOL WINAPI EnableScrollBar( HWND hwnd, UINT nBar, UINT flags )
BOOL WINAPI BOOL WINAPI
RealGetScrollInfo(HWND Wnd, INT SBType, LPSCROLLINFO Info) RealGetScrollInfo(HWND Wnd, INT SBType, LPSCROLLINFO Info)
{ {
if (SB_CTL == SBType) PWND pWnd;
{ PSBDATA pSBData = NULL;
return SendMessageW(Wnd, SBM_GETSCROLLINFO, 0, (LPARAM) Info);
} if (SB_CTL == SBType)
else {
{ return SendMessageW(Wnd, SBM_GETSCROLLINFO, 0, (LPARAM) Info);
return NtUserGetScrollInfo(Wnd, SBType, Info); }
}
pWnd = ValidateHwnd(Wnd);
if (!pWnd) return FALSE;
if (SBType < SB_HORZ || SBType > SB_VERT)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
// FIXME add support to set pSBData from pWnd->pSBInfo
return NtUserSBGetParms(Wnd, SBType, pSBData, Info);
} }
/* /*
@ -1636,10 +1646,10 @@ SetScrollPos(HWND hWnd, INT nBar, INT nPos, BOOL bRedraw)
ScrollInfo.fMask = SIF_POS; ScrollInfo.fMask = SIF_POS;
/* /*
* Call NtUserGetScrollInfo() to get the previous position that * Call NtUserSBGetParms() to get the previous position that
* we will later return. * we will later return.
*/ */
if (NtUserGetScrollInfo(hWnd, nBar, &ScrollInfo)) if (NtUserSBGetParms(hWnd, nBar, NULL, &ScrollInfo))
{ {
Result = ScrollInfo.nPos; Result = ScrollInfo.nPos;
if (Result != nPos) if (Result != nPos)

View file

@ -2459,13 +2459,13 @@ NTAPI
NtUserResolveDesktopForWOW( NtUserResolveDesktopForWOW(
DWORD Unknown0); DWORD Unknown0);
DWORD BOOL
NTAPI NTAPI
NtUserSBGetParms( NtUserSBGetParms(
DWORD Unknown0, HWND hwnd,
DWORD Unknown1, int fnBar,
DWORD Unknown2, PSBDATA pSBData,
DWORD Unknown3); LPSCROLLINFO lpsi);
BOOL BOOL
NTAPI NTAPI
@ -3129,12 +3129,6 @@ NtUserGetMonitorInfo(
OUT LPMONITORINFO pMonitorInfo); OUT LPMONITORINFO pMonitorInfo);
/* Should be done in usermode */ /* Should be done in usermode */
BOOL
NTAPI
NtUserGetScrollInfo(
HWND hwnd,
int fnBar,
LPSCROLLINFO lpsi);
/* (other FocusedItem values give the position of the focused item) */ /* (other FocusedItem values give the position of the focused item) */
#define NO_SELECTED_ITEM 0xffff #define NO_SELECTED_ITEM 0xffff

View file

@ -1,17 +1,17 @@
#ifndef _WIN32K_SCROLL_H #ifndef _WIN32K_SCROLL_H
#define _WIN32K_SCROLL_H #define _WIN32K_SCROLL_H
typedef struct _WINDOW_SCROLLINFO typedef struct _SBINFOEX
{ {
SCROLLBARINFO ScrollBarInfo; SCROLLBARINFO ScrollBarInfo;
SCROLLINFO ScrollInfo; SCROLLINFO ScrollInfo;
} WINDOW_SCROLLINFO, *PWINDOW_SCROLLINFO; } SBINFOEX, *PSBINFOEX;
#define IntGetScrollbarInfoFromWindow(Window, i) \ #define IntGetScrollbarInfoFromWindow(Window, i) \
((PSCROLLBARINFO)(&((Window)->Scroll + i)->ScrollBarInfo)) ((PSCROLLBARINFO)(&((Window)->pSBInfo + i)->ScrollBarInfo))
#define IntGetScrollInfoFromWindow(Window, i) \ #define IntGetScrollInfoFromWindow(Window, i) \
((LPSCROLLINFO)(&((Window)->Scroll + i)->ScrollInfo)) ((LPSCROLLINFO)(&((Window)->pSBInfo + i)->ScrollInfo))
#define SBOBJ_TO_SBID(Obj) ((Obj) - OBJID_HSCROLL) #define SBOBJ_TO_SBID(Obj) ((Obj) - OBJID_HSCROLL)
#define SBID_IS_VALID(id) (id == SB_HORZ || id == SB_VERT || id == SB_CTL) #define SBID_IS_VALID(id) (id == SB_HORZ || id == SB_VERT || id == SB_CTL)

View file

@ -32,13 +32,13 @@ typedef struct _WINDOW_OBJECT
/* Entry in the thread's list of windows. */ /* Entry in the thread's list of windows. */
LIST_ENTRY ListEntry; LIST_ENTRY ListEntry;
/* Handle for the window. */ /* Handle for the window. */
HWND hSelf; HWND hSelf; // Use Wnd->head.h
/* Window flags. */ /* Window flags. */
ULONG state; ULONG state;
/* Handle of region of the window to be updated. */ /* Handle of region of the window to be updated. */
HANDLE UpdateRegion; HANDLE hrgnUpdate;
/* Handle of the window region. */ /* Handle of the window region. */
HANDLE WindowRegion; HANDLE hrgnClip;
/* Pointer to the owning thread's message queue. */ /* Pointer to the owning thread's message queue. */
PUSER_MESSAGE_QUEUE MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue;
struct _WINDOW_OBJECT* spwndChild; struct _WINDOW_OBJECT* spwndChild;
@ -53,13 +53,12 @@ typedef struct _WINDOW_OBJECT
/* DC Entries (DCE) */ /* DC Entries (DCE) */
PDCE Dce; PDCE Dce;
/* Scrollbar info */ /* Scrollbar info */
PWINDOW_SCROLLINFO Scroll; PSBINFOEX pSBInfo; // convert to PSBINFO
PETHREAD OwnerThread; // Use Wnd->head.pti PETHREAD OwnerThread; // Use Wnd->head.pti
HWND hWndLastPopup; /* handle to last active popup window (wine doesn't use pointer, for unk. reason)*/
/* counter for tiled child windows */ /* counter for tiled child windows */
ULONG TiledCounter; ULONG TiledCounter;
/* WNDOBJ list */ /* WNDOBJ list */
LIST_ENTRY WndObjListHead; LIST_ENTRY WndObjListHead; // Use Props
} WINDOW_OBJECT; /* PWINDOW_OBJECT already declared at top of file */ } WINDOW_OBJECT; /* PWINDOW_OBJECT already declared at top of file */
/* Window flags. */ /* Window flags. */
@ -93,13 +92,15 @@ typedef struct _WINDOW_OBJECT
#define IntWndBelongsToThread(WndObj, W32Thread) \ #define IntWndBelongsToThread(WndObj, W32Thread) \
(((WndObj->OwnerThread && WndObj->OwnerThread->Tcb.Win32Thread)) && \ (((WndObj->OwnerThread && WndObj->OwnerThread->Tcb.Win32Thread)) && \
(WndObj->OwnerThread->Tcb.Win32Thread == W32Thread)) (WndObj->OwnerThread->Tcb.Win32Thread == W32Thread))
// ((WndObj->head.pti) && (WndObj->head.pti == W32Thread))
#define IntGetWndThreadId(WndObj) \ #define IntGetWndThreadId(WndObj) \
WndObj->OwnerThread->Cid.UniqueThread WndObj->OwnerThread->Cid.UniqueThread
// WndObj->head.pti->pEThread->Cid.UniqueThread
#define IntGetWndProcessId(WndObj) \ #define IntGetWndProcessId(WndObj) \
WndObj->OwnerThread->ThreadsProcess->UniqueProcessId WndObj->OwnerThread->ThreadsProcess->UniqueProcessId
// WndObj->head.pti->pEThread->ThreadsProcess->UniqueProcessId
BOOL FASTCALL BOOL FASTCALL
IntIsWindow(HWND hWnd); IntIsWindow(HWND hWnd);

View file

@ -10,8 +10,8 @@
(x) < (WndObject)->Wnd->rcWindow.right && \ (x) < (WndObject)->Wnd->rcWindow.right && \
(y) >= (WndObject)->Wnd->rcWindow.top && \ (y) >= (WndObject)->Wnd->rcWindow.top && \
(y) < (WndObject)->Wnd->rcWindow.bottom && \ (y) < (WndObject)->Wnd->rcWindow.bottom && \
(!(WndObject)->WindowRegion || ((WndObject)->Wnd->style & WS_MINIMIZE) || \ (!(WndObject)->hrgnClip || ((WndObject)->Wnd->style & WS_MINIMIZE) || \
NtGdiPtInRegion((WndObject)->WindowRegion, (INT)((x) - (WndObject)->Wnd->rcWindow.left), \ NtGdiPtInRegion((WndObject)->hrgnClip, (INT)((x) - (WndObject)->Wnd->rcWindow.left), \
(INT)((y) - (WndObject)->Wnd->rcWindow.top)))) (INT)((y) - (WndObject)->Wnd->rcWindow.top))))
UINT UINT

View file

@ -650,7 +650,7 @@ UserRedrawDesktop()
Window = UserGetDesktopWindow(); Window = UserGetDesktopWindow();
IntInvalidateWindows( Window, IntInvalidateWindows( Window,
Window->UpdateRegion, Window->hrgnUpdate,
RDW_FRAME | RDW_FRAME |
RDW_ERASE | RDW_ERASE |
RDW_INVALIDATE | RDW_INVALIDATE |

View file

@ -505,7 +505,6 @@ NtUserQueryUserCounters(
return 0; return 0;
} }
DWORD DWORD
APIENTRY APIENTRY
NtUserRegisterTasklist( NtUserRegisterTasklist(
@ -516,20 +515,6 @@ NtUserRegisterTasklist(
return 0; return 0;
} }
DWORD
APIENTRY
NtUserSBGetParms(
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2,
DWORD Unknown3)
{
UNIMPLEMENTED
return 0;
}
DWORD DWORD
APIENTRY APIENTRY
NtUserSetConsoleReserveKeys( NtUserSetConsoleReserveKeys(

View file

@ -76,7 +76,7 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse)
if (ParentWnd->style & WS_CLIPCHILDREN) if (ParentWnd->style & WS_CLIPCHILDREN)
break; break;
if (ParentWindow->UpdateRegion != 0) if (ParentWindow->hrgnUpdate != 0)
{ {
if (Recurse) if (Recurse)
return FALSE; return FALSE;
@ -110,12 +110,12 @@ IntCalcWindowRgn(PWINDOW_OBJECT Window, BOOL Client)
else else
hRgnWindow = UnsafeIntCreateRectRgnIndirect(&Wnd->rcWindow); hRgnWindow = UnsafeIntCreateRectRgnIndirect(&Wnd->rcWindow);
if (Window->WindowRegion != NULL && !(Wnd->style & WS_MINIMIZE)) if (Window->hrgnClip != NULL && !(Wnd->style & WS_MINIMIZE))
{ {
NtGdiOffsetRgn(hRgnWindow, NtGdiOffsetRgn(hRgnWindow,
-Wnd->rcWindow.left, -Wnd->rcWindow.left,
-Wnd->rcWindow.top); -Wnd->rcWindow.top);
RgnType = NtGdiCombineRgn(hRgnWindow, hRgnWindow, Window->WindowRegion, RGN_AND); RgnType = NtGdiCombineRgn(hRgnWindow, hRgnWindow, Window->hrgnClip, RGN_AND);
NtGdiOffsetRgn(hRgnWindow, NtGdiOffsetRgn(hRgnWindow,
Wnd->rcWindow.left, Wnd->rcWindow.left,
Wnd->rcWindow.top); Wnd->rcWindow.top);
@ -146,8 +146,8 @@ IntGetNCUpdateRgn(PWINDOW_OBJECT Window, BOOL Validate)
HRGN hRgnWindow; HRGN hRgnWindow;
UINT RgnType; UINT RgnType;
if (Window->UpdateRegion != NULL && if (Window->hrgnUpdate != NULL &&
Window->UpdateRegion != (HRGN)1) Window->hrgnUpdate != (HRGN)1)
{ {
hRgnNonClient = IntCalcWindowRgn(Window, FALSE); hRgnNonClient = IntCalcWindowRgn(Window, FALSE);
@ -189,12 +189,12 @@ IntGetNCUpdateRgn(PWINDOW_OBJECT Window, BOOL Validate)
if (Validate) if (Validate)
{ {
if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, if (NtGdiCombineRgn(Window->hrgnUpdate, Window->hrgnUpdate,
hRgnWindow, RGN_AND) == NULLREGION) hRgnWindow, RGN_AND) == NULLREGION)
{ {
GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); GDIOBJ_SetOwnership(Window->hrgnUpdate, PsGetCurrentProcess());
GreDeleteObject(Window->UpdateRegion); GreDeleteObject(Window->hrgnUpdate);
Window->UpdateRegion = NULL; Window->hrgnUpdate = NULL;
if (!(Window->state & WINDOWOBJECT_NEED_INTERNALPAINT)) if (!(Window->state & WINDOWOBJECT_NEED_INTERNALPAINT))
MsqDecPaintCountQueue(Window->MessageQueue); MsqDecPaintCountQueue(Window->MessageQueue);
} }
@ -206,7 +206,7 @@ IntGetNCUpdateRgn(PWINDOW_OBJECT Window, BOOL Validate)
} }
else else
{ {
return Window->UpdateRegion; return Window->hrgnUpdate;
} }
} }
@ -228,15 +228,15 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
if (Flags & (RDW_ERASENOW | RDW_UPDATENOW)) if (Flags & (RDW_ERASENOW | RDW_UPDATENOW))
{ {
if (Window->UpdateRegion) if (Window->hrgnUpdate)
{ {
if (!IntValidateParent(Window, Window->UpdateRegion, Recurse)) if (!IntValidateParent(Window, Window->hrgnUpdate, Recurse))
return; return;
} }
if (Flags & RDW_UPDATENOW) if (Flags & RDW_UPDATENOW)
{ {
if (Window->UpdateRegion != NULL || if (Window->hrgnUpdate != NULL ||
Window->state & WINDOWOBJECT_NEED_INTERNALPAINT) Window->state & WINDOWOBJECT_NEED_INTERNALPAINT)
{ {
co_IntSendMessage(hWnd, WM_PAINT, 0, 0); co_IntSendMessage(hWnd, WM_PAINT, 0, 0);
@ -259,9 +259,9 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
if (Window->state & WINDOWOBJECT_NEED_ERASEBKGND) if (Window->state & WINDOWOBJECT_NEED_ERASEBKGND)
{ {
if (Window->UpdateRegion) if (Window->hrgnUpdate)
{ {
hDC = UserGetDCEx(Window, Window->UpdateRegion, hDC = UserGetDCEx(Window, Window->hrgnUpdate,
DCX_CACHE | DCX_USESTYLE | DCX_CACHE | DCX_USESTYLE |
DCX_INTERSECTRGN | DCX_KEEPCLIPRGN); DCX_INTERSECTRGN | DCX_KEEPCLIPRGN);
if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0)) if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
@ -343,7 +343,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
* Clip the given region with window rectangle (or region) * Clip the given region with window rectangle (or region)
*/ */
if (!Window->WindowRegion || (Wnd->style & WS_MINIMIZE)) if (!Window->hrgnClip || (Wnd->style & WS_MINIMIZE))
{ {
HRGN hRgnWindow; HRGN hRgnWindow;
@ -356,7 +356,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
NtGdiOffsetRgn(hRgn, NtGdiOffsetRgn(hRgn,
-Wnd->rcWindow.left, -Wnd->rcWindow.left,
-Wnd->rcWindow.top); -Wnd->rcWindow.top);
RgnType = NtGdiCombineRgn(hRgn, hRgn, Window->WindowRegion, RGN_AND); RgnType = NtGdiCombineRgn(hRgn, hRgn, Window->hrgnClip, RGN_AND);
NtGdiOffsetRgn(hRgn, NtGdiOffsetRgn(hRgn,
Wnd->rcWindow.left, Wnd->rcWindow.left,
Wnd->rcWindow.top); Wnd->rcWindow.top);
@ -366,7 +366,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
* Save current state of pending updates * Save current state of pending updates
*/ */
HadPaintMessage = Window->UpdateRegion != NULL || HadPaintMessage = Window->hrgnUpdate != NULL ||
Window->state & WINDOWOBJECT_NEED_INTERNALPAINT; Window->state & WINDOWOBJECT_NEED_INTERNALPAINT;
HadNCPaintMessage = Window->state & WINDOWOBJECT_NEED_NCPAINT; HadNCPaintMessage = Window->state & WINDOWOBJECT_NEED_NCPAINT;
@ -376,18 +376,18 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
if (Flags & RDW_INVALIDATE && RgnType != NULLREGION) if (Flags & RDW_INVALIDATE && RgnType != NULLREGION)
{ {
if (Window->UpdateRegion == NULL) if (Window->hrgnUpdate == NULL)
{ {
Window->UpdateRegion = NtGdiCreateRectRgn(0, 0, 0, 0); Window->hrgnUpdate = NtGdiCreateRectRgn(0, 0, 0, 0);
GDIOBJ_SetOwnership(Window->UpdateRegion, NULL); GDIOBJ_SetOwnership(Window->hrgnUpdate, NULL);
} }
if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, if (NtGdiCombineRgn(Window->hrgnUpdate, Window->hrgnUpdate,
hRgn, RGN_OR) == NULLREGION) hRgn, RGN_OR) == NULLREGION)
{ {
GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); GDIOBJ_SetOwnership(Window->hrgnUpdate, PsGetCurrentProcess());
GreDeleteObject(Window->UpdateRegion); GreDeleteObject(Window->hrgnUpdate);
Window->UpdateRegion = NULL; Window->hrgnUpdate = NULL;
} }
if (Flags & RDW_FRAME) if (Flags & RDW_FRAME)
@ -400,18 +400,18 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
if (Flags & RDW_VALIDATE && RgnType != NULLREGION) if (Flags & RDW_VALIDATE && RgnType != NULLREGION)
{ {
if (Window->UpdateRegion != NULL) if (Window->hrgnUpdate != NULL)
{ {
if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, if (NtGdiCombineRgn(Window->hrgnUpdate, Window->hrgnUpdate,
hRgn, RGN_DIFF) == NULLREGION) hRgn, RGN_DIFF) == NULLREGION)
{ {
GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); GDIOBJ_SetOwnership(Window->hrgnUpdate, PsGetCurrentProcess());
GreDeleteObject(Window->UpdateRegion); GreDeleteObject(Window->hrgnUpdate);
Window->UpdateRegion = NULL; Window->hrgnUpdate = NULL;
} }
} }
if (Window->UpdateRegion == NULL) if (Window->hrgnUpdate == NULL)
Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND; Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND;
if (Flags & RDW_NOFRAME) if (Flags & RDW_NOFRAME)
Window->state &= ~WINDOWOBJECT_NEED_NCPAINT; Window->state &= ~WINDOWOBJECT_NEED_NCPAINT;
@ -443,7 +443,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
if (Child->Wnd->style & WS_VISIBLE) if (Child->Wnd->style & WS_VISIBLE)
{ {
/* /*
* Recursive call to update children UpdateRegion * Recursive call to update children hrgnUpdate
*/ */
HRGN hRgnTemp = NtGdiCreateRectRgn(0, 0, 0, 0); HRGN hRgnTemp = NtGdiCreateRectRgn(0, 0, 0, 0);
NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY); NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY);
@ -458,7 +458,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
* Fake post paint messages to window message queue if needed * Fake post paint messages to window message queue if needed
*/ */
HasPaintMessage = Window->UpdateRegion != NULL || HasPaintMessage = Window->hrgnUpdate != NULL ||
Window->state & WINDOWOBJECT_NEED_INTERNALPAINT; Window->state & WINDOWOBJECT_NEED_INTERNALPAINT;
HasNCPaintMessage = Window->state & WINDOWOBJECT_NEED_NCPAINT; HasNCPaintMessage = Window->state & WINDOWOBJECT_NEED_NCPAINT;
@ -611,7 +611,7 @@ IntIsWindowDirty(PWINDOW_OBJECT Window)
{ {
PWND Wnd = Window->Wnd; PWND Wnd = Window->Wnd;
return (Wnd->style & WS_VISIBLE) && return (Wnd->style & WS_VISIBLE) &&
((Window->UpdateRegion != NULL) || ((Window->hrgnUpdate != NULL) ||
(Window->state & WINDOWOBJECT_NEED_INTERNALPAINT) || (Window->state & WINDOWOBJECT_NEED_INTERNALPAINT) ||
(Window->state & WINDOWOBJECT_NEED_NCPAINT)); (Window->state & WINDOWOBJECT_NEED_NCPAINT));
} }
@ -787,19 +787,19 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs)
RtlZeroMemory(&Ps, sizeof(PAINTSTRUCT)); RtlZeroMemory(&Ps, sizeof(PAINTSTRUCT));
Ps.hdc = UserGetDCEx(Window, Window->UpdateRegion, DCX_INTERSECTRGN | DCX_USESTYLE); Ps.hdc = UserGetDCEx(Window, Window->hrgnUpdate, DCX_INTERSECTRGN | DCX_USESTYLE);
if (!Ps.hdc) if (!Ps.hdc)
{ {
RETURN(NULL); RETURN(NULL);
} }
if (Window->UpdateRegion != NULL) if (Window->hrgnUpdate != NULL)
{ {
MsqDecPaintCountQueue(Window->MessageQueue); MsqDecPaintCountQueue(Window->MessageQueue);
GdiGetClipBox(Ps.hdc, &Ps.rcPaint); GdiGetClipBox(Ps.hdc, &Ps.rcPaint);
GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); GDIOBJ_SetOwnership(Window->hrgnUpdate, PsGetCurrentProcess());
/* The region is part of the dc now and belongs to the process! */ /* The region is part of the dc now and belongs to the process! */
Window->UpdateRegion = NULL; Window->hrgnUpdate = NULL;
} }
else else
{ {
@ -820,14 +820,14 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs)
{ {
Ps.fErase = FALSE; Ps.fErase = FALSE;
} }
if (Window->UpdateRegion) if (Window->hrgnUpdate)
{ {
if (!(Wnd->style & WS_CLIPCHILDREN)) if (!(Wnd->style & WS_CLIPCHILDREN))
{ {
PWINDOW_OBJECT Child; PWINDOW_OBJECT Child;
for (Child = Window->spwndChild; Child; Child = Child->spwndNext) for (Child = Window->spwndChild; Child; Child = Child->spwndNext)
{ {
IntInvalidateWindows(Child, Window->UpdateRegion, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); IntInvalidateWindows(Child, Window->hrgnUpdate, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
} }
} }
} }
@ -912,7 +912,7 @@ co_UserGetUpdateRgn(PWINDOW_OBJECT Window, HRGN hRgn, BOOL bErase)
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
if (Window->UpdateRegion == NULL) if (Window->hrgnUpdate == NULL)
{ {
RegionType = (NtGdiSetRectRgn(hRgn, 0, 0, 0, 0) ? NULLREGION : ERROR); RegionType = (NtGdiSetRectRgn(hRgn, 0, 0, 0, 0) ? NULLREGION : ERROR);
} }
@ -921,7 +921,7 @@ co_UserGetUpdateRgn(PWINDOW_OBJECT Window, HRGN hRgn, BOOL bErase)
Rect = Window->Wnd->rcClient; Rect = Window->Wnd->rcClient;
IntIntersectWithParents(Window, &Rect); IntIntersectWithParents(Window, &Rect);
NtGdiSetRectRgn(hRgn, Rect.left, Rect.top, Rect.right, Rect.bottom); NtGdiSetRectRgn(hRgn, Rect.left, Rect.top, Rect.right, Rect.bottom);
RegionType = NtGdiCombineRgn(hRgn, hRgn, Window->UpdateRegion, RGN_AND); RegionType = NtGdiCombineRgn(hRgn, hRgn, Window->hrgnUpdate, RGN_AND);
NtGdiOffsetRgn(hRgn, -Window->Wnd->rcClient.left, -Window->Wnd->rcClient.top); NtGdiOffsetRgn(hRgn, -Window->Wnd->rcClient.left, -Window->Wnd->rcClient.top);
} }
@ -993,20 +993,20 @@ NtUserGetUpdateRect(HWND hWnd, LPRECT UnsafeRect, BOOL bErase)
RETURN(FALSE); RETURN(FALSE);
} }
if (Window->UpdateRegion == NULL) if (Window->hrgnUpdate == NULL)
{ {
Rect.left = Rect.top = Rect.right = Rect.bottom = 0; Rect.left = Rect.top = Rect.right = Rect.bottom = 0;
} }
else else
{ {
/* Get the update region bounding box. */ /* Get the update region bounding box. */
if (Window->UpdateRegion == (HRGN)1) if (Window->hrgnUpdate == (HRGN)1)
{ {
Rect = Window->Wnd->rcClient; Rect = Window->Wnd->rcClient;
} }
else else
{ {
RgnData = RGNOBJAPI_Lock(Window->UpdateRegion, NULL); RgnData = RGNOBJAPI_Lock(Window->hrgnUpdate, NULL);
ASSERT(RgnData != NULL); ASSERT(RgnData != NULL);
RegionType = REGION_GetRgnBox(RgnData, &Rect); RegionType = REGION_GetRgnBox(RgnData, &Rect);
RGNOBJAPI_Unlock(RgnData); RGNOBJAPI_Unlock(RgnData);

View file

@ -167,7 +167,7 @@ IntUpdateSBInfo(PWINDOW_OBJECT Window, int wBar)
LPSCROLLINFO psi; LPSCROLLINFO psi;
ASSERT(Window); ASSERT(Window);
ASSERT(Window->Scroll); ASSERT(Window->pSBInfo);
sbi = IntGetScrollbarInfoFromWindow(Window, wBar); sbi = IntGetScrollbarInfoFromWindow(Window, wBar);
psi = IntGetScrollInfoFromWindow(Window, wBar); psi = IntGetScrollInfoFromWindow(Window, wBar);
@ -429,21 +429,21 @@ co_IntCreateScrollBars(PWINDOW_OBJECT Window)
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
if(Window->Scroll) if(Window->pSBInfo)
{ {
/* no need to create it anymore */ /* no need to create it anymore */
return TRUE; return TRUE;
} }
/* allocate memory for all scrollbars (HORZ, VERT, CONTROL) */ /* allocate memory for all scrollbars (HORZ, VERT, CONTROL) */
Size = 3 * (sizeof(WINDOW_SCROLLINFO)); Size = 3 * (sizeof(SBINFOEX));
if(!(Window->Scroll = ExAllocatePoolWithTag(PagedPool, Size, TAG_SBARINFO))) if(!(Window->pSBInfo = ExAllocatePoolWithTag(PagedPool, Size, TAG_SBARINFO)))
{ {
DPRINT1("Unable to allocate memory for scrollbar information for window 0x%x\n", Window->hSelf); DPRINT1("Unable to allocate memory for scrollbar information for window 0x%x\n", Window->hSelf);
return FALSE; return FALSE;
} }
RtlZeroMemory(Window->Scroll, Size); RtlZeroMemory(Window->pSBInfo, Size);
Result = co_WinPosGetNonClientSize(Window, Result = co_WinPosGetNonClientSize(Window,
&Window->Wnd->rcWindow, &Window->Wnd->rcWindow,
@ -470,10 +470,10 @@ co_IntCreateScrollBars(PWINDOW_OBJECT Window)
BOOL FASTCALL BOOL FASTCALL
IntDestroyScrollBars(PWINDOW_OBJECT Window) IntDestroyScrollBars(PWINDOW_OBJECT Window)
{ {
if(Window->Scroll) if(Window->pSBInfo)
{ {
ExFreePool(Window->Scroll); ExFreePool(Window->pSBInfo);
Window->Scroll = NULL; Window->pSBInfo = NULL;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -567,7 +567,11 @@ CLEANUP:
BOOL BOOL
APIENTRY APIENTRY
NtUserGetScrollInfo(HWND hWnd, int fnBar, LPSCROLLINFO lpsi) NtUserSBGetParms(
HWND hWnd,
int fnBar,
PSBDATA pSBData,
LPSCROLLINFO lpsi)
{ {
NTSTATUS Status; NTSTATUS Status;
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;

View file

@ -98,10 +98,10 @@ VIS_ComputeVisibleRegion(
{ {
ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentSiblingWnd->rcWindow); ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentSiblingWnd->rcWindow);
/* Combine it with the window region if available */ /* Combine it with the window region if available */
if (CurrentSibling->WindowRegion && !(CurrentSiblingWnd->style & WS_MINIMIZE)) if (CurrentSibling->hrgnClip && !(CurrentSiblingWnd->style & WS_MINIMIZE))
{ {
NtGdiOffsetRgn(ClipRgn, -CurrentSiblingWnd->rcWindow.left, -CurrentSiblingWnd->rcWindow.top); NtGdiOffsetRgn(ClipRgn, -CurrentSiblingWnd->rcWindow.left, -CurrentSiblingWnd->rcWindow.top);
NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentSibling->WindowRegion, RGN_AND); NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentSibling->hrgnClip, RGN_AND);
NtGdiOffsetRgn(ClipRgn, CurrentSiblingWnd->rcWindow.left, CurrentSiblingWnd->rcWindow.top); NtGdiOffsetRgn(ClipRgn, CurrentSiblingWnd->rcWindow.left, CurrentSiblingWnd->rcWindow.top);
} }
NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF);
@ -127,10 +127,10 @@ VIS_ComputeVisibleRegion(
{ {
ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentWnd->rcWindow); ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentWnd->rcWindow);
/* Combine it with the window region if available */ /* Combine it with the window region if available */
if (CurrentWindow->WindowRegion && !(CurrentWnd->style & WS_MINIMIZE)) if (CurrentWindow->hrgnClip && !(CurrentWnd->style & WS_MINIMIZE))
{ {
NtGdiOffsetRgn(ClipRgn, -CurrentWnd->rcWindow.left, -CurrentWnd->rcWindow.top); NtGdiOffsetRgn(ClipRgn, -CurrentWnd->rcWindow.left, -CurrentWnd->rcWindow.top);
NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentWindow->WindowRegion, RGN_AND); NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentWindow->hrgnClip, RGN_AND);
NtGdiOffsetRgn(ClipRgn, CurrentWnd->rcWindow.left, CurrentWnd->rcWindow.top); NtGdiOffsetRgn(ClipRgn, CurrentWnd->rcWindow.left, CurrentWnd->rcWindow.top);
} }
NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF);
@ -140,10 +140,10 @@ VIS_ComputeVisibleRegion(
} }
} }
if (Window->WindowRegion && !(Wnd->style & WS_MINIMIZE)) if (Window->hrgnClip && !(Wnd->style & WS_MINIMIZE))
{ {
NtGdiOffsetRgn(VisRgn, -Wnd->rcWindow.left, -Wnd->rcWindow.top); NtGdiOffsetRgn(VisRgn, -Wnd->rcWindow.left, -Wnd->rcWindow.top);
NtGdiCombineRgn(VisRgn, VisRgn, Window->WindowRegion, RGN_AND); NtGdiCombineRgn(VisRgn, VisRgn, Window->hrgnClip, RGN_AND);
NtGdiOffsetRgn(VisRgn, Wnd->rcWindow.left, Wnd->rcWindow.top); NtGdiOffsetRgn(VisRgn, Wnd->rcWindow.left, Wnd->rcWindow.top);
} }

View file

@ -536,7 +536,7 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
{ {
Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
ClipRegion = Window->UpdateRegion; ClipRegion = Window->hrgnUpdate;
} }
if (ClipRegion == (HRGN) 1) if (ClipRegion == (HRGN) 1)

View file

@ -498,9 +498,9 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window,
Window->pti->ppi); Window->pti->ppi);
Wnd->pcls = NULL; Wnd->pcls = NULL;
if(Window->WindowRegion) if(Window->hrgnClip)
{ {
GreDeleteObject(Window->WindowRegion); GreDeleteObject(Window->hrgnClip);
} }
ASSERT(Window->Wnd != NULL); ASSERT(Window->Wnd != NULL);
@ -2312,7 +2312,6 @@ AllocErr:
} }
IntLinkWindow(Window, ParentWindow, InsertAfter /* prev sibling */); IntLinkWindow(Window, ParentWindow, InsertAfter /* prev sibling */);
} }
} }
@ -4552,8 +4551,8 @@ IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn)
VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow); VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow);
NtGdiOffsetRgn(VisRgn, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top); NtGdiOffsetRgn(VisRgn, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top);
/* if there's a region assigned to the window, combine them both */ /* if there's a region assigned to the window, combine them both */
if(Window->WindowRegion && !(Wnd->style & WS_MINIMIZE)) if(Window->hrgnClip && !(Wnd->style & WS_MINIMIZE))
NtGdiCombineRgn(VisRgn, VisRgn, Window->WindowRegion, RGN_AND); NtGdiCombineRgn(VisRgn, VisRgn, Window->hrgnClip, RGN_AND);
/* Copy the region into hRgn */ /* Copy the region into hRgn */
NtGdiCombineRgn(hRgn, VisRgn, NULL, RGN_COPY); NtGdiCombineRgn(hRgn, VisRgn, NULL, RGN_COPY);
@ -4593,8 +4592,8 @@ IntGetWindowRgnBox(PWINDOW_OBJECT Window, RECTL *Rect)
VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow); VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow);
NtGdiOffsetRgn(VisRgn, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top); NtGdiOffsetRgn(VisRgn, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top);
/* if there's a region assigned to the window, combine them both */ /* if there's a region assigned to the window, combine them both */
if(Window->WindowRegion && !(Wnd->style & WS_MINIMIZE)) if(Window->hrgnClip && !(Wnd->style & WS_MINIMIZE))
NtGdiCombineRgn(VisRgn, VisRgn, Window->WindowRegion, RGN_AND); NtGdiCombineRgn(VisRgn, VisRgn, Window->hrgnClip, RGN_AND);
if((pRgn = RGNOBJAPI_Lock(VisRgn, NULL))) if((pRgn = RGNOBJAPI_Lock(VisRgn, NULL)))
{ {
@ -4634,12 +4633,12 @@ NtUserSetWindowRgn(
/* FIXME - Verify if hRgn is a valid handle!!!! /* FIXME - Verify if hRgn is a valid handle!!!!
Propably make this operation thread-safe, but maybe it's not necessary */ Propably make this operation thread-safe, but maybe it's not necessary */
if(Window->WindowRegion) if(Window->hrgnClip)
{ {
/* Delete no longer needed region handle */ /* Delete no longer needed region handle */
GreDeleteObject(Window->WindowRegion); GreDeleteObject(Window->hrgnClip);
} }
Window->WindowRegion = hRgn; Window->hrgnClip = hRgn;
/* FIXME - send WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to the window */ /* FIXME - send WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to the window */

View file

@ -1097,9 +1097,9 @@ co_WinPosSetWindowPos(
Window->Wnd->style |= WS_VISIBLE; Window->Wnd->style |= WS_VISIBLE;
} }
if (Window->UpdateRegion != NULL && Window->UpdateRegion != (HRGN)1) if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != (HRGN)1)
{ {
NtGdiOffsetRgn(Window->UpdateRegion, NtGdiOffsetRgn(Window->hrgnUpdate,
NewWindowRect.left - OldWindowRect.left, NewWindowRect.left - OldWindowRect.left,
NewWindowRect.top - OldWindowRect.top); NewWindowRect.top - OldWindowRect.top);
} }
@ -1162,10 +1162,10 @@ co_WinPosSetWindowPos(
} }
/* No use in copying bits which are in the update region. */ /* No use in copying bits which are in the update region. */
if (Window->UpdateRegion != NULL) if (Window->hrgnUpdate != NULL)
{ {
NtGdiOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top); NtGdiOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
NtGdiCombineRgn(CopyRgn, CopyRgn, Window->UpdateRegion, RGN_DIFF); NtGdiCombineRgn(CopyRgn, CopyRgn, Window->hrgnUpdate, RGN_DIFF);
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top); NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
} }

View file

@ -689,7 +689,6 @@ NtUserGetMenuDefaultItem 3
NtUserGetLastInputInfo 1 NtUserGetLastInputInfo 1
NtUserGetMinMaxInfo 3 NtUserGetMinMaxInfo 3
NtUserGetMonitorInfo 2 NtUserGetMonitorInfo 2
NtUserGetScrollInfo 3
NtUserMenuInfo 3 NtUserMenuInfo 3
NtUserMenuItemInfo 5 NtUserMenuItemInfo 5
NtUserMonitorFromPoint 3 NtUserMonitorFromPoint 3