diff --git a/reactos/subsys/win32k/include/userfuncs.h b/reactos/subsys/win32k/include/userfuncs.h index 6c2ff4d2037..72d2fbe4444 100644 --- a/reactos/subsys/win32k/include/userfuncs.h +++ b/reactos/subsys/win32k/include/userfuncs.h @@ -112,7 +112,7 @@ HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window); /*************** WINDC.C ***************/ INT FASTCALL -UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc); +UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint); HDC FASTCALL UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags); diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 51f42a273be..3cda722d9f3 100644 --- a/reactos/subsys/win32k/ntuser/painting.c +++ b/reactos/subsys/win32k/ntuser/painting.c @@ -259,11 +259,14 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) { if (Window->UpdateRegion) { + hDC = UserGetDCEx(Window, Window->UpdateRegion, + DCX_CACHE | DCX_USESTYLE | + DCX_INTERSECTRGN | DCX_KEEPCLIPRGN); if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0)) { Window->Flags &= ~WINDOWOBJECT_NEED_ERASEBKGND; } - UserReleaseDC(Window, hDC); + UserReleaseDC(Window, hDC, FALSE); } } } @@ -829,7 +832,7 @@ NtUserEndPaint(HWND hWnd, CONST PAINTSTRUCT* lPs) RETURN(FALSE); } - UserReleaseDC(Window, lPs->hdc); + UserReleaseDC(Window, lPs->hdc, TRUE); UserRefObjectCo(Window); co_UserShowCaret(Window); @@ -1295,7 +1298,7 @@ NtUserScrollWindowEx(HWND hWnd, INT dx, INT dy, const RECT *UnsafeRect, if (hDC) { UserScrollDC(hDC, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate); - UserReleaseDC(Window, hDC); + UserReleaseDC(Window, hDC, FALSE); } /* diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 2bc8219b8c5..06ec13fd90f 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.c @@ -118,7 +118,7 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type) if (NULL == defaultDCstate) { defaultDCstate = NtGdiGetDCState(Dce->hDC); - GDIOBJ_SetOwnership(defaultDCstate, NULL); + DC_SetOwnership(defaultDCstate, NULL); } GDIOBJ_SetOwnership(Dce->Self, NULL); DC_SetOwnership(Dce->hDC, NULL); @@ -193,7 +193,6 @@ DceDeleteClipRgn(DCE* Dce) } else if (Dce->hClipRgn != NULL) { - GDIOBJ_SetOwnership(Dce->hClipRgn, PsGetCurrentProcess()); NtGdiDeleteObject(Dce->hClipRgn); } @@ -204,7 +203,7 @@ DceDeleteClipRgn(DCE* Dce) } STATIC INT FASTCALL -DceReleaseDC(DCE* dce) +DceReleaseDC(DCE* dce, BOOL EndPaint) { if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_DCEEMPTY | DCX_DCEBUSY))) { @@ -214,7 +213,7 @@ DceReleaseDC(DCE* dce) /* restore previous visible region */ if ((dce->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) && - (dce->DCXFlags & DCX_CACHE) ) + ((dce->DCXFlags & DCX_CACHE) || EndPaint)) { DceDeleteClipRgn(dce); } @@ -463,23 +462,27 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) } Dce->hwndCurrent = (Window ? Window->hSelf : NULL); - Dce->DCXFlags = DcxFlags | DCX_DCEBUSY; + Dce->DCXFlags = Flags | DCX_DCEBUSY; if (0 == (Flags & (DCX_EXCLUDERGN | DCX_INTERSECTRGN)) && NULL != ClipRegion) { - NtGdiDeleteObject(ClipRegion); + if (Flags & DCX_KEEPCLIPRGN) + NtGdiDeleteObject(ClipRegion); ClipRegion = NULL; } +#if 0 if (NULL != Dce->hClipRgn) { DceDeleteClipRgn(Dce); Dce->hClipRgn = NULL; } +#endif if (0 != (Flags & DCX_INTERSECTUPDATE) && NULL == ClipRegion) { Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; + Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; ClipRegion = Window->UpdateRegion; } @@ -488,18 +491,15 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) if (!(Flags & DCX_WINDOW)) { Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect); - GDIOBJ_SetOwnership(Dce->hClipRgn, NULL); } else { Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); - GDIOBJ_SetOwnership(Dce->hClipRgn, NULL); } } else if (ClipRegion != NULL) { Dce->hClipRgn = ClipRegion; - GDIOBJ_SetOwnership(Dce->hClipRgn, NULL); } DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin); @@ -583,7 +583,7 @@ IntWindowFromDC(HDC hDc) INT FASTCALL -UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc) +UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint) { DCE *dce; INT nRet = 0; @@ -599,7 +599,7 @@ UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc) if (dce && (dce->DCXFlags & DCX_DCEBUSY)) { - nRet = DceReleaseDC(dce); + nRet = DceReleaseDC(dce, EndPaint); } return nRet; @@ -615,7 +615,7 @@ NtUserReleaseDC(HWND hWnd, HDC hDc) DPRINT("Enter NtUserReleaseDC\n"); UserEnterExclusive(); - RETURN(UserReleaseDC(NULL, hDc)); + RETURN(UserReleaseDC(NULL, hDc, FALSE)); CLEANUP: DPRINT("Leave NtUserReleaseDC, ret=%i\n",_ret_); @@ -650,7 +650,6 @@ DceFreeDCE(PDCE dce, BOOLEAN Force) } NtGdiDeleteDC(dce->hDC); - GDIOBJ_SetOwnership(dce->hClipRgn, PsGetCurrentProcess()); if (dce->hClipRgn && ! (dce->DCXFlags & DCX_KEEPCLIPRGN)) { NtGdiDeleteObject(dce->hClipRgn); @@ -703,7 +702,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) * (for 1.0?). */ DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf); - DceReleaseDC(pDCE); + DceReleaseDC(pDCE, FALSE); } pDCE->DCXFlags &= DCX_CACHE; @@ -715,12 +714,12 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) } } -void FASTCALL +VOID FASTCALL DceEmptyCache() { while (FirstDce != NULL) { - DceFreeDCE(FirstDce, TRUE); + FirstDce = DceFreeDCE(FirstDce, TRUE); } } diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 4ef2fa7ebbf..d1da8fcda76 100644 --- a/reactos/subsys/win32k/ntuser/winpos.c +++ b/reactos/subsys/win32k/ntuser/winpos.c @@ -1189,7 +1189,7 @@ co_WinPosSetWindowPos( CopyRect.bottom - CopyRect.top, Dc, CopyRect.left + (OldWindowRect.left - NewWindowRect.left), CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY); - UserReleaseDC(Window, Dc); + UserReleaseDC(Window, Dc, FALSE); IntValidateParent(Window, CopyRgn); NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top); } diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 001727b41f0..6e3085b4d51 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -122,7 +122,7 @@ BOOL STDCALL NtGdiAnimatePalette(HPALETTE hPal, UINT StartIndex, else DC_UnlockDc(dc); } - UserReleaseDC(Wnd,hDC); + UserReleaseDC(Wnd,hDC, FALSE); } return TRUE; }