[WIN32SS]
[reactos.git] / win32ss / gdi / eng / engwindow.c
index b3eecd2..ec34394 100644 (file)
@@ -2,7 +2,7 @@
  * COPYRIGHT:         See COPYING in the top level directory
  * PROJECT:           ReactOS kernel
  * PURPOSE:           GDI WNDOBJ Functions
- * FILE:              subsystems/win32/win32k/eng/engwindow.c
+ * FILE:              win32ss/gdi/eng/engwindow.c
  * PROGRAMER:         Gregor Anich
  */
 
@@ -18,7 +18,7 @@ INT gcountPWO = 0;
 VOID
 FASTCALL
 IntEngWndCallChangeProc(
-    _In_ XCLIPOBJ *Clip,
+    _In_ EWNDOBJ *Clip,
     _In_ FLONG   flChanged)
 {
     if (Clip->ChangeProc == NULL)
@@ -40,7 +40,7 @@ IntEngWndCallChangeProc(
     if (flChanged == WOC_CHANGED)
         Clip->ChangeProc(NULL, flChanged);
     else
-        Clip->ChangeProc(&Clip->WndObj, flChanged);
+        Clip->ChangeProc((WNDOBJ *)Clip, flChanged);
 }
 
 /*
@@ -49,54 +49,44 @@ IntEngWndCallChangeProc(
 BOOLEAN
 FASTCALL
 IntEngWndUpdateClipObj(
-    XCLIPOBJ* Clip,
+    EWNDOBJ* Clip,
     PWND Window)
 {
-    HRGN hVisRgn;
-    PROSRGNDATA visRgn;
+    PREGION visRgn;
 
     TRACE("IntEngWndUpdateClipObj\n");
 
-    hVisRgn = VIS_ComputeVisibleRegion(Window, TRUE, TRUE, TRUE);
-    if (hVisRgn != NULL)
+    visRgn = VIS_ComputeVisibleRegion(Window, TRUE, TRUE, TRUE);
+    if (visRgn != NULL)
     {
-        visRgn = RGNOBJAPI_Lock(hVisRgn, NULL);
-        if (visRgn != NULL)
+        if (visRgn->rdh.nCount > 0)
         {
-            if (visRgn->rdh.nCount > 0)
+            IntEngUpdateClipRegion((XCLIPOBJ*)Clip, visRgn->rdh.nCount, visRgn->Buffer, &visRgn->rdh.rcBound);
+            TRACE("Created visible region with %lu rects\n", visRgn->rdh.nCount);
+            TRACE("  BoundingRect: %d, %d  %d, %d\n",
+                   visRgn->rdh.rcBound.left, visRgn->rdh.rcBound.top,
+                   visRgn->rdh.rcBound.right, visRgn->rdh.rcBound.bottom);
             {
-                IntEngUpdateClipRegion(Clip, visRgn->rdh.nCount, visRgn->Buffer, &visRgn->rdh.rcBound);
-                TRACE("Created visible region with %lu rects\n", visRgn->rdh.nCount);
-                TRACE("  BoundingRect: %d, %d  %d, %d\n",
-                       visRgn->rdh.rcBound.left, visRgn->rdh.rcBound.top,
-                       visRgn->rdh.rcBound.right, visRgn->rdh.rcBound.bottom);
+                ULONG i;
+                for (i = 0; i < visRgn->rdh.nCount; i++)
                 {
-                    ULONG i;
-                    for (i = 0; i < visRgn->rdh.nCount; i++)
-                    {
-                        TRACE("  Rect #%lu: %ld,%ld  %ld,%ld\n", i+1,
-                               visRgn->Buffer[i].left, visRgn->Buffer[i].top,
-                               visRgn->Buffer[i].right, visRgn->Buffer[i].bottom);
-                    }
+                    TRACE("  Rect #%lu: %ld,%ld  %ld,%ld\n", i+1,
+                           visRgn->Buffer[i].left, visRgn->Buffer[i].top,
+                           visRgn->Buffer[i].right, visRgn->Buffer[i].bottom);
                 }
             }
-            RGNOBJAPI_Unlock(visRgn);
         }
-        else
-        {
-            WARN("Couldn't lock visible region of window DC\n");
-        }
-        GreDeleteObject(hVisRgn);
+        REGION_Delete(visRgn);
     }
     else
     {
         /* Fall back to client rect */
-        IntEngUpdateClipRegion(Clip, 1, &Window->rcClient, &Window->rcClient);
+        IntEngUpdateClipRegion((XCLIPOBJ*)Clip, 1, &Window->rcClient, &Window->rcClient);
     }
 
     /* Update the WNDOBJ */
-    Clip->WndObj.rclClient = Window->rcClient;
-    Clip->WndObj.coClient.iUniq++;
+    Clip->rclClient = Window->rcClient;
+    Clip->iUniq++;
 
     return TRUE;
 }
@@ -110,18 +100,18 @@ IntEngWindowChanged(
     _In_    PWND  Window,
     _In_    FLONG flChanged)
 {
-    XCLIPOBJ *Clip;
+    EWNDOBJ *Clip;
 
     ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL);
 
