[ros-diffs] [jimtabor] 33765: Modified GDIOBJ_Copy and Set owner to return bool. Start the use of server info for metrics data. Tested with Qemu on Linux.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Fri May 30 06:56:11 CEST 2008


Author: jimtabor
Date: Thu May 29 23:56:10 2008
New Revision: 33765

URL: http://svn.reactos.org/svn/reactos?rev=33765&view=rev
Log:
Modified GDIOBJ_Copy and Set owner to return bool. Start the use of server info for metrics data. Tested with Qemu on Linux.

Modified:
    trunk/reactos/include/reactos/win32k/ntuser.h
    trunk/reactos/subsystems/win32/win32k/include/dc.h
    trunk/reactos/subsystems/win32/win32k/include/gdiobj.h
    trunk/reactos/subsystems/win32/win32k/ntuser/metric.c
    trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c
    trunk/reactos/subsystems/win32/win32k/objects/dc.c
    trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c
    trunk/reactos/subsystems/win32/win32k/objects/stockobj.c

Modified: trunk/reactos/include/reactos/win32k/ntuser.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntuser.h?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] Thu May 29 23:56:10 2008
@@ -169,10 +169,12 @@
     UINT HideAccel : 1;
 } WINDOW, *PWINDOW;
 
+#define SRVINFO_METRICS 0x0020
+
 typedef struct _SERVERINFO
 {
-//  DWORD    SystemMetrics[SM_CMETRICS];       // System Metrics
-//  COLORREF SystemColorCopy[COLOR_MENUBAR+1]; // Backup Copy of system colors.
+  DWORD    SRVINFO_Flags;
+  DWORD    SystemMetrics[SM_CMETRICS];       // System Metrics
   COLORREF SysColors[COLOR_MENUBAR+1];       // GetSysColor
   HBRUSH   SysColorBrushes[COLOR_MENUBAR+1]; // GetSysColorBrush
   HPEN     SysColorPens[COLOR_MENUBAR+1];    // ReactOS exclusive

Modified: trunk/reactos/subsystems/win32/win32k/include/dc.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/dc.h?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/dc.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/dc.h [iso-8859-1] Thu May 29 23:56:10 2008
@@ -277,7 +277,7 @@
 BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
 HDC  FASTCALL DC_GetNextDC (PDC pDC);
 VOID FASTCALL DC_SetNextDC (PDC pDC, HDC hNextDC);
-VOID FASTCALL DC_SetOwnership(HDC DC, PEPROCESS Owner);
+BOOL FASTCALL DC_SetOwnership(HDC DC, PEPROCESS Owner);
 VOID FASTCALL DC_LockDisplay(HDC);
 VOID FASTCALL DC_UnlockDisplay(HDC);
 VOID FASTCALL IntGdiCopyFromSaveState(PDC, PDC, HDC);

Modified: trunk/reactos/subsystems/win32/win32k/include/gdiobj.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/gdiobj.h?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/gdiobj.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/gdiobj.h [iso-8859-1] Thu May 29 23:56:10 2008
@@ -58,8 +58,8 @@
 };
 
 BOOL    INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle);
-VOID    INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
-VOID    INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
+BOOL    INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
+BOOL    INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
 BOOL    INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
 VOID    INTERNAL_CALL GDIOBJ_UnlockObjByPtr(POBJ Object);
 VOID    INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
@@ -82,6 +82,6 @@
 
 BOOL FASTCALL  NtGdiDeleteObject(HGDIOBJ hObject);
 BOOL FASTCALL  IsObjectDead(HGDIOBJ);
-BOOL FASTCALL  IntGdiSetDCOwnerEx( HGDIOBJ, DWORD, BOOL);
+BOOL FASTCALL  IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
 
 #endif

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/metric.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/metric.c?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/metric.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/metric.c [iso-8859-1] Thu May 29 23:56:10 2008
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id$
+/*
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -34,9 +34,243 @@
 #define NDEBUG
 #include <debug.h>
 
+extern PSERVERINFO gpsi;
+
+static BOOL Setup = FALSE;
+
 /* FUNCTIONS *****************************************************************/
 
