- 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;
}
/* 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
APIENTRY
NtUserValidateTimerCallback(

View file

@ -81,8 +81,9 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse)
if (Recurse)
return FALSE;
IntInvalidateWindows(ParentWindow, hValidateRgn,
RDW_VALIDATE | RDW_NOCHILDREN);
IntInvalidateWindows( ParentWindow,
hValidateRgn,
RDW_VALIDATE | RDW_NOCHILDREN);
}
ParentWindow = ParentWindow->spwndParent;
@ -250,7 +251,9 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
Window->state &= ~WINDOWOBJECT_NEED_NCPAINT;
MsqDecPaintCountQueue(Window->pti->MessageQueue);
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! */
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)
{
hDC = UserGetDCEx(Window, Window->hrgnUpdate,
DCX_CACHE | DCX_USESTYLE |
DCX_INTERSECTRGN | DCX_KEEPCLIPRGN);
hDC = UserGetDCEx( Window,
Window->hrgnUpdate,
DCX_CACHE|DCX_USESTYLE|DCX_INTERSECTRGN|DCX_KEEPCLIPRGN);
if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
{
Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND;
@ -285,8 +289,9 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
/*
* Paint child windows.
*/
if (!(Flags & RDW_NOCHILDREN) && !(Wnd->style & WS_MINIMIZE) &&
((Flags & RDW_ALLCHILDREN) || !(Wnd->style & WS_CLIPCHILDREN)))
if (!(Flags & RDW_NOCHILDREN) &&
!(Wnd->style & WS_MINIMIZE) &&
((Flags & RDW_ALLCHILDREN) || !(Wnd->style & WS_CLIPCHILDREN)) )
{
HWND *List, *phWnd;
@ -325,7 +330,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
BOOL HasPaintMessage, HasNCPaintMessage;
Wnd = Window->Wnd;
DPRINT1("IntInvalidateWindows start\n");
/*
* If the nonclient is not to be redrawn, clip the region to the client
* rect
@ -353,13 +358,13 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
}
else
{
NtGdiOffsetRgn(hRgn,
-Wnd->rcWindow.left,
-Wnd->rcWindow.top);
NtGdiOffsetRgn( hRgn,
-Wnd->rcWindow.left,
-Wnd->rcWindow.top);
RgnType = NtGdiCombineRgn(hRgn, hRgn, Window->hrgnClip, RGN_AND);
NtGdiOffsetRgn(hRgn,
Wnd->rcWindow.left,
Wnd->rcWindow.top);
NtGdiOffsetRgn( hRgn,
Wnd->rcWindow.left,
Wnd->rcWindow.top);
}
/*
@ -477,7 +482,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
else
MsqIncPaintCountQueue(Window->pti->MessageQueue);
}
DPRINT1("IntInvalidateWindows exit\n");
}
/*
@ -515,21 +520,23 @@ IntIsWindowDrawable(PWINDOW_OBJECT Window)
*/
BOOL FASTCALL
co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateRgn,
ULONG Flags)
co_UserRedrawWindow(
PWINDOW_OBJECT Window,
const RECTL* UpdateRect,
HRGN UpdateRgn,
ULONG Flags)
{
HRGN hRgn = NULL;
DPRINT1("co_UserRedrawWindow start\n");
/*
* Step 1.
* Validation of passed parameters.
*/
if (!IntIsWindowDrawable(Window) ||
(Flags & (RDW_VALIDATE | RDW_INVALIDATE)) ==
(RDW_VALIDATE | RDW_INVALIDATE))
if (!IntIsWindowDrawable(Window))
{
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.
*/
if (Flags & (RDW_INVALIDATE | RDW_VALIDATE))
if (Flags & (RDW_INVALIDATE | RDW_VALIDATE)) // Both are OKAY!
{
if (UpdateRgn != NULL)
{
@ -602,6 +609,7 @@ co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateR
{
REGION_FreeRgnByHandle(hRgn);
}
DPRINT1("co_UserRedrawWindow exit\n");
return TRUE;
}
@ -660,8 +668,13 @@ IntFindWindowToRepaint(PWINDOW_OBJECT Window, PTHREADINFO Thread)
}
BOOL FASTCALL
IntGetPaintMessage(PWINDOW_OBJECT Window, UINT MsgFilterMin, UINT MsgFilterMax,
PTHREADINFO Thread, MSG *Message, BOOL Remove)
IntGetPaintMessage(
PWINDOW_OBJECT Window,
UINT MsgFilterMin,
UINT MsgFilterMax,
PTHREADINFO Thread,
MSG *Message,
BOOL Remove)
{
PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue;
@ -787,7 +800,9 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs)
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)
{
RETURN(NULL);
@ -1060,16 +1075,20 @@ CLEANUP:
*/
BOOL APIENTRY
NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
UINT flags)
NtUserRedrawWindow(
HWND hWnd,
CONST RECT *lprcUpdate,
HRGN hrgnUpdate,
UINT flags)
{
RECTL SafeUpdateRect;
NTSTATUS Status;
PWINDOW_OBJECT Wnd;
DECLARE_RETURN(BOOL);
BOOL Ret;
USER_REFERENCE_ENTRY Ref;
NTSTATUS Status = STATUS_SUCCESS;
DECLARE_RETURN(BOOL);
DPRINT("Enter NtUserRedrawWindow\n");
DPRINT1("Enter NtUserRedrawWindow\n");
UserEnterExclusive();
if (!(Wnd = UserGetWindowObject(hWnd ? hWnd : IntGetDesktopWindow())))
@ -1077,44 +1096,61 @@ NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
RETURN( FALSE);
}
if (lprcUpdate != NULL)
if (lprcUpdate)
{
Status = MmCopyFromCaller(&SafeUpdateRect, lprcUpdate,
sizeof(RECTL));
_SEH2_TRY
{
ProbeForRead(lprcUpdate, sizeof(RECTL), 1);
RtlCopyMemory(&SafeUpdateRect, lprcUpdate, sizeof(RECTL));
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END
if (!NT_SUCCESS(Status))
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
SetLastWin32Error(RtlNtStatusToDosError(Status));
RETURN( FALSE);
}
}
UserRefObjectCo(Wnd, &Ref);
Status = co_UserRedrawWindow(Wnd, NULL == lprcUpdate ? NULL : &SafeUpdateRect,
hrgnUpdate, flags);
UserDerefObjectCo(Wnd);
if (!NT_SUCCESS(Status))
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) )
{
/* IntRedrawWindow fails only in case that flags are invalid */
SetLastWin32Error(ERROR_INVALID_PARAMETER);
/* RedrawWindow fails only in case that flags are invalid */
SetLastWin32Error(ERROR_INVALID_FLAGS);
RETURN( FALSE);
}
RETURN( TRUE);
UserRefObjectCo(Wnd, &Ref);
Ret = co_UserRedrawWindow( Wnd,
lprcUpdate ? &SafeUpdateRect : NULL,
hrgnUpdate,
flags);
UserDerefObjectCo(Wnd);
RETURN( Ret);
CLEANUP:
DPRINT("Leave NtUserRedrawWindow, ret=%i\n",_ret_);
DPRINT1("Leave NtUserRedrawWindow, ret=%i\n",_ret_);
UserLeave();
END_CLEANUP;
}
static
INT FASTCALL
UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll,
const RECTL *prcClip, HRGN hrgnUpdate, RECTL *prcUpdate)
UserScrollDC(
HDC hDC,
INT dx,
INT dy,
const RECTL *prcScroll,
const RECTL *prcClip,
HRGN hrgnUpdate,
RECTL *prcUpdate)
{
PDC pDC;
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_bIntersectRect(&rcDst, &rcDst, &rcClip);
if (!NtGdiBitBlt(hDC, rcDst.left, rcDst.top,
rcDst.right - rcDst.left, rcDst.bottom - rcDst.top,
hDC, rcDst.left - dx, rcDst.top - dy, SRCCOPY, 0, 0))
if (!NtGdiBitBlt( hDC,
rcDst.left,
rcDst.top,
rcDst.right - rcDst.left,
rcDst.bottom - rcDst.top,
hDC,
rcDst.left - dx,
rcDst.top - dy,
SRCCOPY,
0,
0))
{
return ERROR;
}
@ -1159,7 +1203,7 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll,
{
return FALSE;
}
hrgnVisible = pDC->rosdc.hVisRgn; // pDC->w.hGCClipRgn?
hrgnVisible = pDC->rosdc.hVisRgn; // pDC->prgnRao?
DC_UnlockDc(pDC);
/* Begin with the shifted and then clipped scroll rect */
@ -1539,7 +1583,8 @@ UserDrawSysMenuButton(
}
BOOL
UserDrawCaptionText(HDC hDc,
UserDrawCaptionText(
HDC hDc,
const PUNICODE_STRING Text,
const RECTL *lpRc,
UINT uFlags)
@ -1984,4 +2029,19 @@ NtUserInvalidateRgn(
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 */

View file

@ -903,8 +903,8 @@ co_WinPosSetWindowPos(
/*
* Only allow CSRSS to mess with the desktop window
*/
if (Window->hSelf == IntGetDesktopWindow() &&
Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
if ( Window->hSelf == IntGetDesktopWindow() &&
Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
{
return FALSE;
}
@ -934,9 +934,9 @@ co_WinPosSetWindowPos(
}
Ancestor = UserGetAncestor(Window, GA_PARENT);
if ((WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) !=
if ( (WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) !=
SWP_NOZORDER &&
Ancestor && Ancestor->hSelf == IntGetDesktopWindow())
Ancestor && Ancestor->hSelf == IntGetDesktopWindow() )
{
WinPos.hwndInsertAfter = WinPosDoOwnedPopups(WinPos.hwnd, WinPos.hwndInsertAfter);
}
@ -945,15 +945,16 @@ co_WinPosSetWindowPos(
{
/* Compute the visible region before the window position is changed */
if (!(WinPos.flags & (SWP_NOREDRAW | SWP_SHOWWINDOW)) &&
(WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
(WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
SWP_HIDEWINDOW | SWP_FRAMECHANGED)) !=
(SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER))
{
VisBefore = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
VisRgn = NULL;
if (VisBefore != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisBefore, NULL)) &&
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION)
if ( VisBefore != NULL &&
(VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisBefore, NULL)) &&
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
{
RGNOBJAPI_Unlock(VisRgn);
GreDeleteObject(VisBefore);
@ -989,7 +990,8 @@ co_WinPosSetWindowPos(
{
InsertAfterWindow = NULL;
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;
Sibling = Sibling->spwndNext;
@ -1027,12 +1029,13 @@ co_WinPosSetWindowPos(
}
if (InsertAfterWindow != NULL)
UserDereferenceObject(InsertAfterWindow);
if ((HWND_TOPMOST == WinPos.hwndInsertAfter)
|| (0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST)
&& NULL != Window->spwndPrev
&& 0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST))
|| (NULL != Window->spwndNext
&& 0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST)))
if ( (HWND_TOPMOST == WinPos.hwndInsertAfter) ||
(0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST) &&
NULL != Window->spwndPrev &&
0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST)) ||
(NULL != Window->spwndNext &&
0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST)) )
{
Window->Wnd->ExStyle |= WS_EX_TOPMOST;
}
@ -1063,8 +1066,8 @@ co_WinPosSetWindowPos(
/* FIXME: Actually do something with WVR_VALIDRECTS */
if (NewClientRect.left != OldClientRect.left ||
NewClientRect.top != OldClientRect.top)
if ( NewClientRect.left != OldClientRect.left ||
NewClientRect.top != OldClientRect.top)
{
WinPosInternalMoveWindow(Window,
NewClientRect.left - OldClientRect.left,
@ -1077,8 +1080,11 @@ co_WinPosSetWindowPos(
if (!(WinPos.flags & SWP_SHOWWINDOW) && (WinPos.flags & SWP_HIDEWINDOW))
{
/* Clear the update region */
co_UserRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOFRAME |
RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN);
co_UserRedrawWindow( Window,
NULL,
0,
RDW_VALIDATE | RDW_NOFRAME | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN);
if ((Window->Wnd->style & WS_VISIBLE) &&
Window->spwndParent == UserGetDesktopWindow())
{
@ -1089,7 +1095,7 @@ co_WinPosSetWindowPos(
else if (WinPos.flags & SWP_SHOWWINDOW)
{
if (!(Window->Wnd->style & WS_VISIBLE) &&
Window->spwndParent == UserGetDesktopWindow())
Window->spwndParent == UserGetDesktopWindow() )
{
co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)Window->hSelf);
}
@ -1111,8 +1117,9 @@ co_WinPosSetWindowPos(
VisAfter = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
VisRgn = NULL;
if (VisAfter != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisAfter, NULL)) &&
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION)
if ( VisAfter != NULL &&
(VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisAfter, NULL)) &&
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
{
RGNOBJAPI_Unlock(VisRgn);
GreDeleteObject(VisAfter);
@ -1131,9 +1138,11 @@ co_WinPosSetWindowPos(
* class need to be completely repainted on (horizontal/vertical) size
* 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)) &&
!(Window->Wnd->ExStyle & WS_EX_TRANSPARENT))
!(Window->Wnd->ExStyle & WS_EX_TRANSPARENT) )
{
CopyRgn = IntSysCreateRectRgn(0, 0, 0, 0);
RgnType = NtGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
@ -1146,8 +1155,9 @@ co_WinPosSetWindowPos(
* we don't have to crop (can't take anything away from an empty
* region...)
*/
if (!(WinPos.flags & SWP_NOSIZE) && RgnType != ERROR &&
RgnType != NULLREGION)
if (!(WinPos.flags & SWP_NOSIZE) &&
RgnType != ERROR &&
RgnType != NULLREGION )
{
PROSRGNDATA pCopyRgn;
RECTL ORect = OldClientRect;
@ -1173,7 +1183,7 @@ co_WinPosSetWindowPos(
* there's nothing to copy. Also, it's no use copying bits onto
* themselves.
*/
if ((VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(CopyRgn, NULL)) &&
if ( (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(CopyRgn, NULL)) &&
REGION_GetRgnBox(VisRgn, &CopyRect) == NULLREGION)
{
/* Nothing to copy, clean up */
@ -1189,24 +1199,30 @@ co_WinPosSetWindowPos(
RGNOBJAPI_Unlock(VisRgn);
}
/*
* Small trick here: there is no function to bitblt a region. So
* we set the region as the clipping region, take the bounding box
* of the region and bitblt that. Since nothing outside the clipping
* region is copied, this has the effect of bitblt'ing the region.
*
* Since NtUserGetDCEx takes ownership of the clip region, we need
* to create a copy of CopyRgn and pass that. We need CopyRgn later
*/
/*
* Small trick here: there is no function to bitblt a region. So
* we set the region as the clipping region, take the bounding box
* of the region and bitblt that. Since nothing outside the clipping
* region is copied, this has the effect of bitblt'ing the region.
*
* Since NtUserGetDCEx takes ownership of the clip region, we need
* to create a copy of CopyRgn and pass that. We need CopyRgn later
*/
NtGdiOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
Dc = UserGetDCEx(Window, CopyRgn, DCX_WINDOW | DCX_CACHE |
DCX_INTERSECTRGN | DCX_CLIPSIBLINGS |
DCX_KEEPCLIPRGN);
NtGdiBitBlt(Dc,
CopyRect.left, CopyRect.top, CopyRect.right - CopyRect.left,
CopyRect.bottom - CopyRect.top, Dc,
CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY, 0, 0);
Dc = UserGetDCEx( Window,
CopyRgn,
DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN);
NtGdiBitBlt( Dc,
CopyRect.left, CopyRect.top,
CopyRect.right - CopyRect.left,
CopyRect.bottom - CopyRect.top,
Dc,
CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
SRCCOPY,
0,
0);
UserReleaseDC(Window, Dc, FALSE);
IntValidateParent(Window, CopyRgn, FALSE);
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
@ -1235,9 +1251,10 @@ co_WinPosSetWindowPos(
}
if (RgnType != ERROR && RgnType != NULLREGION)
{
/* old code
/* old code
NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
IntInvalidateWindows(Window, DirtyRgn,
IntInvalidateWindows( Window,
DirtyRgn,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
GreDeleteObject(DirtyRgn);
@ -1245,21 +1262,23 @@ co_WinPosSetWindowPos(
PWINDOW_OBJECT Parent = Window->spwndParent;
NtGdiOffsetRgn(DirtyRgn,
Window->Wnd->rcWindow.left,
Window->Wnd->rcWindow.top);
if ((Window->Wnd->style & WS_CHILD) &&
(Parent) &&
NtGdiOffsetRgn( DirtyRgn,
Window->Wnd->rcWindow.left,
Window->Wnd->rcWindow.top);
if ( (Window->Wnd->style & WS_CHILD) &&
(Parent) &&
!(Parent->Wnd->style & WS_CLIPCHILDREN))
{
IntInvalidateWindows(Parent, DirtyRgn,
RDW_ERASE | RDW_INVALIDATE);
IntInvalidateWindows( Parent,
DirtyRgn,
RDW_ERASE | RDW_INVALIDATE);
co_IntPaintWindows(Parent, RDW_ERASENOW, FALSE);
}
else
{
IntInvalidateWindows(Window, DirtyRgn,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
IntInvalidateWindows( Window,
DirtyRgn,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
REGION_FreeRgnByHandle(DirtyRgn);
@ -1275,8 +1294,10 @@ co_WinPosSetWindowPos(
{
ExposedRgn = IntSysCreateRectRgn(0, 0, 0, 0);
NtGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
NtGdiOffsetRgn(ExposedRgn, OldWindowRect.left - NewWindowRect.left,
OldWindowRect.top - NewWindowRect.top);
NtGdiOffsetRgn( ExposedRgn,
OldWindowRect.left - NewWindowRect.left,
OldWindowRect.top - NewWindowRect.top);
if (VisAfter != NULL)
RgnType = NtGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
else