mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 04:13:31 +00:00
- Move DRIVER_UnreferenceDriver call to DC_InternalDelete, so it will be
called too for DCs which are cleaned up by the system on app termination - Fix graphic state reference counting in case window creation fails This fixes bug #24 svn path=/trunk/; revision=6579
This commit is contained in:
@@ -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: window.c,v 1.129 2003/11/03 18:52:21 ekohl Exp $
|
||||
/* $Id: window.c,v 1.130 2003/11/08 15:00:36 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -1344,9 +1344,6 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
|
||||
DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight);
|
||||
|
||||
/* Initialize gui state if necessary. */
|
||||
IntGraphicsCheck(TRUE);
|
||||
|
||||
if (!RtlCreateUnicodeString(&WindowName,
|
||||
NULL == lpWindowName->Buffer ?
|
||||
L"" : lpWindowName->Buffer))
|
||||
@@ -1355,6 +1352,9 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
return((HWND)0);
|
||||
}
|
||||
|
||||
/* Initialize gui state if necessary. */
|
||||
IntGraphicsCheck(TRUE);
|
||||
|
||||
ParentWindowHandle = PsGetWin32Thread()->Desktop->DesktopWindow;
|
||||
OwnerWindowHandle = NULL;
|
||||
|
||||
@@ -1375,6 +1375,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
}
|
||||
else if ((dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD)
|
||||
{
|
||||
IntGraphicsCheck(FALSE);
|
||||
return (HWND)0; /* WS_CHILD needs a parent, but WS_POPUP doesn't */
|
||||
}
|
||||
|
||||
@@ -1388,6 +1389,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
{
|
||||
RtlFreeUnicodeString(&WindowName);
|
||||
IntReleaseWindowObject(ParentWindow);
|
||||
IntGraphicsCheck(FALSE);
|
||||
return((HWND)0);
|
||||
}
|
||||
|
||||
@@ -1405,6 +1407,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
IntReleaseWindowObject(ParentWindow);
|
||||
DPRINT("Validation of window station handle (0x%X) failed\n",
|
||||
PROCESS_WINDOW_STATION());
|
||||
IntGraphicsCheck(FALSE);
|
||||
return (HWND)0;
|
||||
}
|
||||
|
||||
@@ -1421,6 +1424,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
ObmDereferenceObject(ClassObject);
|
||||
RtlFreeUnicodeString(&WindowName);
|
||||
IntReleaseWindowObject(ParentWindow);
|
||||
IntGraphicsCheck(FALSE);
|
||||
SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
|
||||
return (HWND)0;
|
||||
}
|
||||
@@ -1585,6 +1589,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
{
|
||||
/* FIXME: Cleanup. */
|
||||
IntReleaseWindowObject(ParentWindow);
|
||||
IntGraphicsCheck(FALSE);
|
||||
DPRINT("NtUserCreateWindowEx(): NCCREATE message failed.\n");
|
||||
return((HWND)0);
|
||||
}
|
||||
@@ -1623,6 +1628,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
{
|
||||
/* FIXME: Cleanup. */
|
||||
IntReleaseWindowObject(ParentWindow);
|
||||
IntGraphicsCheck(FALSE);
|
||||
DPRINT("NtUserCreateWindowEx(): send CREATE message failed.\n");
|
||||
return((HWND)0);
|
||||
}
|
||||
|
||||
@@ -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: dc.c,v 1.96 2003/11/07 17:40:02 gvg Exp $
|
||||
/* $Id: dc.c,v 1.97 2003/11/08 15:00:36 gvg Exp $
|
||||
*
|
||||
* DC.C - Device context functions
|
||||
*
|
||||
@@ -765,23 +765,6 @@ NtGdiDeleteDC(HDC DCHandle)
|
||||
return FALSE;
|
||||
}
|
||||
DPRINT( "Deleting DC\n" );
|
||||
if (! (DCToDelete->w.flags & DC_MEMORY) /* Don't reset the display if its a memory DC */
|
||||
&& NULL != DCToDelete->DriverName)
|
||||
{
|
||||
if (!DRIVER_UnreferenceDriver (DCToDelete->DriverName))
|
||||
{
|
||||
DPRINT( "No more references to driver, reseting display\n" );
|
||||
DCToDelete->DriverFunctions.AssertMode( DCToDelete->PDev, FALSE );
|
||||
CHECKPOINT;
|
||||
DCToDelete->DriverFunctions.DisableSurface(DCToDelete->PDev);
|
||||
CHECKPOINT;
|
||||
DCToDelete->DriverFunctions.DisablePDev(DCToDelete->PDev);
|
||||
|
||||
ObDereferenceObject(PrimarySurface.VideoDeviceObject);
|
||||
|
||||
PrimarySurfaceCreated = FALSE;
|
||||
}
|
||||
}
|
||||
CHECKPOINT;
|
||||
/* First delete all saved DCs */
|
||||
while (DCToDelete->saveLevel)
|
||||
@@ -1935,7 +1918,23 @@ DC_FreeDC(HDC DCToFree)
|
||||
BOOL FASTCALL
|
||||
DC_InternalDeleteDC( PDC DCToDelete )
|
||||
{
|
||||
if( DCToDelete->DriverName )
|
||||
if (! (DCToDelete->w.flags & DC_MEMORY) /* Don't reset the display if its a memory DC */
|
||||
&& NULL != DCToDelete->DriverName
|
||||
&& ! DRIVER_UnreferenceDriver (DCToDelete->DriverName))
|
||||
{
|
||||
DPRINT( "No more references to driver, reseting display\n" );
|
||||
DCToDelete->DriverFunctions.AssertMode( DCToDelete->PDev, FALSE );
|
||||
CHECKPOINT;
|
||||
DCToDelete->DriverFunctions.DisableSurface(DCToDelete->PDev);
|
||||
CHECKPOINT;
|
||||
DCToDelete->DriverFunctions.DisablePDev(DCToDelete->PDev);
|
||||
|
||||
ObDereferenceObject(PrimarySurface.VideoDeviceObject);
|
||||
|
||||
PrimarySurfaceCreated = FALSE;
|
||||
}
|
||||
|
||||
if (NULL != DCToDelete->DriverName)
|
||||
{
|
||||
ExFreePool(DCToDelete->DriverName);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user