- Fix region deleting and ownership for DCEs.

- Fix uninitialized hDC variable in painting code :)

svn path=/trunk/; revision=17932
This commit is contained in:
Filip Navara 2005-09-19 12:21:52 +00:00
parent 1d878e0ba5
commit e402efe2c3
5 changed files with 24 additions and 22 deletions

View file

@ -112,7 +112,7 @@ HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window);
/*************** WINDC.C ***************/ /*************** WINDC.C ***************/
INT FASTCALL INT FASTCALL
UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc); UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint);
HDC FASTCALL HDC FASTCALL
UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags); UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags);

View file

@ -259,11 +259,14 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags)
{ {
if (Window->UpdateRegion) 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)) if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
{ {
Window->Flags &= ~WINDOWOBJECT_NEED_ERASEBKGND; Window->Flags &= ~WINDOWOBJECT_NEED_ERASEBKGND;
} }
UserReleaseDC(Window, hDC); UserReleaseDC(Window, hDC, FALSE);
} }
} }
} }
@ -829,7 +832,7 @@ NtUserEndPaint(HWND hWnd, CONST PAINTSTRUCT* lPs)
RETURN(FALSE); RETURN(FALSE);
} }
UserReleaseDC(Window, lPs->hdc); UserReleaseDC(Window, lPs->hdc, TRUE);
UserRefObjectCo(Window); UserRefObjectCo(Window);
co_UserShowCaret(Window); co_UserShowCaret(Window);
@ -1295,7 +1298,7 @@ NtUserScrollWindowEx(HWND hWnd, INT dx, INT dy, const RECT *UnsafeRect,
if (hDC) if (hDC)
{ {
UserScrollDC(hDC, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate); UserScrollDC(hDC, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate);
UserReleaseDC(Window, hDC); UserReleaseDC(Window, hDC, FALSE);
} }
/* /*

View file

@ -118,7 +118,7 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type)
if (NULL == defaultDCstate) if (NULL == defaultDCstate)
{ {
defaultDCstate = NtGdiGetDCState(Dce->hDC); defaultDCstate = NtGdiGetDCState(Dce->hDC);
GDIOBJ_SetOwnership(defaultDCstate, NULL); DC_SetOwnership(defaultDCstate, NULL);
} }
GDIOBJ_SetOwnership(Dce->Self, NULL); GDIOBJ_SetOwnership(Dce->Self, NULL);
DC_SetOwnership(Dce->hDC, NULL); DC_SetOwnership(Dce->hDC, NULL);
@ -193,7 +193,6 @@ DceDeleteClipRgn(DCE* Dce)
} }
else if (Dce->hClipRgn != NULL) else if (Dce->hClipRgn != NULL)
{ {
GDIOBJ_SetOwnership(Dce->hClipRgn, PsGetCurrentProcess());
NtGdiDeleteObject(Dce->hClipRgn); NtGdiDeleteObject(Dce->hClipRgn);
} }
@ -204,7 +203,7 @@ DceDeleteClipRgn(DCE* Dce)
} }
STATIC INT FASTCALL STATIC INT FASTCALL
DceReleaseDC(DCE* dce) DceReleaseDC(DCE* dce, BOOL EndPaint)
{ {
if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_DCEEMPTY | DCX_DCEBUSY))) if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_DCEEMPTY | DCX_DCEBUSY)))
{ {
@ -214,7 +213,7 @@ DceReleaseDC(DCE* dce)
/* restore previous visible region */ /* restore previous visible region */
if ((dce->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) && if ((dce->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) &&
(dce->DCXFlags & DCX_CACHE) ) ((dce->DCXFlags & DCX_CACHE) || EndPaint))
{ {
DceDeleteClipRgn(dce); DceDeleteClipRgn(dce);
} }
@ -463,23 +462,27 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
} }
Dce->hwndCurrent = (Window ? Window->hSelf : NULL); 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) if (0 == (Flags & (DCX_EXCLUDERGN | DCX_INTERSECTRGN)) && NULL != ClipRegion)
{ {
if (Flags & DCX_KEEPCLIPRGN)
NtGdiDeleteObject(ClipRegion); NtGdiDeleteObject(ClipRegion);
ClipRegion = NULL; ClipRegion = NULL;
} }
#if 0
if (NULL != Dce->hClipRgn) if (NULL != Dce->hClipRgn)
{ {
DceDeleteClipRgn(Dce); DceDeleteClipRgn(Dce);
Dce->hClipRgn = NULL; Dce->hClipRgn = NULL;
} }
#endif
if (0 != (Flags & DCX_INTERSECTUPDATE) && NULL == ClipRegion) if (0 != (Flags & DCX_INTERSECTUPDATE) && NULL == ClipRegion)
{ {
Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN;
ClipRegion = Window->UpdateRegion; ClipRegion = Window->UpdateRegion;
} }
@ -488,18 +491,15 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
if (!(Flags & DCX_WINDOW)) if (!(Flags & DCX_WINDOW))
{ {
Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect); Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect);
GDIOBJ_SetOwnership(Dce->hClipRgn, NULL);
} }
else else
{ {
Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect);
GDIOBJ_SetOwnership(Dce->hClipRgn, NULL);
} }
} }
else if (ClipRegion != NULL) else if (ClipRegion != NULL)
{ {
Dce->hClipRgn = ClipRegion; Dce->hClipRgn = ClipRegion;
GDIOBJ_SetOwnership(Dce->hClipRgn, NULL);
} }
DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin); DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin);
@ -583,7 +583,7 @@ IntWindowFromDC(HDC hDc)
INT FASTCALL INT FASTCALL
UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc) UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint)
{ {
DCE *dce; DCE *dce;
INT nRet = 0; INT nRet = 0;
@ -599,7 +599,7 @@ UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc)
if (dce && (dce->DCXFlags & DCX_DCEBUSY)) if (dce && (dce->DCXFlags & DCX_DCEBUSY))
{ {
nRet = DceReleaseDC(dce); nRet = DceReleaseDC(dce, EndPaint);
} }
return nRet; return nRet;
@ -615,7 +615,7 @@ NtUserReleaseDC(HWND hWnd, HDC hDc)
DPRINT("Enter NtUserReleaseDC\n"); DPRINT("Enter NtUserReleaseDC\n");
UserEnterExclusive(); UserEnterExclusive();
RETURN(UserReleaseDC(NULL, hDc)); RETURN(UserReleaseDC(NULL, hDc, FALSE));
CLEANUP: CLEANUP:
DPRINT("Leave NtUserReleaseDC, ret=%i\n",_ret_); DPRINT("Leave NtUserReleaseDC, ret=%i\n",_ret_);
@ -650,7 +650,6 @@ DceFreeDCE(PDCE dce, BOOLEAN Force)
} }
NtGdiDeleteDC(dce->hDC); NtGdiDeleteDC(dce->hDC);
GDIOBJ_SetOwnership(dce->hClipRgn, PsGetCurrentProcess());
if (dce->hClipRgn && ! (dce->DCXFlags & DCX_KEEPCLIPRGN)) if (dce->hClipRgn && ! (dce->DCXFlags & DCX_KEEPCLIPRGN))
{ {
NtGdiDeleteObject(dce->hClipRgn); NtGdiDeleteObject(dce->hClipRgn);
@ -703,7 +702,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
* (for 1.0?). * (for 1.0?).
*/ */
DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf); DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf);
DceReleaseDC(pDCE); DceReleaseDC(pDCE, FALSE);
} }
pDCE->DCXFlags &= DCX_CACHE; pDCE->DCXFlags &= DCX_CACHE;
@ -715,12 +714,12 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
} }
} }
void FASTCALL VOID FASTCALL
DceEmptyCache() DceEmptyCache()
{ {
while (FirstDce != NULL) while (FirstDce != NULL)
{ {
DceFreeDCE(FirstDce, TRUE); FirstDce = DceFreeDCE(FirstDce, TRUE);
} }
} }

View file

@ -1189,7 +1189,7 @@ co_WinPosSetWindowPos(
CopyRect.bottom - CopyRect.top, Dc, CopyRect.bottom - CopyRect.top, Dc,
CopyRect.left + (OldWindowRect.left - NewWindowRect.left), CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY); CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY);
UserReleaseDC(Window, Dc); UserReleaseDC(Window, Dc, FALSE);
IntValidateParent(Window, CopyRgn); IntValidateParent(Window, CopyRgn);
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top); NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
} }

View file

@ -122,7 +122,7 @@ BOOL STDCALL NtGdiAnimatePalette(HPALETTE hPal, UINT StartIndex,
else else
DC_UnlockDc(dc); DC_UnlockDc(dc);
} }
UserReleaseDC(Wnd,hDC); UserReleaseDC(Wnd,hDC, FALSE);
} }
return TRUE; return TRUE;
} }