-/* FIXME:  Alot of thse values should NOT be hardcoded but they are */
+BOOL
+FASTCALL
+InitMetrics(VOID)
+{
+  INT Index;
+  NTSTATUS Status;
+  PWINSTATION_OBJECT WinStaObject;
+  ULONG Width = 640, Height = 480;
+
+  for (Index = 0; Index < SM_CMETRICS; Index++)
+  {
+      switch (Index)
+      {
+       case SM_CXSCREEN:
+         {
+            HDC ScreenDCHandle;
+            PDC ScreenDC;
+
+            ScreenDCHandle = IntGdiCreateDC(NULL, NULL, NULL, NULL, TRUE);
+            if (NULL != ScreenDCHandle)
+            {
+               ScreenDC = DC_LockDc(ScreenDCHandle);
+               if (NULL != ScreenDC)
+               {
+                  Width = ((PGDIDEVICE)ScreenDC->pPDev)->GDIInfo.ulHorzRes;
+                  Height = ((PGDIDEVICE)ScreenDC->pPDev)->GDIInfo.ulVertRes;
+                  DC_UnlockDc(ScreenDC);
+               }
+               NtGdiDeleteObjectApp(ScreenDCHandle);
+            }
+            gpsi->SystemMetrics[Index] = Width;
+            break;
+         }
+       case SM_CYSCREEN:
+          gpsi->SystemMetrics[Index] = Height;
+          break;
+       case SM_ARRANGE:
+          gpsi->SystemMetrics[Index] = 8;
+          break;
+       case SM_CLEANBOOT:
+          gpsi->SystemMetrics[Index] = 0;
+          break;
+       case SM_CMOUSEBUTTONS:
+          gpsi->SystemMetrics[Index] = 2;
+          break;
+       case SM_CXBORDER:
+       case SM_CYBORDER:
+          gpsi->SystemMetrics[Index] = 1;
+          break;
+       case SM_CXCURSOR:
+       case SM_CYCURSOR:
+          gpsi->SystemMetrics[Index] = 32;
+          break;
+       case SM_CXDLGFRAME:
+       case SM_CYDLGFRAME:
+          gpsi->SystemMetrics[Index] = 3;
+          break;
+       case SM_CXDOUBLECLK:
+       case SM_CYDOUBLECLK:
+       case SM_SWAPBUTTON:
+         {
+            PSYSTEM_CURSORINFO CurInfo;
+            Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
+                                                    KernelMode,
+                                                    0,
+                                                    &WinStaObject);
+            if (!NT_SUCCESS(Status))
+               gpsi->SystemMetrics[Index] = 0xFFFFFFFF;
+               break;
+
+            CurInfo = IntGetSysCursorInfo(WinStaObject);
+            switch(Index)
+            {
+               case SM_CXDOUBLECLK:
+                  gpsi->SystemMetrics[Index] = CurInfo->DblClickWidth;
+                  break;
+               case SM_CYDOUBLECLK:
+                  gpsi->SystemMetrics[Index] = CurInfo->DblClickWidth;
+                  break;
+               case SM_SWAPBUTTON:
+                  gpsi->SystemMetrics[Index] = CurInfo->SwapButtons;
+                  break;
+            }
+
+            ObDereferenceObject(WinStaObject);
+            break;
+          }
+       case SM_CXDRAG:
+       case SM_CYDRAG:
+          gpsi->SystemMetrics[Index] = 2;
+          break;
+       case SM_CXEDGE:
+       case SM_CYEDGE:
+          gpsi->SystemMetrics[Index] = 2;
+          break;
+       case SM_CXFRAME:
+       case SM_CYFRAME:
+          gpsi->SystemMetrics[Index] = 4;
+          break;
+       case SM_CXFULLSCREEN:
+          /* FIXME: shouldn't we take borders etc into account??? */
+          gpsi->SystemMetrics[Index] = gpsi->SystemMetrics[SM_CXSCREEN];
+          break;
+       case SM_CYFULLSCREEN:
+          gpsi->SystemMetrics[Index] = gpsi->SystemMetrics[SM_CYSCREEN];
+          break;
+       case SM_CXHSCROLL:
+       case SM_CYHSCROLL:
+          gpsi->SystemMetrics[Index] = 16;
+          break;
+       case SM_CYVTHUMB:
+       case SM_CXHTHUMB:
+          gpsi->SystemMetrics[Index] = 16;
+          break;
+        case SM_CXICON:
+        case SM_CYICON:
+          gpsi->SystemMetrics[Index] = 32;
+          break;
+       case SM_CXICONSPACING:
+       case SM_CYICONSPACING:
+          gpsi->SystemMetrics[Index] = 64;
+          break;
+       case SM_CXMAXIMIZED:
+     /* This seems to be 8 pixels greater than the screen width */
+          gpsi->SystemMetrics[Index] = gpsi->SystemMetrics[SM_CXSCREEN] + 8;
+          break;
+       case SM_CYMAXIMIZED:
+     /* This seems to be 20 pixels less than the screen height, taskbar maybe? */
+          gpsi->SystemMetrics[Index] = gpsi->SystemMetrics[SM_CYSCREEN] - 20;
+          break;
+       case SM_CXMAXTRACK:
+          gpsi->SystemMetrics[Index] = gpsi->SystemMetrics[SM_CYSCREEN] + 12;
+          break;
+       case SM_CYMAXTRACK:
+          gpsi->SystemMetrics[Index] = gpsi->SystemMetrics[SM_CYSCREEN] + 12;
+          break;
+       case SM_CXMENUCHECK:
+       case SM_CYMENUCHECK:
+          gpsi->SystemMetrics[Index] = 13;
+          break;
+       case SM_CXMENUSIZE:
+       case SM_CYMENUSIZE:
+          gpsi->SystemMetrics[Index] = 18;
+          break;
+       case SM_CXMIN:
+          gpsi->SystemMetrics[Index] = 112;
+          break;
+       case SM_CYMIN:
+          gpsi->SystemMetrics[Index] = 27;
+          break;
+       case SM_CXMINIMIZED:
+          gpsi->SystemMetrics[Index] = 160;
+          break;
+       case SM_CYMINIMIZED:
+          gpsi->SystemMetrics[Index] = 24;
+          break;
+       case SM_CXMINSPACING:
+          gpsi->SystemMetrics[Index] = 160;
+          break;
+       case SM_CYMINSPACING:
+          gpsi->SystemMetrics[Index] = 24;
+          break;
+       case SM_CXMINTRACK:
+          gpsi->SystemMetrics[Index] = 112;
+          break;
+       case SM_CYMINTRACK:
+          gpsi->SystemMetrics[Index] = 27;
+          break;
+       case SM_CXSIZE:
+       case SM_CYSIZE:
+          gpsi->SystemMetrics[Index] = 18;
+          break;
+       case SM_CXSMICON:
+       case SM_CYSMICON:
+          gpsi->SystemMetrics[Index] = 16;
+          break;
+       case SM_CXSMSIZE:
+          gpsi->SystemMetrics[Index] = 12;
+          break;
+       case SM_CYSMSIZE:
+          gpsi->SystemMetrics[Index] = 14;
+          break;
+       case SM_CXVSCROLL:
+       case SM_CYVSCROLL:
+          gpsi->SystemMetrics[Index] = 16;
+          break;
+       case SM_CYCAPTION:
+          gpsi->SystemMetrics[Index] = 19;
+          break;
+       case SM_CYKANJIWINDOW:
+          gpsi->SystemMetrics[Index] = 0;
+          break;
+       case SM_CYMENU:
+          gpsi->SystemMetrics[Index] = 19;
+          break;
+       case SM_CYSMCAPTION:
+          gpsi->SystemMetrics[Index] = 15;
+          break;
+       case SM_DBCSENABLED:
+       case SM_DEBUG:
+       case SM_MENUDROPALIGNMENT:
+       case SM_MIDEASTENABLED:
+          gpsi->SystemMetrics[Index] = 0;
+          break;
+       case SM_MOUSEPRESENT:
+          gpsi->SystemMetrics[Index] = 1;
+          break;
+       case SM_NETWORK:
+          gpsi->SystemMetrics[Index] = 3;
+          break;
+       case SM_PENWINDOWS:
+       case SM_SECURE:
+       case SM_SHOWSOUNDS:
+       case SM_SLOWMACHINE:
+          gpsi->SystemMetrics[Index] = 0;
+          break;
+       case SM_CMONITORS:
+          gpsi->SystemMetrics[Index] = 1;
+          break;
+       case SM_REMOTESESSION:
+          gpsi->SystemMetrics[Index] = 0;
+          break;
+       default:
+          gpsi->SystemMetrics[Index] = 0xFFFFFFFF;
+      }
+  }
+  gpsi->SRVINFO_Flags |= SRVINFO_METRICS;
+  Setup = TRUE;
+  return TRUE;
+}
+
 ULONG FASTCALL
 UserGetSystemMetrics(ULONG Index)
 {
@@ -44,6 +278,11 @@
    PWINSTATION_OBJECT WinStaObject;
    ULONG Width, Height, Result;
 
+//  DPRINT1("UserGetSystemMetrics -> %d\n",Index);
+  if (gpsi && Setup)
+     return gpsi->SystemMetrics[Index];
+  else
+  {
    Result = 0;
    switch (Index)
    {
@@ -176,6 +415,7 @@
             return SM_CXSCREEN == Index ? Width : Height;
          }
       case SM_CXSIZE:
+         InitMetrics();
       case SM_CYSIZE:
          return(18);
       case SM_CXSMICON:
@@ -218,11 +458,9 @@
       default:
          return(0xFFFFFFFF);
    }
+  }
 }
 
