[ros-diffs] [jimtabor] 45051: [Win32k] - More movement to WND with updates to related files. Removed unused code rewritten others. Review patch.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Tue Jan 12 06:25:23 CET 2010


Author: jimtabor
Date: Tue Jan 12 06:25:22 2010
New Revision: 45051

URL: http://svn.reactos.org/svn/reactos?rev=45051&view=rev
Log:
[Win32k]
- More movement to WND with updates to related files. Removed unused code rewritten others. Review patch.

Modified:
    trunk/reactos/subsystems/win32/win32k/eng/engwindow.c
    trunk/reactos/subsystems/win32/win32k/include/dce.h
    trunk/reactos/subsystems/win32/win32k/include/engobjects.h
    trunk/reactos/subsystems/win32/win32k/include/window.h
    trunk/reactos/subsystems/win32/win32k/ntuser/caret.c
    trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
    trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c
    trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c
    trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c
    trunk/reactos/subsystems/win32/win32k/ntuser/timer.c
    trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
    trunk/reactos/subsystems/win32/win32k/ntuser/window.c
    trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c

Modified: trunk/reactos/subsystems/win32/win32k/eng/engwindow.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/eng/engwindow.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/eng/engwindow.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/eng/engwindow.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -16,26 +16,25 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-/* $Id$
- *
+/*
  * COPYRIGHT:         See COPYING in the top level directory
  * PROJECT:           ReactOS kernel
  * PURPOSE:           GDI WNDOBJ Functions
- * FILE:              subsys/win32k/eng/window.c
+ * FILE:              subsystems/win32/win32k/eng/engwindow.c
  * PROGRAMER:         Gregor Anich
  * REVISION HISTORY:
  *                 16/11/2004: Created
  */
 
 /* TODO: Check how the WNDOBJ implementation should behave with a driver on windows.
-
-   Simple! Use Prop's!
  */
 
 #include <w32k.h>
 
 #define NDEBUG
 #include <debug.h>
+
+INT gcountPWO = 0;
 
 /*
  * Calls the WNDOBJCHANGEPROC of the given WNDOBJ
@@ -153,44 +152,41 @@
   PWINDOW_OBJECT  Window,
   FLONG           flChanged)
 {
-  PLIST_ENTRY CurrentEntry;
   WNDGDI *Current;
+  HWND hWnd;
 
   ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL);
 
-  CurrentEntry = Window->WndObjListHead.Flink;
-  while (CurrentEntry != &Window->WndObjListHead)
-    {
-      Current = CONTAINING_RECORD(CurrentEntry, WNDGDI, ListEntry);
-
-      if (Current->WndObj.pvConsumer != NULL)
-        {
-          /* Update the WNDOBJ */
-          switch (flChanged)
-            {
-            case WOC_RGN_CLIENT:
-              /* Update the clipobj and client rect of the WNDOBJ */
-              IntEngWndUpdateClipObj(Current, Window);
-              break;
-
-            case WOC_DELETE:
-              /* FIXME: Should the WNDOBJs be deleted by win32k or by the driver? */
-              break;
-            }
-
-          /* Call the change proc */
-          IntEngWndCallChangeProc(&Current->WndObj, flChanged);
-
-          /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */
-          if (flChanged == WOC_RGN_CLIENT)
-            {
-              IntEngWndCallChangeProc(&Current->WndObj, WOC_CHANGED);
-            }
-
-          CurrentEntry = CurrentEntry->Flink;
-        }
-    }
-
+  hWnd = Window->hSelf; // pWnd->head.h;
+  Current = (WNDGDI *)IntGetProp(Window, AtomWndObj);
+
+  if ( gcountPWO &&
+       Current &&
+       Current->Hwnd == hWnd &&
+       Current->WndObj.pvConsumer != NULL )
+  {
+     /* Update the WNDOBJ */
+     switch (flChanged)
+     {
+        case WOC_RGN_CLIENT:
+        /* Update the clipobj and client rect of the WNDOBJ */
+           IntEngWndUpdateClipObj(Current, Window);
+           break;
+
+        case WOC_DELETE:
+        /* FIXME: Should the WNDOBJs be deleted by win32k or by the driver? */
+           break;
+     }
+
+     /* Call the change proc */
+     IntEngWndCallChangeProc(&Current->WndObj, flChanged);
+
+     /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */
+     if (flChanged == WOC_RGN_CLIENT)
+     {
+        IntEngWndCallChangeProc(&Current->WndObj, WOC_CHANGED);
+     }
+  }
 }
 
 /*
@@ -254,7 +250,8 @@
   WndObjInt->PixelFormat = iPixelFormat;
 
   /* associate object with window */
