From 21032e02d1deade7e2dabf883dd3ea08c57f9946 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 28 Jan 2010 23:34:57 +0000 Subject: [PATCH] [Win32k] - Add back removed window dce support routine. Fixed list handling and implemented thread cleanup for dces. svn path=/trunk/; revision=45305 --- .../subsystems/win32/win32k/ntuser/ntstubs.c | 12 -- .../subsystems/win32/win32k/ntuser/painting.c | 170 ++++++++++++------ .../subsystems/win32/win32k/ntuser/winpos.c | 133 ++++++++------ 3 files changed, 192 insertions(+), 123 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index 33abd9a88a9..ec680a871c9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -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( diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index aa1b769e00d..68d2932c596 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -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 */ diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index d81b9bf61b5..13c58617279 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -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