-
-
-/* FIXME:  Alot of thse values should NOT be hardcoded but they are */
 ULONG STDCALL
 NtUserGetSystemMetrics(ULONG Index)
 {
@@ -238,4 +476,6 @@
    UserLeave();
    END_CLEANUP;
 }
+
+
 /* EOF */

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] Thu May 29 23:56:10 2008
@@ -290,6 +290,8 @@
    return NT_SUCCESS(Status);
 }
 
+extern HDC hSystemBM;
+
 BOOL FASTCALL
 co_IntInitializeDesktopGraphics(VOID)
 {
@@ -304,11 +306,15 @@
       IntDestroyPrimarySurface();
       return FALSE;
    }
-   DC_FreeDcAttr(ScreenDeviceContext);         // Free the dcattr!
-   DC_SetOwnership(ScreenDeviceContext, NULL); // This hDC is inaccessible!
+   IntGdiSetDCOwnerEx(ScreenDeviceContext, GDI_OBJ_HMGR_PUBLIC, FALSE);
 
    /* Setup the cursor */
    co_IntLoadDefaultCursors();
+
+   hSystemBM = NtGdiCreateCompatibleDC(ScreenDeviceContext);
+
+   NtGdiSelectFont( hSystemBM, NtGdiGetStockObject(SYSTEM_FONT));
+   IntGdiSetDCOwnerEx( hSystemBM, GDI_OBJ_HMGR_PUBLIC, FALSE);
 
    return TRUE;
 }