-  InsertTailList(&Window->WndObjListHead, &WndObjInt->ListEntry);
+  IntSetProp(Window, AtomWndObj, WndObjInt);
+  ++gcountPWO;
 
   DPRINT("EngCreateWnd: SUCCESS!\n");
 
@@ -292,15 +289,15 @@
   /* Get window object */
   Window = UserGetWindowObject(WndObjInt->Hwnd);
   if (Window == NULL)
-    {
-      DPRINT1("Warning: Couldnt get window object for WndObjInt->Hwnd!!!\n");
-      RemoveEntryList(&WndObjInt->ListEntry);
-    }
+  {
+     DPRINT1("Warning: Couldnt get window object for WndObjInt->Hwnd!!!\n");
+  }
   else
-    {
-      /* Remove object from window */
-      RemoveEntryList(&WndObjInt->ListEntry);
-    }
+  {
+    /* Remove object from window */
+    IntRemoveProp(Window, AtomWndObj);
+    --gcountPWO;
+  }
 
   if (!calledFromUser){
      UserLeave();

Modified: trunk/reactos/subsystems/win32/win32k/include/dce.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/dce.h?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/dce.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/dce.h [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -28,11 +28,16 @@
     LIST_ENTRY   List;
     HDC          hDC;
     HWND         hwndCurrent;
-    HWND         hwndDC;
-    HRGN         hClipRgn;
+    PWND         pwndOrg;
+    PWND         pwndClip;
+    PWND         pwndRedirect;
+    HRGN         hrgnClip;
+    HRGN         hrgnClipPublic;
+    HRGN         hrgnSavedVis;
     DWORD        DCXFlags;
-    PEPROCESS    pProcess;
-    HANDLE       Self;
+    PTHREADINFO  ptiOwner;
+    PPROCESSINFO ppiOwner;
+    struct _MONITOR* pMonitor;
 } DCE;  /* PDCE already declared at top of file */
 
 /* internal DCX flags, see psdk/winuser.h for the rest */
@@ -52,7 +57,6 @@
 BOOL FASTCALL DCE_InvalidateDCE(HWND, const PRECTL);
 HWND FASTCALL IntWindowFromDC(HDC hDc);
 PDCE FASTCALL DceFreeDCE(PDCE dce, BOOLEAN Force);
-void FASTCALL DceFreeWindowDCE(PWINDOW_OBJECT Window);
 void FASTCALL DceEmptyCache(void);
 VOID FASTCALL DceResetActiveDCEs(PWINDOW_OBJECT Window);
 void FASTCALL DceFreeClassDCE(HDC);

Modified: trunk/reactos/subsystems/win32/win32k/include/engobjects.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/engobjects.h?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/engobjects.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/engobjects.h [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -89,7 +89,6 @@
 
 typedef struct _WNDGDI {
   WNDOBJ            WndObj;
-  LIST_ENTRY        ListEntry;
   HWND              Hwnd;
   CLIPOBJ           *ClientClipObj;
   WNDOBJCHANGEPROC  ChangeProc;

Modified: trunk/reactos/subsystems/win32/win32k/include/window.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/window.h?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -14,6 +14,7 @@
 #include <include/scroll.h>
 
 extern ATOM AtomMessage;
+extern ATOM AtomWndObj; /* WNDOBJ list */
 
 BOOL FASTCALL UserUpdateUiState(PWND Wnd, WPARAM wParam);
 
@@ -29,8 +30,6 @@
   PTHREADINFO pti; // Use Wnd->head.pti
   /* system menu handle. */
   HMENU SystemMenu;
-  /* Entry in the thread's list of windows. */
-  LIST_ENTRY ListEntry;
   /* Handle for the window. */
   HWND hSelf; // Use Wnd->head.h
   /* Window flags. */
@@ -42,19 +41,16 @@
   struct _WINDOW_OBJECT* spwndChild;
   struct _WINDOW_OBJECT* spwndNext;
   struct _WINDOW_OBJECT* spwndPrev;
-  /* Entry in the list of thread windows. */
-  LIST_ENTRY ThreadListEntry;
   /* Handle to the parent window. */
   struct _WINDOW_OBJECT* spwndParent;
   /* Handle to the owner window. */
   HWND hOwner; // Use spwndOwner
-  /* DC Entries (DCE) */
-  PDCE Dce;
+
+
   /* Scrollbar info */
   PSBINFOEX pSBInfo; // convert to PSBINFO
-  PETHREAD OwnerThread; // Use Wnd->head.pti->pEThread
-  /* WNDOBJ list */
-  LIST_ENTRY WndObjListHead; // Use Props
+  /* Entry in the list of thread windows. */
+  LIST_ENTRY ThreadListEntry;
 } WINDOW_OBJECT; /* PWINDOW_OBJECT already declared at top of file */
 
 /* Window flags. */
@@ -86,16 +82,16 @@
 
 
 #define IntWndBelongsToThread(WndObj, W32Thread) \
-  (((WndObj->OwnerThread && WndObj->OwnerThread->Tcb.Win32Thread)) && \
-   (WndObj->OwnerThread->Tcb.Win32Thread == W32Thread))
+  (((WndObj->pti->pEThread && WndObj->pti->pEThread->Tcb.Win32Thread)) && \
+   (WndObj->pti->pEThread->Tcb.Win32Thread == W32Thread))
 //  ((WndObj->head.pti) && (WndObj->head.pti == W32Thread))
 
 #define IntGetWndThreadId(WndObj) \
-  WndObj->OwnerThread->Cid.UniqueThread
+  WndObj->pti->pEThread->Cid.UniqueThread
 //  WndObj->head.pti->pEThread->Cid.UniqueThread
 
 #define IntGetWndProcessId(WndObj) \
-  WndObj->OwnerThread->ThreadsProcess->UniqueProcessId
+  WndObj->pti->pEThread->ThreadsProcess->UniqueProcessId
 //  WndObj->head.pti->pEThread->ThreadsProcess->UniqueProcessId
 
 BOOL FASTCALL

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/caret.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/caret.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/caret.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/caret.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -245,7 +245,7 @@
 
    if (Window) ASSERT_REFS_CO(Window);
 
-   if(Window && Window->OwnerThread != PsGetCurrentThread())
+   if(Window && Window->pti->pEThread != PsGetCurrentThread())
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       return FALSE;
@@ -280,7 +280,7 @@
 
    if (Window) ASSERT_REFS_CO(Window);
 
-   if(Window && Window->OwnerThread != PsGetCurrentThread())
+   if(Window && Window->pti->pEThread != PsGetCurrentThread())
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       return FALSE;
@@ -332,7 +332,7 @@
       RETURN(FALSE);
    }
 
-   if(Window->OwnerThread != PsGetCurrentThread())
+   if(Window->pti->pEThread != PsGetCurrentThread())
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       RETURN(FALSE);

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/focus.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -217,7 +217,7 @@
    }
 
    if (0 == (Wnd->style & WS_VISIBLE) &&
-       Window->OwnerThread->ThreadsProcess != CsrProcess)
+       Window->pti->pEThread->ThreadsProcess != CsrProcess)
    {
       DPRINT("Failed - Invisible\n");
       return FALSE;
@@ -339,7 +339,7 @@
    {
       Wnd = Window->Wnd;
       if ((!(Wnd->style & WS_VISIBLE) &&
-           Window->OwnerThread->ThreadsProcess != CsrProcess) ||
+           Window->pti->pEThread->ThreadsProcess != CsrProcess) ||
           (Wnd->style & (WS_POPUP | WS_CHILD)) == WS_CHILD)
       {
          return ThreadQueue ? 0 : ThreadQueue->ActiveWindow;

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -16,8 +16,7 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-/* $Id$
- *
+/*
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
  * PURPOSE:          HotKey support
@@ -182,7 +181,7 @@
       {
          RETURN( FALSE);
       }
-      HotKeyThread = Window->OwnerThread;
+      HotKeyThread = Window->pti->pEThread;
    }
 
    /* Check for existing hotkey */

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -191,6 +191,14 @@
    Monitor->rcWork = Monitor->rcMonitor;
    Monitor->cWndStack = 0;
 
+   Monitor->hrgnMonitor= NtGdiCreateRectRgn( Monitor->rcMonitor.left,
+                                             Monitor->rcMonitor.top, 
+                                             Monitor->rcMonitor.right,
+                                             Monitor->rcMonitor.bottom );
+
+   // Replace with IntGdiSetRegeionOwner(Monitor->hrgnMonitor, GDI_OBJ_HMGR_PUBLIC);
+   GDIOBJ_SetOwnership(Monitor->hrgnMonitor, NULL);
+
    if (gMonitorList == NULL)
    {
       DPRINT("Primary monitor is beeing attached\n");

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -20,6 +20,7 @@
 
 ERESOURCE UserLock;
 ATOM AtomMessage; // Window Message atom.
+ATOM AtomWndObj;  // Window Object atom.
 BOOL gbInitialized;
 HINSTANCE hModClient = NULL;
 BOOL ClientPfnInit = FALSE;
@@ -44,6 +45,8 @@
 
   /* System Context Help Id Atom */
   gpsi->atomContextHelpIdProp = IntAddGlobalAtom(L"SysCH", TRUE);
+
+  AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
 
   return STATUS_SUCCESS;
 }

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/timer.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/timer.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -199,7 +199,7 @@
      if (!pTmr) return 0;
 
     if (Window && (Type & TMRF_TIFROMWND))
-       pTmr->pti = Window->OwnerThread->Tcb.Win32Thread;
+       pTmr->pti = Window->pti->pEThread->Tcb.Win32Thread;
     else
     {
        if (Type & TMRF_RIT)
@@ -253,7 +253,7 @@
                 UINT uElapse,
                 TIMERPROC lpTimerFunc) 
 {
-  if (Window && Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+  if (Window && Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
   {
      SetLastWin32Error(ERROR_ACCESS_DENIED);
      return 0;
@@ -419,7 +419,7 @@
          return 0;
       }
 
-      if (Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+      if (Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
       {
          DPRINT1("Trying to set timer for window in another process (shatter attack?)\n");
          SetLastWin32Error(ERROR_ACCESS_DENIED);

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/windc.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -89,8 +89,13 @@
   }
 
   pDce->hwndCurrent = (Window ? Window->hSelf : NULL);
-  pDce->hClipRgn = NULL;
-  pDce->pProcess = NULL;
+  pDce->pwndOrg  = Wnd;
+  pDce->pwndClip = Wnd;
+  pDce->hrgnClip = NULL;
+  pDce->hrgnClipPublic = NULL;
+  pDce->hrgnSavedVis = NULL;
+  pDce->ptiOwner = NULL;
+  pDce->ppiOwner = NULL;
 
   KeEnterCriticalRegion();
   if (FirstDce == NULL)
@@ -105,8 +110,9 @@
   DCU_SetDcUndeletable(pDce->hDC);
 
   if (Type == DCE_WINDOW_DC || Type == DCE_CLASS_DC) //Window DCE have ownership.
-  { // Process should already own it.
-    pDce->pProcess = PsGetCurrentProcess();
+  {
+    pDce->ptiOwner = GetW32ThreadInfo();
+    pDce->ppiOwner = pDce->ptiOwner->ppi;
   }
   else
   {
@@ -174,12 +180,12 @@
    {
       Dce->DCXFlags &= ~DCX_KEEPCLIPRGN;
    }
-   else if (Dce->hClipRgn != NULL)
-   {
-      GreDeleteObject(Dce->hClipRgn);
-   }
-
-   Dce->hClipRgn = NULL;
+   else if (Dce->hrgnClip != NULL)
+   {
+      GreDeleteObject(Dce->hrgnClip);
+   }
+
+   Dce->hrgnClip = NULL;
 
    /* make it dirty so that the vis rgn gets recomputed next time */
    Dce->DCXFlags |= DCX_DCEDIRTY;
@@ -225,7 +231,8 @@
      DPRINT("Exit!!!!! DCX_CACHE!!!!!!   hDC-> %x \n", dce->hDC);
      if (!IntGdiSetDCOwnerEx( dce->hDC, GDI_OBJ_HMGR_NONE, FALSE))
         return 0;
-     dce->pProcess = NULL;            // Reset ownership.
+     dce->ptiOwner = NULL; // Reset ownership.
+     dce->ppiOwner = NULL;
    }
    return 1; // Released!
 }
@@ -282,9 +289,9 @@
 noparent:
    if (Flags & DCX_INTERSECTRGN)
    {
-      if(Dce->hClipRgn != NULL)
-      {
-         NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hClipRgn, RGN_AND);
+      if(Dce->hrgnClip != NULL)
+      {
+         NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_AND);
       }
       else
       {
@@ -296,9 +303,9 @@
       }
    }
 
-   if (Flags & DCX_EXCLUDERGN && Dce->hClipRgn != NULL)
-   {
-      NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hClipRgn, RGN_DIFF);
+   if (Flags & DCX_EXCLUDERGN && Dce->hrgnClip != NULL)
+   {
+      NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_DIFF);
    }
 
    Dce->DCXFlags &= ~DCX_DCEDIRTY;
@@ -495,7 +502,7 @@
           DPRINT("Owned/Class DCE\n");
       /* we should free dce->clip_rgn here, but Windows apparently doesn't */
           Dce->DCXFlags &= ~(DCX_EXCLUDERGN | DCX_INTERSECTRGN);
-          Dce->hClipRgn = NULL;
+          Dce->hrgnClip = NULL;
       }
 
 #if 1 /* FIXME */
@@ -524,7 +531,7 @@
    }
 
 #if 0
-   if (NULL != Dce->hClipRgn)
+   if (NULL != Dce->hrgnClip)
    {
       DceDeleteClipRgn(Dce);
    }
@@ -543,17 +550,17 @@
    {
       if (!(Flags & DCX_WINDOW))
       {
-         Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcClient);
+         Dce->hrgnClip = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcClient);
       }
       else
       {
-         Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow);
+         Dce->hrgnClip = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow);
       }
       Dce->DCXFlags &= ~DCX_KEEPCLIPRGN;
    }
    else if (ClipRegion != NULL)
    {
-      Dce->hClipRgn = ClipRegion;
+      Dce->hrgnClip = ClipRegion;
    }
 
    DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin);
