[WIN32K:NTUSER]
[reactos.git] / reactos / win32ss / user / ntuser / windc.c
index 4935189..e6ad147 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * PROJECT:         ReactOS Win32k subsystem
  * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            subsystems/win32/win32k/ntuser/windc.c
+ * FILE:            win32ss/user/ntuser/windc.c
  * PURPOSE:         Window DC management
  * COPYRIGHT:       Copyright 2007 ReactOS Team
  */
@@ -366,7 +366,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
       Flags |= DCX_CACHE;
    }
 
-   if (Flags & (DCX_WINDOW | DCX_PARENTCLIP)) Flags |= DCX_CACHE;
+   if (Flags & DCX_PARENTCLIP) Flags |= DCX_CACHE;
 
    // When GetDC is called with hWnd nz, DCX_CACHE & _WINDOW are clear w _USESTYLE set.
    if (Flags & DCX_USESTYLE)
@@ -403,11 +403,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
             Flags |= DCX_CLIPCHILDREN;
          }
          /* If minized with icon in the set, we are forced to be cheap! */
-#ifdef NEW_CURSORICON
          if (Wnd->style & WS_MINIMIZE && Wnd->pcls->spicn)
-#else
-         if (Wnd->style & WS_MINIMIZE && Wnd->pcls->hIcon)
-#endif
          {
             Flags |= DCX_CACHE;
          }
@@ -488,6 +484,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
                break;
             }
          }
+         Dce = NULL; // Loop issue?
       }
       KeLeaveCriticalRegion();
 
@@ -497,7 +494,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
       {
          Dce = DceAllocDCE(NULL, DCE_CACHE_DC);
       }
-      if (!Dce) return NULL;
+      if (Dce == NULL) return NULL;
 
       Dce->hwndCurrent = (Wnd ? Wnd->head.h : NULL);
       Dce->pwndOrg = Dce->pwndClip = Wnd;
@@ -510,20 +507,31 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags)
       {
           Dce = CONTAINING_RECORD(ListEntry, DCE, List);
           ListEntry = ListEntry->Flink;
-          // Check for Window handle than HDC match for CLASS.
-          if (Dce->hwndCurrent == Wnd->head.h)
+
+          // Skip Cache DCE entries.
+          if (!(Dce->DCXFlags & DCX_CACHE))
           {
-             bUpdateVisRgn = FALSE;
-             break;
+             // Check for Window handle than HDC match for CLASS.
+             if (Dce->hwndCurrent == Wnd->head.h)
+             {
+                bUpdateVisRgn = FALSE;
+                break;
+             }
+             else if (Dce->hDC == hDC) break;
           }
-          if (Dce->hDC == hDC) break;
+          Dce = NULL; // Loop issue?
       }
       KeLeaveCriticalRegion();
 
+      if (Dce == NULL)
+      {
+         return(NULL);
+      }
+
       if ( (Flags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) &&
            (Dce->DCXFlags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) )
       {
-          DceDeleteClipRgn(Dce);
+         DceDeleteClipRgn(Dce);
       }
    }
 // First time use hax, need to use DceAllocDCE during window display init.
@@ -758,7 +766,7 @@ DceFreeWindowDCE(PWND Window)
 }
 
 void FASTCALL
-DceFreeClassDCE(HDC hDC)
+DceFreeClassDCE(PDCE pdceClass)
 {
    PDCE pDCE;
    PLIST_ENTRY ListEntry;
@@ -768,7 +776,7 @@ DceFreeClassDCE(HDC hDC)
    {
        pDCE = CONTAINING_RECORD(ListEntry, DCE, List);
        ListEntry = ListEntry->Flink;
-       if (pDCE->hDC == hDC)
+       if (pDCE == pdceClass)
        {
           DceFreeDCE(pDCE, TRUE); // Might have gone cheap!
        }
@@ -954,15 +962,12 @@ UserGethWnd( HDC hdc, PWNDOBJ *pwndo)
   XCLIPOBJ* Clip;
   PWND Wnd;
   HWND hWnd;
-  PPROPERTY pprop;
 
   hWnd = IntWindowFromDC(hdc);
 
   if (hWnd && (Wnd = UserGetWindowObject(hWnd)))
   {
-     pprop = IntGetProp(Wnd, AtomWndObj);
-
-     Clip = (XCLIPOBJ*)pprop->Data;
+     Clip = (XCLIPOBJ*)UserGetProp(Wnd, AtomWndObj, TRUE);
 
      if ( Clip && Clip->Hwnd == hWnd )
      {