Modified: trunk/reactos/subsystems/win32/win32k/objects/dc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/dc.c?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] Thu May 29 23:56:10 2008
@@ -2642,29 +2642,31 @@
   return  TRUE;
 }
 
-VOID FASTCALL
+BOOL
+FASTCALL
 DC_SetOwnership(HDC hDC, PEPROCESS Owner)
 {
     PDC pDC;
 
-    GDIOBJ_SetOwnership(hDC, Owner);
+    if(!GDIOBJ_SetOwnership(hDC, Owner)) return FALSE;
     pDC = DC_LockDc(hDC);
     if (pDC)
     {
         if (pDC->w.hClipRgn)
         {
-            GDIOBJ_SetOwnership(pDC->w.hClipRgn, Owner);
+            if(!GDIOBJ_SetOwnership(pDC->w.hClipRgn, Owner)) return FALSE;
         }
         if (pDC->w.hVisRgn)
         {
-            GDIOBJ_SetOwnership(pDC->w.hVisRgn, Owner);
+           if(!GDIOBJ_SetOwnership(pDC->w.hVisRgn, Owner)) return FALSE;
         }
         if (pDC->w.hGCClipRgn)
         {
-            GDIOBJ_SetOwnership(pDC->w.hGCClipRgn, Owner);
+            if(!GDIOBJ_SetOwnership(pDC->w.hGCClipRgn, Owner)) return FALSE;
         }
         DC_UnlockDc(pDC);
     }
+    return TRUE;
 }
 
 //