@@ -568,7 +575,8 @@
       DPRINT("ENTER!!!!!! DCX_CACHE!!!!!!   hDC-> %x\n", Dce->hDC);
       // Need to set ownership so Sync dcattr will work.
       IntGdiSetDCOwnerEx( Dce->hDC, GDI_OBJ_HMGR_POWNED, FALSE);
-      Dce->pProcess = PsGetCurrentProcess(); // Set the temp owning process
+      Dce->ptiOwner = GetW32ThreadInfo(); // Set the temp owning
+      Dce->ppiOwner = Dce->ptiOwner->ppi;
    }
    return(Dce->hDC);
 }
@@ -607,9 +615,9 @@
 
   if (!Hit) IntGdiDeleteDC(pdce->hDC, TRUE);
 
-  if (pdce->hClipRgn && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN))
-  {
-      GreDeleteObject(pdce->hClipRgn);
+  if (pdce->hrgnClip && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN))
+  {
+      GreDeleteObject(pdce->hrgnClip);
   }
 
   RemoveEntryList(&pdce->List);
@@ -624,73 +632,6 @@
   ExFreePoolWithTag(pdce, TAG_PDCE);
 
   return ret;
-}
-
-
-/***********************************************************************
- *           DceFreeWindowDCE
- *
- * Remove owned DCE and reset unreleased cache DCEs.
- */
-void FASTCALL
-DceFreeWindowDCE(PWINDOW_OBJECT Window)
-{
-  PDCE pDCE;
-
-  pDCE = FirstDce;
-  KeEnterCriticalRegion();
-  do
-  {
-      if (!pDCE) break;
-      if (pDCE->hwndCurrent == Window->hSelf)
-      {
-         if (!(pDCE->DCXFlags & DCX_CACHE)) /* owned or Class DCE*/
-         {
-            if (Window->Wnd->pcls->style & CS_CLASSDC ||
-                Window->Wnd->style & CS_CLASSDC) /* Test Class first */
-            {
-               if (pDCE->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) /* Class DCE*/
-                   DceDeleteClipRgn(pDCE);
-               // Update and reset Vis Rgn and clear the dirty bit.
-               // Should release VisRgn than reset it to default.
-               DceUpdateVisRgn(pDCE, Window, pDCE->DCXFlags);
-               pDCE->DCXFlags = DCX_DCEEMPTY;
-               pDCE->hwndCurrent = 0;
-            }
-            else if (Window->Wnd->pcls->style & CS_OWNDC ||
-                     Window->Wnd->style & CS_OWNDC) /* owned DCE*/
-            {
-               pDCE = DceFreeDCE(pDCE, FALSE);
-               if (!pDCE) break;
-               Window->Dce = NULL;
-               continue;
-            }
-            else
-            {
-               ASSERT(FALSE);
-            }
-         }
-         else
-         {
-            if (pDCE->DCXFlags & DCX_DCEBUSY) /* shared cache DCE */
-            {
-               /* FIXME: AFAICS we are doing the right thing here so
-                * this should be a DPRINT. But this is best left as an ERR
-                * because the 'application error' is likely to come from
-                * another part of Wine (i.e. it's our fault after all).
-                * We should change this to DPRINT when ReactOS is more stable
-                * (for 1.0?).
-                */
-               DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf);
-               DceReleaseDC(pDCE, FALSE);
-            }
-            pDCE->DCXFlags |= DCX_DCEEMPTY;
-            pDCE->hwndCurrent = 0;
-         }
-      }
-      pDCE = (PDCE) pDCE->List.Flink;
-  } while (pDCE != FirstDce);
-  KeLeaveCriticalRegion();
 }
 
 void FASTCALL