-    Clip = UserGetProp(Window, AtomWndObj);
+    Clip = UserGetProp(Window, AtomWndObj, TRUE);
     if (!Clip)
     {
         return;
     }
 
     ASSERT(Clip->Hwnd == Window->head.h);
-    // if (Clip->WndObj.pvConsumer != NULL)
+    // if (Clip->pvConsumer != NULL)
     {
         /* Update the WNDOBJ */
         switch (flChanged)
@@ -159,50 +149,45 @@ EngCreateWnd(
     FLONG             fl,
     int               iPixelFormat)
 {
-    XCLIPOBJ *Clip = NULL;
+    EWNDOBJ *Clip = NULL;
     WNDOBJ *WndObjUser = NULL;
     PWND Window;
-    BOOL calledFromUser;
-    DECLARE_RETURN(WNDOBJ*);
 
     TRACE("EngCreateWnd: pso = 0x%p, hwnd = 0x%p, pfn = 0x%p, fl = 0x%lx, pixfmt = %d\n",
             pso, hWnd, pfn, fl, iPixelFormat);
 
+    UserEnterExclusive();
+
     if (fl & (WO_RGN_WINDOW | WO_RGN_DESKTOP_COORD | WO_RGN_UPDATE_ALL))
     {
         FIXME("Unsupported flags: 0x%lx\n", fl & ~(WO_RGN_CLIENT_DELTA | WO_RGN_CLIENT | WO_RGN_SURFACE_DELTA | WO_RGN_SURFACE));
     }
 
-    calledFromUser = UserIsEntered();
-    if (!calledFromUser) {
-        UserEnterShared();
-    }
-
     /* Get window object */
     Window = UserGetWindowObject(hWnd);
     if (Window == NULL)
     {
-        RETURN( NULL);
+        goto Exit;
     }
 
     /* Create WNDOBJ */
-    Clip = EngAllocMem(FL_ZERO_MEMORY, sizeof (XCLIPOBJ), GDITAG_WNDOBJ);
+    Clip = EngAllocMem(FL_ZERO_MEMORY, sizeof(EWNDOBJ), GDITAG_WNDOBJ);
     if (Clip == NULL)
     {
         ERR("Failed to allocate memory for a WND structure!\n");
-        RETURN( NULL);
+        goto Exit;
     }
-    IntEngInitClipObj(Clip);
+    IntEngInitClipObj((XCLIPOBJ*)Clip);
 
     /* Fill the clipobj */
     if (!IntEngWndUpdateClipObj(Clip, Window))
     {
         EngFreeMem(Clip);
-        RETURN( NULL);
+        goto Exit;
     }
 
     /* Fill user object */
-    WndObjUser = &Clip->WndObj;
+    WndObjUser = (WNDOBJ *)Clip;
     WndObjUser->psoOwner = pso;
     WndObjUser->pvConsumer = NULL;
 
@@ -218,20 +203,14 @@ EngCreateWnd(
     Clip->PixelFormat = iPixelFormat;
 
     /* associate object with window */
-    IntSetProp(Window, AtomWndObj, Clip);
+    UserSetProp(Window, AtomWndObj, Clip, TRUE);
     ++gcountPWO;
 
     TRACE("EngCreateWnd: SUCCESS: %p!\n", WndObjUser);
 
-    RETURN( WndObjUser);
-
-CLEANUP:
-
-    if (!calledFromUser) {
-        UserLeave();
-    }
-
-    END_CLEANUP;
+Exit:
+    UserLeave();
+    return WndObjUser;
 }
 
 
@@ -243,16 +222,12 @@ APIENTRY
 EngDeleteWnd(
     IN WNDOBJ *pwo)
 {
-    XCLIPOBJ* Clip = CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj);
+    EWNDOBJ* Clip = (EWNDOBJ *)pwo;//CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj);
     PWND Window;
-    BOOL calledFromUser;
 
     TRACE("EngDeleteWnd: pwo = 0x%p\n", pwo);
 
-    calledFromUser = UserIsEntered();
-    if (!calledFromUser) {
-        UserEnterExclusive();
-    }
+    UserEnterExclusive();
 
     /* Get window object */
     Window = UserGetWindowObject(Clip->Hwnd);
@@ -263,16 +238,14 @@ EngDeleteWnd(
     else
     {
         /* Remove object from window */
-        IntRemoveProp(Window, AtomWndObj);
+        UserRemoveProp(Window, AtomWndObj, TRUE);
     }
     --gcountPWO;
 
-    if (!calledFromUser) {
-        UserLeave();
-    }
+    UserLeave();
 
     /* Free resources */
-    IntEngFreeClipResources(Clip);
+    IntEngFreeClipResources((XCLIPOBJ*)Clip);
     EngFreeMem(Clip);
 }
 
@@ -318,7 +291,7 @@ WNDOBJ_vSetConsumer(
     IN WNDOBJ  *pwo,
     IN PVOID  pvConsumer)
 {
-    XCLIPOBJ* Clip = CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj);
+    EWNDOBJ* Clip = (EWNDOBJ *)pwo;//CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj);
     BOOL Hack;
 
     TRACE("WNDOBJ_vSetConsumer: pwo = 0x%p, pvConsumer = 0x%p\n", pwo, pvConsumer);