Modified: trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c [iso-8859-1] Thu May 29 23:56:10 2008
@@ -1151,12 +1151,13 @@
     return FALSE;
 }
 
-void INTERNAL_CALL
+BOOL INTERNAL_CALL
 GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS NewOwner)
 {
     PGDI_TABLE_ENTRY Entry;
     HANDLE ProcessId, LockedProcessId, PrevProcId;
     PW32THREAD Thread;
+    BOOL Ret = TRUE;
 
     GDIDBG_INITLOOPTRACE();
 
@@ -1223,7 +1224,7 @@
                     (void)_InterlockedExchangePointer((PVOID*)&Entry->ProcessId, ProcessId);
 
                     /* we're done! */
-                    return;
+                    return Ret;
                 }
                 else
                 {
@@ -1245,6 +1246,7 @@
             {
                 DPRINT1("Attempted to change ownership of an object 0x%x currently being destroyed!!!\n", ObjectHandle);
                 DPRINT1("Entry->Type = 0x%lx, Entry->KernelData = 0x%p\n", Entry->Type, Entry->KernelData);
+                Ret = FALSE;
             }
         }
         else if (PrevProcId == LockedProcessId)
@@ -1267,20 +1269,24 @@
         else if ((HANDLE)((ULONG_PTR)PrevProcId & ~0x1) != PsGetCurrentProcessId())
         {
             DPRINT1("Attempted to change ownership of object 0x%x (pid: 0x%x) from pid 0x%x!!!\n", ObjectHandle, (ULONG_PTR)PrevProcId & ~0x1, PsGetCurrentProcessId());
+            Ret = FALSE;
         }
         else
         {
             DPRINT1("Attempted to change owner of invalid handle: 0x%x\n", ObjectHandle);
-        }
-    }
-}
-
-void INTERNAL_CALL
+            Ret = FALSE;
+        }
+    }
+    return Ret;
+}
+
+BOOL INTERNAL_CALL
 GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo)
 {
     PGDI_TABLE_ENTRY FromEntry;
     PW32THREAD Thread;
     HANDLE FromProcessId, FromLockedProcessId, FromPrevProcId;
+    BOOL Ret = TRUE;
 
     GDIDBG_INITLOOPTRACE();
 
@@ -1351,6 +1357,7 @@
             else
             {
                 DPRINT1("Attempted to copy ownership from an object 0x%x currently being destroyed!!!\n", CopyFrom);
+                Ret = FALSE;
             }
         }
         else if (FromPrevProcId == FromLockedProcessId)
@@ -1374,8 +1381,10 @@
         else
         {
             DPRINT1("Attempted to copy ownership from invalid handle: 0x%x\n", CopyFrom);
-        }
-    }
+            Ret = FALSE;
+        }
+    }
+    return Ret;
 }
 
 PVOID INTERNAL_CALL
