diff --git a/reactos/dll/win32/gdi32/misc/misc.c b/reactos/dll/win32/gdi32/misc/misc.c index 25ff84253de..dac9a73a8ff 100644 --- a/reactos/dll/win32/gdi32/misc/misc.c +++ b/reactos/dll/win32/gdi32/misc/misc.c @@ -275,7 +275,7 @@ HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) { - int Number, Count, MaxNum, GdiType; + int Number, Offset, MaxNum, GdiType; HANDLE Lock; HGDIOBJ Handle = NULL; @@ -289,19 +289,19 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) if (Type == hctBrushHandle) { - Count = 0; + Offset = 0; MaxNum = CACHE_BRUSH_ENTRIES; GdiType = GDILoObjType_LO_BRUSH_TYPE; } else if (Type == hctPenHandle) { - Count = CACHE_BRUSH_ENTRIES; + Offset = CACHE_BRUSH_ENTRIES; MaxNum = CACHE_PEN_ENTRIES; GdiType = GDILoObjType_LO_PEN_TYPE; } else if (Type == hctRegionHandle) { - Count = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; + Offset = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; MaxNum = CACHE_REGION_ENTRIES; GdiType = GDILoObjType_LO_REGION_TYPE; } @@ -314,7 +314,7 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) { PBRUSH_ATTR pBrush_Attr; HGDIOBJ *hPtr; - hPtr = GdiHandleCache->Handle + Count; + hPtr = GdiHandleCache->Handle + Offset; Handle = hPtr[Number - 1]; if (GdiGetHandleUserData( Handle, GdiType, (PVOID) &pBrush_Attr)) @@ -335,6 +335,10 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) } } } + else + { + Handle = NULL; + } } (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock); return Handle; diff --git a/reactos/dll/win32/user32/windows/paint.c b/reactos/dll/win32/user32/windows/paint.c index 433577eedf5..dff5f98afd3 100644 --- a/reactos/dll/win32/user32/windows/paint.c +++ b/reactos/dll/win32/user32/windows/paint.c @@ -107,19 +107,19 @@ GetUpdateRect( pWnd = ValidateHwnd(Wnd); if (!pWnd) return FALSE; -/* + if ( pWnd->hrgnUpdate || pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED)) - {*/ + { return NtUserGetUpdateRect(Wnd, Rect, Erase); -/* } + } if (Rect) { // Did the Rgn update? No! Back set and shutup! Rect->left = Rect->right = Rect->top = Rect->bottom = 0; } return FALSE; // msdn: "If there is no update region, the return value is zero." -*/ + } @@ -144,14 +144,14 @@ GetUpdateRgn( pWnd = ValidateHwnd(hWnd); if (!pWnd) return ERROR; -/* + if ( pWnd->hrgnUpdate || pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED)) - {*/ + { return NtUserGetUpdateRgn(hWnd, hRgn, bErase); -/* } + } SetRectRgn(hRgn, 0, 0, 0, 0); - return NULLREGION;*/ + return NULLREGION; } @@ -239,14 +239,14 @@ UpdateWindow( if (!pWnd) return FALSE; -/* + if ( pWnd->hrgnUpdate || pWnd->state & WNDS_INTERNALPAINT || pWnd->spwndChild ) - {*/ + { return NtUserCallHwndLock(hWnd, HWNDLOCK_ROUTINE_UPDATEWINDOW); -/* } - return TRUE;*/ + } + return TRUE; } /* @@ -286,7 +286,7 @@ GetWindowRgn( if (!Ret) return ERROR; - if (pWnd->fnid != FNID_DESKTOP) + if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP) Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top); if (pWnd->ExStyle & WS_EX_LAYOUTRTL) @@ -320,7 +320,7 @@ GetWindowRgnBox( if (!Ret) return ERROR; - if (pWnd->fnid != FNID_DESKTOP) + if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP) OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top); if (pWnd->ExStyle & WS_EX_LAYOUTRTL) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index f2e3850437f..48919098be7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -1248,6 +1248,7 @@ UserScrollDC( hrgnOwn = hrgnUpdate; if (!NtGdiSetRectRgn(hrgnOwn, rcDst.left, rcDst.top, rcDst.right, rcDst.bottom)) { + DC_UnlockDc(pDC); return ERROR; } } @@ -1265,8 +1266,8 @@ UserScrollDC( NtGdiOffsetRgn(hrgnTmp, dx, dy); Result = NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_DIFF); - /* DO NOT Unlock DC while messing with prgnVis! */ - DC_UnlockDc(pDC); + /* DO NOT Unlock DC while messing with prgnVis! */ + DC_UnlockDc(pDC); REGION_FreeRgnByHandle(hrgnTmp); diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index d0bd3bafc61..38ad6ae7232 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -2080,6 +2080,7 @@ REGION_AllocUserRgnWithHandle(INT nRgn) { Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr); Entry->UserData = AllocateObjectAttr(); + RtlZeroMemory(Entry->UserData, sizeof(RGN_ATTR)); } return pRgn; } @@ -2090,6 +2091,7 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) { PGDI_TABLE_ENTRY Entry; PRGN_ATTR pRgn_Attr; + BOOL Hit = FALSE; PROSRGNDATA pRgn = NULL; pRgn = REGION_LockRgn(hRgn); @@ -2103,11 +2105,12 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) { _SEH2_TRY { - if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) && - pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) ) + if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) ) { - switch (pRgn_Attr->Flags) + if ( pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) ) { + switch (pRgn_Attr->Flags) + { case NULLREGION: EMPTY_REGION( pRgn ); break; @@ -2119,8 +2122,13 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) pRgn_Attr->Rect.right, pRgn_Attr->Rect.bottom ); break; + } + pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY; } - pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY; + } + else + { // This object is cached an waiting for it's resurrection by the users. + Hit = TRUE; } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -2128,6 +2136,11 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) } _SEH2_END; + if (Hit) + { + REGION_UnlockRgn(pRgn); + return NULL; + } if (ppRgn_Attr) *ppRgn_Attr = pRgn_Attr; }