[Win32k]
authorJames Tabor <james.tabor@reactos.org>
Thu, 21 Jan 2010 01:39:19 +0000 (01:39 +0000)
committerJames Tabor <james.tabor@reactos.org>
Thu, 21 Jan 2010 01:39:19 +0000 (01:39 +0000)
- Implement IntGdiSetBrushOwner for bug 5124.

svn path=/trunk/; revision=45170

reactos/subsystems/win32/win32k/include/brush.h
reactos/subsystems/win32/win32k/include/gdiobj.h
reactos/subsystems/win32/win32k/ntuser/monitor.c
reactos/subsystems/win32/win32k/objects/gdiobj.c

index db7c5fb..2c114d0 100644 (file)
@@ -132,4 +132,6 @@ PVOID FASTCALL AllocateObjectAttr(VOID);
 
 VOID FASTCALL FreeObjectAttr(PVOID);
 
+BOOL FASTCALL IntGdiSetBrushOwner(PBRUSH,DWORD);
+
 #endif
index f54e87a..654849d 100644 (file)
@@ -82,9 +82,10 @@ PVOID   INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCES
 #define GDIOBJFLAG_IGNOREPID   (0x1)
 #define GDIOBJFLAG_IGNORELOCK  (0x2)
 
-BOOL FASTCALL  GreDeleteObject(HGDIOBJ hObject);
-BOOL FASTCALL  IsObjectDead(HGDIOBJ);
-BOOL FASTCALL  IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
+BOOL FASTCALL GreDeleteObject(HGDIOBJ hObject);
+BOOL FASTCALL IsObjectDead(HGDIOBJ);
+BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
+BOOL FASTCALL IntGdiSetRegeionOwner(HRGN,DWORD);
 
 /*!
  * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked. 
index 39e0859..1b077dd 100644 (file)
@@ -195,8 +195,7 @@ IntAttachMonitor(IN PDEVOBJ *pGdiDevice,
                                              Monitor->rcMonitor.right,
                                              Monitor->rcMonitor.bottom );
 
-   // Replace with IntGdiSetRegeionOwner(Monitor->hrgnMonitor, GDI_OBJ_HMGR_PUBLIC);
-   GDIOBJ_SetOwnership(Monitor->hrgnMonitor, NULL);
+   IntGdiSetRegeionOwner(Monitor->hrgnMonitor, GDI_OBJ_HMGR_PUBLIC);
 
    if (gMonitorList == NULL)
    {
index fca67fa..42edcff 100644 (file)
@@ -1560,6 +1560,36 @@ GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process)
 
 /** PUBLIC FUNCTIONS **********************************************************/
 
+BOOL
+FASTCALL
+IntGdiSetRegeionOwner(HRGN hRgn, DWORD OwnerMask)
+{
+  INT Index;
+  PGDI_TABLE_ENTRY Entry;
+/*
+  System Regions:
+     These regions do not use attribute sections and when allocated, use gdiobj
+     level functions.
+ */
+  // FIXME! HAX!!! Remove this once we get everything right!
+  KeEnterCriticalRegion();
+  Index = GDI_HANDLE_GET_INDEX(hRgn);
+  Entry = &GdiHandleTable->Entries[Index];
+  if (Entry->UserData) FreeObjectAttr(Entry->UserData);
+  Entry->UserData = NULL;
+  KeLeaveCriticalRegion();
+  //
+  if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE)
+  {
+     return GDIOBJ_SetOwnership(hRgn, NULL);
+  }
+  if (OwnerMask == GDI_OBJ_HMGR_POWNED)
+  {
+     return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() );
+  }
+  return FALSE;
+}
+
 BOOL
 FASTCALL
 IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask)
@@ -1609,7 +1639,6 @@ IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask)
   return TRUE;
 }
 
-
 BOOL
 FASTCALL
 IntGdiSetDCOwnerEx( HDC hDC, DWORD OwnerMask, BOOL NoSetBrush)
@@ -1673,7 +1702,6 @@ GreGetObjectOwner(HGDIOBJ Handle, GDIOBJTYPE ObjType)
   return Ret;
 }
 
-
 W32KAPI
 HANDLE
 APIENTRY