@@ -1410,6 +1419,60 @@
 
 /** PUBLIC FUNCTIONS **********************************************************/
 
+BOOL
+FASTCALL
+IntGdiSetBrushOwner(PGDIBRUSHOBJ pbr, DWORD OwnerMask)
+{
+  // Inc/Dec share locks and process counts.
+  return TRUE;
+}
+
+
+BOOL
+FASTCALL
+IntGdiSetDCOwnerEx( HDC hDC, DWORD OwnerMask, BOOL NoSetBrush)
+{
+  PDC pDC;
+  BOOL Ret = FALSE;
+
+  if (!hDC || (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)) return FALSE;
+
+  if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE)
+  {
+     pDC = DC_LockDc ( hDC );
+     MmCopyFromCaller(&pDC->Dc_Attr, pDC->pDc_Attr, sizeof(DC_ATTR));
+     DC_UnlockDc( pDC );
+
+     DC_FreeDcAttr( hDC );         // Free the dcattr!
+
+     if (!DC_SetOwnership( hDC, NULL )) // This hDC is inaccessible!
+        return Ret;
+  }
+
+  if (OwnerMask == GDI_OBJ_HMGR_POWNED)
+  {
+     pDC = DC_LockDc ( hDC );
+     if ( !pDC->pDc_Attr ) Ret = TRUE; // Must be zero.
+     DC_UnlockDc( pDC );
+     if (!Ret) return Ret;
+
+     if (!DC_SetOwnership( hDC, PsGetCurrentProcess() )) return Ret;
+
+     DC_AllocateDcAttr( hDC );      // Allocate new dcattr
+
+     DCU_SynchDcAttrtoUser( hDC );  // Copy data from dc to dcattr
+  }
+
+  if ((OwnerMask != GDI_OBJ_HMGR_NONE) && !NoSetBrush)
+  {
+     pDC = DC_LockDc ( hDC );
+     if (IntGdiSetBrushOwner((PGDIBRUSHOBJ)pDC->DcLevel.pbrFill, OwnerMask))
+         IntGdiSetBrushOwner((PGDIBRUSHOBJ)pDC->DcLevel.pbrLine, OwnerMask);
+     DC_UnlockDc( pDC );
+  }
+  return TRUE;
+}
+
 W32KAPI
 HANDLE
 APIENTRY
@@ -1417,11 +1480,6 @@
     IN ULONG ulType
 )
 {
-// ATM we use DC object for KernelData. This is wrong.
-// The real type consists of BASEOBJECT and a pointer.
-// The UserData is set in user mode, so it is always NULL.
-// HANDLE should be HGDIOBJ
-//
     POBJ pObject;
     HANDLE handle;
 
@@ -1521,13 +1579,6 @@
 }
 
 
-BOOL
-FASTCALL
-IntGdiSetDCOwnerEx( HGDIOBJ hObject, DWORD OwnerMask, BOOL NoSetBrush)
-{
-   UNIMPLEMENTED;
-   return FALSE;
-}
 
 W32KAPI
 INT

Modified: trunk/reactos/subsystems/win32/win32k/objects/stockobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/stockobj.c?rev=33765&r1=33764&r2=33765&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/stockobj.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/stockobj.c [iso-8859-1] Thu May 29 23:56:10 2008
@@ -19,7 +19,6 @@
 /*
  * STOCKOBJ.C - GDI Stock Objects
  *
- * $Id$
  *
  */
 
@@ -66,11 +65,8 @@
 };
 #define NUM_SYSCOLORS (sizeof(SysColors) / sizeof(SysColors[0]))
 
-//static HPEN SysColorPens[NUM_SYSCOLORS];
-//static HBRUSH SysColorBrushes[NUM_SYSCOLORS];
-
-// System Bitmap DC and System Display DC...
-HDC hSystemBM, hSystemDisplayDC;
+// System Bitmap DC
+HDC hSystemBM;
 
 /*  GDI stock objects */
 



More information about the Ros-diffs mailing list