@@ -789,9 +730,9 @@
                NtGdiOffsetRgn(dc->rosdc.hClipRgn, DeltaX, DeltaY);
                CLIPPING_UpdateGCRegion(dc);
             }
-            if (NULL != pDCE->hClipRgn)
+            if (NULL != pDCE->hrgnClip)
             {
-               NtGdiOffsetRgn(pDCE->hClipRgn, DeltaX, DeltaY);
+               NtGdiOffsetRgn(pDCE->hrgnClip, DeltaX, DeltaY);
             }
          }
          DC_UnlockDc(dc);
@@ -869,29 +810,20 @@
 HWND FASTCALL
 UserGethWnd( HDC hdc, PWNDOBJ *pwndo)
 {
-  PWNDGDI pWndgdi = NULL;
-  PWINDOW_OBJECT Wnd = NULL;
+  PWNDGDI pWndgdi;
+  PWINDOW_OBJECT Wnd;
   HWND hWnd;
-  BOOL Hit = FALSE;
-  PLIST_ENTRY Entry;
+
   hWnd = IntWindowFromDC(hdc);
 
   if (hWnd && !(Wnd = UserGetWindowObject(hWnd)))
   {
-     KeEnterCriticalRegion();
-     Entry = Wnd->WndObjListHead.Flink;
-     while (Entry != &Wnd->WndObjListHead)
+     pWndgdi = (WNDGDI *)IntGetProp(Wnd, AtomWndObj);
+
+     if ( pWndgdi && pWndgdi->Hwnd == hWnd )
      {
-        pWndgdi = (PWNDGDI)Entry;
-        if (pWndgdi->Hwnd == hWnd)
-        {
-           Hit = TRUE;
-           break;
-        }
-        Entry = Entry->Flink;
+        if (pwndo) *pwndo = (PWNDOBJ)pWndgdi;
      }
-     if (pwndo && Hit) *pwndo = (PWNDOBJ)pWndgdi;
-     KeLeaveCriticalRegion();
   }
   return hWnd;
 }

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/window.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -478,7 +478,6 @@
       Window->SystemMenu = (HMENU)0;
    }
 
