- 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:
Gé van Geldorp
2003-11-08 15:00:36 +00:00
parent 7fbaee7310
commit 7e9933a785
2 changed files with 28 additions and 23 deletions
+10 -4
View File
@@ -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);
}
+18 -19
View File
@@ -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);
}