- Add back removed window dce support routine. Fixed list handling and implemented thread cleanup for dces.

svn path=/trunk/; revision=45305
This commit is contained in:
James Tabor 2010-01-28 23:34:57 +00:00
parent 5b14ade9f8
commit 21032e02d1
3 changed files with 192 additions and 123 deletions

View file

@ -1116,18 +1116,6 @@ NtUserGetLayeredWindowAttributes(
return 0; return 0;
} }
/* ValidateRect gets redirected to NtUserValidateRect:
http://blog.csdn.net/ntdll/archive/2005/10/19/509299.aspx */
BOOL
APIENTRY
NtUserValidateRect(
HWND hWnd,
const RECT *lpRect)
{
UNIMPLEMENTED;
return 0;
}
BOOL BOOL
APIENTRY APIENTRY
NtUserValidateTimerCallback( NtUserValidateTimerCallback(

View file

@ -81,7 +81,8 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse)
if (Recurse) if (Recurse)
return FALSE; return FALSE;
IntInvalidateWindows(ParentWindow, hValidateRgn, IntInvalidateWindows( ParentWindow,
hValidateRgn,
RDW_VALIDATE | RDW_NOCHILDREN); RDW_VALIDATE | RDW_NOCHILDREN);
} }
@ -250,7 +251,9 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
Window->state &= ~WINDOWOBJECT_NEED_NCPAINT; Window->state &= ~WINDOWOBJECT_NEED_NCPAINT;
MsqDecPaintCountQueue(Window->pti->MessageQueue); MsqDecPaintCountQueue(Window->pti->MessageQueue);
co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0); co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0);
if ((HANDLE) 1 != TempRegion && NULL != TempRegion)
if ( (HANDLE) 1 != TempRegion &&
NULL != TempRegion)
{ {
/* NOTE: The region can already be deleted! */ /* NOTE: The region can already be deleted! */
GDIOBJ_FreeObjByHandle(TempRegion, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT); GDIOBJ_FreeObjByHandle(TempRegion, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT);
@ -261,9 +264,10 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
{ {
if (Window->hrgnUpdate) if (Window->hrgnUpdate)
{ {
hDC = UserGetDCEx(Window, Window->hrgnUpdate, hDC = UserGetDCEx( Window,
DCX_CACHE | DCX_USESTYLE | Window->hrgnUpdate,
DCX_INTERSECTRGN | DCX_KEEPCLIPRGN); DCX_CACHE|DCX_USESTYLE|DCX_INTERSECTRGN|DCX_KEEPCLIPRGN);
if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0)) if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
{ {
Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND; Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND;
@ -285,7 +289,8 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
/* /*
* Paint child windows. * Paint child windows.
*/ */
if (!(Flags & RDW_NOCHILDREN) && !(Wnd->style & WS_MINIMIZE) && if (!(Flags & RDW_NOCHILDREN) &&
!(Wnd->style & WS_MINIMIZE) &&
((Flags & RDW_ALLCHILDREN) || !(Wnd->style & WS_CLIPCHILDREN)) ) ((Flags & RDW_ALLCHILDREN) || !(Wnd->style & WS_CLIPCHILDREN)) )
{ {
HWND *List, *phWnd; HWND *List, *phWnd;
@ -325,7 +330,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
BOOL HasPaintMessage, HasNCPaintMessage; BOOL HasPaintMessage, HasNCPaintMessage;
Wnd = Window->Wnd; Wnd = Window->Wnd;
DPRINT1("IntInvalidateWindows start\n");
/* /*
* If the nonclient is not to be redrawn, clip the region to the client * If the nonclient is not to be redrawn, clip the region to the client
* rect * rect
@ -477,7 +482,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
else else
MsqIncPaintCountQueue(Window->pti->MessageQueue); MsqIncPaintCountQueue(Window->pti->MessageQueue);
} }
DPRINT1("IntInvalidateWindows exit\n");
} }
/* /*
@ -515,21 +520,23 @@ IntIsWindowDrawable(PWINDOW_OBJECT Window)
*/ */
BOOL FASTCALL BOOL FASTCALL
co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateRgn, co_UserRedrawWindow(
PWINDOW_OBJECT Window,
const RECTL* UpdateRect,
HRGN UpdateRgn,
ULONG Flags) ULONG Flags)
{ {
HRGN hRgn = NULL; HRGN hRgn = NULL;
DPRINT1("co_UserRedrawWindow start\n");
/* /*
* Step 1. * Step 1.
* Validation of passed parameters. * Validation of passed parameters.
*/ */
if (!IntIsWindowDrawable(Window) || if (!IntIsWindowDrawable(Window))
(Flags & (RDW_VALIDATE | RDW_INVALIDATE)) ==
(RDW_VALIDATE | RDW_INVALIDATE))
{ {
return FALSE; return TRUE; // Just do nothing!!!
} }
/* /*
@ -538,7 +545,7 @@ co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateR
* a region hRgn specified in screen coordinates. * a region hRgn specified in screen coordinates.
*/ */
if (Flags & (RDW_INVALIDATE | RDW_VALIDATE)) if (Flags & (RDW_INVALIDATE | RDW_VALIDATE)) // Both are OKAY!
{ {
if (UpdateRgn != NULL) if (UpdateRgn != NULL)
{ {
@ -602,6 +609,7 @@ co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateR
{ {
REGION_FreeRgnByHandle(hRgn); REGION_FreeRgnByHandle(hRgn);
} }
DPRINT1("co_UserRedrawWindow exit\n");
return TRUE; return TRUE;
} }
@ -660,8 +668,13 @@ IntFindWindowToRepaint(PWINDOW_OBJECT Window, PTHREADINFO Thread)
} }
BOOL FASTCALL BOOL FASTCALL
IntGetPaintMessage(PWINDOW_OBJECT Window, UINT MsgFilterMin, UINT MsgFilterMax, IntGetPaintMessage(
PTHREADINFO Thread, MSG *Message, BOOL Remove) PWINDOW_OBJECT Window,
UINT MsgFilterMin,
UINT MsgFilterMax,
PTHREADINFO Thread,
MSG *Message,
BOOL Remove)
{ {
PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue;
@ -787,7 +800,9 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs)
RtlZeroMemory(&Ps, sizeof(PAINTSTRUCT)); RtlZeroMemory(&Ps, sizeof(PAINTSTRUCT));
Ps.hdc = UserGetDCEx(Window, Window->hrgnUpdate, DCX_INTERSECTRGN | DCX_USESTYLE); Ps.hdc = UserGetDCEx( Window,
Window->hrgnUpdate,
DCX_INTERSECTRGN | DCX_USESTYLE);
if (!Ps.hdc) if (!Ps.hdc)
{ {
RETURN(NULL); RETURN(NULL);
@ -1060,16 +1075,20 @@ CLEANUP:
*/ */
BOOL APIENTRY BOOL APIENTRY
NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate, NtUserRedrawWindow(
HWND hWnd,
CONST RECT *lprcUpdate,
HRGN hrgnUpdate,
UINT flags) UINT flags)
{ {
RECTL SafeUpdateRect; RECTL SafeUpdateRect;
NTSTATUS Status;
PWINDOW_OBJECT Wnd; PWINDOW_OBJECT Wnd;
DECLARE_RETURN(BOOL); BOOL Ret;
USER_REFERENCE_ENTRY Ref; USER_REFERENCE_ENTRY Ref;
NTSTATUS Status = STATUS_SUCCESS;
DECLARE_RETURN(BOOL);
DPRINT("Enter NtUserRedrawWindow\n"); DPRINT1("Enter NtUserRedrawWindow\n");
UserEnterExclusive(); UserEnterExclusive();
if (!(Wnd = UserGetWindowObject(hWnd ? hWnd : IntGetDesktopWindow()))) if (!(Wnd = UserGetWindowObject(hWnd ? hWnd : IntGetDesktopWindow())))
@ -1077,44 +1096,61 @@ NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
RETURN( FALSE); RETURN( FALSE);
} }
if (lprcUpdate != NULL) if (lprcUpdate)
{ {
Status = MmCopyFromCaller(&SafeUpdateRect, lprcUpdate, _SEH2_TRY
sizeof(RECTL)); {
ProbeForRead(lprcUpdate, sizeof(RECTL), 1);
RtlCopyMemory(&SafeUpdateRect, lprcUpdate, sizeof(RECTL));
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
SetLastWin32Error(ERROR_INVALID_PARAMETER); SetLastWin32Error(RtlNtStatusToDosError(Status));
RETURN( FALSE); RETURN( FALSE);
} }
} }
if ( flags & ~(RDW_ERASE|RDW_FRAME|RDW_INTERNALPAINT|RDW_INVALIDATE|
RDW_NOERASE|RDW_NOFRAME|RDW_NOINTERNALPAINT|RDW_VALIDATE|
RDW_ERASENOW|RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_NOCHILDREN) )
{
/* RedrawWindow fails only in case that flags are invalid */
SetLastWin32Error(ERROR_INVALID_FLAGS);
RETURN( FALSE);
}
UserRefObjectCo(Wnd, &Ref); UserRefObjectCo(Wnd, &Ref);
Status = co_UserRedrawWindow(Wnd, NULL == lprcUpdate ? NULL : &SafeUpdateRect, Ret = co_UserRedrawWindow( Wnd,
hrgnUpdate, flags); lprcUpdate ? &SafeUpdateRect : NULL,
hrgnUpdate,
flags);
UserDerefObjectCo(Wnd); UserDerefObjectCo(Wnd);
if (!NT_SUCCESS(Status)) RETURN( Ret);
{
/* IntRedrawWindow fails only in case that flags are invalid */
SetLastWin32Error(ERROR_INVALID_PARAMETER);
RETURN( FALSE);
}
RETURN( TRUE);
CLEANUP: CLEANUP:
DPRINT("Leave NtUserRedrawWindow, ret=%i\n",_ret_); DPRINT1("Leave NtUserRedrawWindow, ret=%i\n",_ret_);
UserLeave(); UserLeave();
END_CLEANUP; END_CLEANUP;
} }
static static
INT FASTCALL INT FASTCALL
UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll, UserScrollDC(
const RECTL *prcClip, HRGN hrgnUpdate, RECTL *prcUpdate) HDC hDC,
INT dx,
INT dy,
const RECTL *prcScroll,
const RECTL *prcClip,
HRGN hrgnUpdate,
RECTL *prcUpdate)
{ {
PDC pDC; PDC pDC;
RECTL rcScroll, rcClip, rcSrc, rcDst; RECTL rcScroll, rcClip, rcSrc, rcDst;
@ -1141,9 +1177,17 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll,
RECTL_vOffsetRect(&rcDst, dx, dy); RECTL_vOffsetRect(&rcDst, dx, dy);
RECTL_bIntersectRect(&rcDst, &rcDst, &rcClip); RECTL_bIntersectRect(&rcDst, &rcDst, &rcClip);
if (!NtGdiBitBlt(hDC, rcDst.left, rcDst.top, if (!NtGdiBitBlt( hDC,
rcDst.right - rcDst.left, rcDst.bottom - rcDst.top, rcDst.left,
hDC, rcDst.left - dx, rcDst.top - dy, SRCCOPY, 0, 0)) rcDst.top,
rcDst.right - rcDst.left,
rcDst.bottom - rcDst.top,
hDC,
rcDst.left - dx,
rcDst.top - dy,
SRCCOPY,
0,
0))
{ {
return ERROR; return ERROR;
} }
@ -1159,7 +1203,7 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll,
{ {
return FALSE; return FALSE;
} }
hrgnVisible = pDC->rosdc.hVisRgn; // pDC->w.hGCClipRgn? hrgnVisible = pDC->rosdc.hVisRgn; // pDC->prgnRao?
DC_UnlockDc(pDC); DC_UnlockDc(pDC);
/* Begin with the shifted and then clipped scroll rect */ /* Begin with the shifted and then clipped scroll rect */
@ -1539,7 +1583,8 @@ UserDrawSysMenuButton(
} }
BOOL BOOL
UserDrawCaptionText(HDC hDc, UserDrawCaptionText(
HDC hDc,
const PUNICODE_STRING Text, const PUNICODE_STRING Text,
const RECTL *lpRc, const RECTL *lpRc,
UINT uFlags) UINT uFlags)
@ -1984,4 +2029,19 @@ NtUserInvalidateRgn(
return NtUserRedrawWindow(hWnd, NULL, hRgn, RDW_INVALIDATE | (bErase? RDW_ERASE : 0)); return NtUserRedrawWindow(hWnd, NULL, hRgn, RDW_INVALIDATE | (bErase? RDW_ERASE : 0));
} }
/* ValidateRect gets redirected to NtUserValidateRect:
http://blog.csdn.net/ntdll/archive/2005/10/19/509299.aspx */
BOOL
APIENTRY
NtUserValidateRect(
HWND hWnd,
const RECT *lpRect)
{
if (hWnd)
{
return NtUserRedrawWindow(hWnd, lpRect, NULL, RDW_VALIDATE );
}
return NtUserRedrawWindow(hWnd, lpRect, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN);
}
/* EOF */ /* EOF */

View file

@ -952,7 +952,8 @@ co_WinPosSetWindowPos(
VisBefore = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE); VisBefore = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
VisRgn = NULL; VisRgn = NULL;
if (VisBefore != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisBefore, NULL)) && if ( VisBefore != NULL &&
(VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisBefore, NULL)) &&
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION ) REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
{ {
RGNOBJAPI_Unlock(VisRgn); RGNOBJAPI_Unlock(VisRgn);
@ -989,7 +990,8 @@ co_WinPosSetWindowPos(
{ {
InsertAfterWindow = NULL; InsertAfterWindow = NULL;
Sibling = ParentWindow->spwndChild; Sibling = ParentWindow->spwndChild;
while (NULL != Sibling && 0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST)) while ( NULL != Sibling &&
0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST) )
{ {
InsertAfterWindow = Sibling; InsertAfterWindow = Sibling;
Sibling = Sibling->spwndNext; Sibling = Sibling->spwndNext;
@ -1027,12 +1029,13 @@ co_WinPosSetWindowPos(
} }
if (InsertAfterWindow != NULL) if (InsertAfterWindow != NULL)
UserDereferenceObject(InsertAfterWindow); UserDereferenceObject(InsertAfterWindow);
if ((HWND_TOPMOST == WinPos.hwndInsertAfter)
|| (0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST) if ( (HWND_TOPMOST == WinPos.hwndInsertAfter) ||
&& NULL != Window->spwndPrev (0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST) &&
&& 0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST)) NULL != Window->spwndPrev &&
|| (NULL != Window->spwndNext 0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST)) ||
&& 0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST))) (NULL != Window->spwndNext &&
0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST)) )
{ {
Window->Wnd->ExStyle |= WS_EX_TOPMOST; Window->Wnd->ExStyle |= WS_EX_TOPMOST;
} }
@ -1077,8 +1080,11 @@ co_WinPosSetWindowPos(
if (!(WinPos.flags & SWP_SHOWWINDOW) && (WinPos.flags & SWP_HIDEWINDOW)) if (!(WinPos.flags & SWP_SHOWWINDOW) && (WinPos.flags & SWP_HIDEWINDOW))
{ {
/* Clear the update region */ /* Clear the update region */
co_UserRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOFRAME | co_UserRedrawWindow( Window,
RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN); NULL,
0,
RDW_VALIDATE | RDW_NOFRAME | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN);
if ((Window->Wnd->style & WS_VISIBLE) && if ((Window->Wnd->style & WS_VISIBLE) &&
Window->spwndParent == UserGetDesktopWindow()) Window->spwndParent == UserGetDesktopWindow())
{ {
@ -1111,7 +1117,8 @@ co_WinPosSetWindowPos(
VisAfter = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE); VisAfter = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
VisRgn = NULL; VisRgn = NULL;
if (VisAfter != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisAfter, NULL)) && if ( VisAfter != NULL &&
(VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisAfter, NULL)) &&
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION ) REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
{ {
RGNOBJAPI_Unlock(VisRgn); RGNOBJAPI_Unlock(VisRgn);
@ -1131,7 +1138,9 @@ co_WinPosSetWindowPos(
* class need to be completely repainted on (horizontal/vertical) size * class need to be completely repainted on (horizontal/vertical) size
* change. * change.
*/ */
if (VisBefore != NULL && VisAfter != NULL && !(WinPos.flags & SWP_NOCOPYBITS) && if ( VisBefore != NULL &&
VisAfter != NULL &&
!(WinPos.flags & SWP_NOCOPYBITS) &&
((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) && ((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) &&
!(Window->Wnd->ExStyle & WS_EX_TRANSPARENT) ) !(Window->Wnd->ExStyle & WS_EX_TRANSPARENT) )
{ {
@ -1146,7 +1155,8 @@ co_WinPosSetWindowPos(
* we don't have to crop (can't take anything away from an empty * we don't have to crop (can't take anything away from an empty
* region...) * region...)
*/ */
if (!(WinPos.flags & SWP_NOSIZE) && RgnType != ERROR && if (!(WinPos.flags & SWP_NOSIZE) &&
RgnType != ERROR &&
RgnType != NULLREGION ) RgnType != NULLREGION )
{ {
PROSRGNDATA pCopyRgn; PROSRGNDATA pCopyRgn;
@ -1199,14 +1209,20 @@ co_WinPosSetWindowPos(
* to create a copy of CopyRgn and pass that. We need CopyRgn later * to create a copy of CopyRgn and pass that. We need CopyRgn later
*/ */
NtGdiOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top); NtGdiOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
Dc = UserGetDCEx(Window, CopyRgn, DCX_WINDOW | DCX_CACHE | Dc = UserGetDCEx( Window,
DCX_INTERSECTRGN | DCX_CLIPSIBLINGS | CopyRgn,
DCX_KEEPCLIPRGN); DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN);
NtGdiBitBlt( Dc, NtGdiBitBlt( Dc,
CopyRect.left, CopyRect.top, CopyRect.right - CopyRect.left, CopyRect.left, CopyRect.top,
CopyRect.bottom - CopyRect.top, Dc, CopyRect.right - CopyRect.left,
CopyRect.bottom - CopyRect.top,
Dc,
CopyRect.left + (OldWindowRect.left - NewWindowRect.left), CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY, 0, 0); CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
SRCCOPY,
0,
0);
UserReleaseDC(Window, Dc, FALSE); UserReleaseDC(Window, Dc, FALSE);
IntValidateParent(Window, CopyRgn, FALSE); IntValidateParent(Window, CopyRgn, FALSE);
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top); NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
@ -1237,7 +1253,8 @@ co_WinPosSetWindowPos(
{ {
/* old code /* old code
NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top); NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
IntInvalidateWindows(Window, DirtyRgn, IntInvalidateWindows( Window,
DirtyRgn,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
} }
GreDeleteObject(DirtyRgn); GreDeleteObject(DirtyRgn);
@ -1252,13 +1269,15 @@ co_WinPosSetWindowPos(
(Parent) && (Parent) &&
!(Parent->Wnd->style & WS_CLIPCHILDREN)) !(Parent->Wnd->style & WS_CLIPCHILDREN))
{ {
IntInvalidateWindows(Parent, DirtyRgn, IntInvalidateWindows( Parent,
DirtyRgn,
RDW_ERASE | RDW_INVALIDATE); RDW_ERASE | RDW_INVALIDATE);
co_IntPaintWindows(Parent, RDW_ERASENOW, FALSE); co_IntPaintWindows(Parent, RDW_ERASENOW, FALSE);
} }
else else
{ {
IntInvalidateWindows(Window, DirtyRgn, IntInvalidateWindows( Window,
DirtyRgn,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
} }
} }
@ -1275,8 +1294,10 @@ co_WinPosSetWindowPos(
{ {
ExposedRgn = IntSysCreateRectRgn(0, 0, 0, 0); ExposedRgn = IntSysCreateRectRgn(0, 0, 0, 0);
NtGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY); NtGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
NtGdiOffsetRgn(ExposedRgn, OldWindowRect.left - NewWindowRect.left, NtGdiOffsetRgn( ExposedRgn,
OldWindowRect.left - NewWindowRect.left,
OldWindowRect.top - NewWindowRect.top); OldWindowRect.top - NewWindowRect.top);
if (VisAfter != NULL) if (VisAfter != NULL)
RgnType = NtGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF); RgnType = NtGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
else else