-   DceFreeWindowDCE(Window);    /* Always do this to catch orphaned DCs */
 #if 0 /* FIXME */
 
    WINPROC_FreeProc(Window->winproc, WIN_PROC_WINDOW);
@@ -1150,7 +1149,7 @@
 //      return NULL;
 
    /* Window must belong to current process */
-   if (Wnd->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+   if (Wnd->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
       return NULL;
 
    WndOldParent = Wnd->spwndParent;
@@ -1948,7 +1947,6 @@
       }
    }
 
-   Window->OwnerThread = PsGetCurrentThread();
    Window->spwndChild = NULL;
    Window->spwndPrev = NULL;
    Window->spwndNext = NULL;
@@ -1960,7 +1958,6 @@
    Wnd->cbwndExtra = Wnd->pcls->cbwndExtra;
 
    InitializeListHead(&Wnd->PropListHead);
-   InitializeListHead(&Window->WndObjListHead);
 
    if ( NULL != WindowName->Buffer && WindowName->Length > 0 )
    {
@@ -2052,11 +2049,16 @@
    InsertTailList (&pti->WindowListHead, &Window->ThreadListEntry);
 
    /*  Handle "CS_CLASSDC", it is tested first. */
-   if ((Wnd->pcls->style & CS_CLASSDC) && !(Wnd->pcls->pdce)) // One DCE per class to have CLASS.
-      Wnd->pcls->pdce = DceAllocDCE(Window, DCE_CLASS_DC);
-   /* Allocate a DCE for this window. */
+   if ( (Wnd->pcls->style & CS_CLASSDC) && !(Wnd->pcls->pdce) )
+   {  /* One DCE per class to have CLASS. */
+      Wnd->pcls->pdce = DceAllocDCE( Window, DCE_CLASS_DC );
+   }
    else if ( Wnd->pcls->style & CS_OWNDC)
-      Window->Dce = DceAllocDCE(Window, DCE_WINDOW_DC);
+   {  /* Allocate a DCE for this window. */
+      PDCE pDce = DceAllocDCE(Window, DCE_WINDOW_DC);
+      if (!Wnd->pcls->pdce)
+         Wnd->pcls->pdce = pDce;
+   }
 
    Pos.x = x;
    Pos.y = y;
@@ -2107,7 +2109,7 @@
       PRTL_USER_PROCESS_PARAMETERS ProcessParams;
       BOOL CalculatedDefPosSize = FALSE;
 
-      IntGetDesktopWorkArea(((PTHREADINFO)Window->OwnerThread->Tcb.Win32Thread)->Desktop, &WorkArea);
+      IntGetDesktopWorkArea(((PTHREADINFO)Window->pti->pEThread->Tcb.Win32Thread)->Desktop, &WorkArea);
 
       rc = WorkArea;
       ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters;
@@ -2624,7 +2626,7 @@
    DPRINT("co_UserDestroyWindow \n");
 
    /* Check for owner thread */
-   if ( (Window->OwnerThread != PsGetCurrentThread()) ||
+   if ( (Window->pti->pEThread != PsGetCurrentThread()) ||
         Wnd->head.pti != PsGetCurrentThreadWin32Thread() )
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
@@ -3765,7 +3767,7 @@
     * WndProc is only available to the owner process
     */
    if (GWL_WNDPROC == Index
-         && Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+         && Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       return 0;
@@ -3886,7 +3888,7 @@
             /*
              * Remove extended window style bit WS_EX_TOPMOST for shell windows.
              */
-            WindowStation = ((PTHREADINFO)Window->OwnerThread->Tcb.Win32Thread)->Desktop->WindowStation;
+            WindowStation = Window->pti->Desktop->WindowStation;
             if(WindowStation)
             {
                if (hWnd == WindowStation->ShellWindow || hWnd == WindowStation->ShellListView)

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -16,8 +16,7 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-/* $Id$
- *
+/*
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
  * PURPOSE:          Windows
@@ -120,7 +119,7 @@
 	if (!Wnd->Wnd) return FALSE;
     style = Wnd->Wnd->style;
     if (!(style & WS_VISIBLE) &&
-        Wnd->OwnerThread->ThreadsProcess != CsrProcess) return FALSE;
+        Wnd->pti->pEThread->ThreadsProcess != CsrProcess) return FALSE;
     if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
     return !(style & WS_DISABLED);
 }
@@ -905,7 +904,7 @@
     * Only allow CSRSS to mess with the desktop window
     */
    if (Window->hSelf == IntGetDesktopWindow() &&
-         Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+         Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
    {
       return FALSE;
    }




More information about the Ros-diffs mailing list