more rewriting of setcooperlevel, it start working simluare as windows ddraw. and it start setup same value as well in the private struct.

svn path=/trunk/; revision=27181
This commit is contained in:
Magnus Olsen 2007-06-14 22:04:32 +00:00
parent 52c6c5e833
commit 4bac086c86
2 changed files with 215 additions and 119 deletions

View file

@ -161,7 +161,7 @@ Main_DirectDraw_Compact(LPDIRECTDRAW7 iface)
_SEH_TRY _SEH_TRY
{ {
if (This->lpLcl->lpGbl->lpExclusiveOwner == This->lpLcl) if (This->lpLcl->lpGbl->lpExclusiveOwner != This->lpLcl)
{ {
retVal = DDERR_NOEXCLUSIVEMODE; retVal = DDERR_NOEXCLUSIVEMODE;
} }

View file

@ -26,20 +26,121 @@ Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface, HWND hwnd, DWORD coopl
_SEH_TRY _SEH_TRY
{ {
// FIXME test if 0x20 exists as a flag and what thuse it do
if ( ( cooplevel & (~(DDSCL_FPUPRESERVE | DDSCL_FPUSETUP | DDSCL_MULTITHREADED | DDSCL_CREATEDEVICEWINDOW | if (hwnd && !IsWindow(hwnd))
DDSCL_SETDEVICEWINDOW | DDSCL_SETFOCUSWINDOW | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE |
DDSCL_NORMAL | DDSCL_NOWINDOWCHANGES | DDSCL_ALLOWREBOOT | DDSCL_FULLSCREEN))) ||
(!( cooplevel & (DDSCL_NORMAL | DDSCL_EXCLUSIVE | DDSCL_SETFOCUSWINDOW))) ||
((cooplevel & DDSCL_FPUSETUP) && (cooplevel & DDSCL_FPUPRESERVE)))
{ {
return DDERR_INVALIDPARAMS; retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
} }
// FIXME test if 0x20 exists as a flag and what thuse it do
if ( cooplevel & (~(DDSCL_FPUPRESERVE | DDSCL_FPUSETUP | DDSCL_MULTITHREADED | DDSCL_CREATEDEVICEWINDOW |
DDSCL_SETDEVICEWINDOW | DDSCL_SETFOCUSWINDOW | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE |
DDSCL_NORMAL | DDSCL_NOWINDOWCHANGES | DDSCL_ALLOWREBOOT | DDSCL_FULLSCREEN)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if (!( cooplevel & (DDSCL_NORMAL | DDSCL_EXCLUSIVE | DDSCL_SETFOCUSWINDOW)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if ((cooplevel & DDSCL_FPUSETUP) && (cooplevel & DDSCL_FPUPRESERVE))
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if ((cooplevel & DDSCL_EXCLUSIVE) && (!(cooplevel & DDSCL_FULLSCREEN)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if ((cooplevel & DDSCL_ALLOWMODEX) && (!(cooplevel & DDSCL_FULLSCREEN)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if ((cooplevel & (DDSCL_CREATEDEVICEWINDOW | DDSCL_SETFOCUSWINDOW)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if (!cooplevel)
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
/* NORMAL MODE */
if(!(cooplevel & (~DDSCL_NORMAL)))
{
/* FIXME in setup.c set DDRAWI_UMODELOADED | DDRAWI_DISPLAYDRV | DDRAWI_EMULATIONINITIALIZED | DDRAWI_GDIDRV | DDRAWI_ATTACHEDTODESKTOP */
/* FIXME in setup.c This->lpLcl->lpGbl->dwFlags = */
This->lpLcl->dwLocalFlags = DDRAWILCL_SETCOOPCALLED | DDRAWILCL_DIRECTDRAW7 | DDRAWILCL_HOOKEDHWND;
This->lpLcl->hWnd = (ULONG_PTR) hwnd;
This->lpLcl->hFocusWnd = (ULONG_PTR) hwnd;
This->lpLcl->lpGbl->lpExclusiveOwner=NULL;
retVal = DD_OK;
_SEH_LEAVE;
}
/* FULLSCREEN */
if ((!(cooplevel & (~(DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))) ||
(!(cooplevel & (~(DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX)))))
{
/* FIXME in setup.c This->lpLcl->lpGbl->dwFlags = */
if (hwnd == NULL)
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if( (GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD) )
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
if( (This->lpLcl->lpGbl->lpExclusiveOwner != NULL) &&
(This->lpLcl->lpGbl->lpExclusiveOwner != This->lpLcl) )
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
This->lpLcl->lpGbl->lpExclusiveOwner = This-> lpLcl;
This->lpLcl->dwLocalFlags = DDRAWILCL_SETCOOPCALLED | DDRAWILCL_DIRECTDRAW7 | DDRAWILCL_HOOKEDHWND |
DDRAWILCL_HASEXCLUSIVEMODE | DDRAWILCL_ISFULLSCREEN | DDRAWILCL_ACTIVEYES |
DDRAWILCL_CURSORCLIPPED;
if (cooplevel & DDSCL_ALLOWMODEX)
{
This->lpLcl->dwLocalFlags = This->lpLcl->dwLocalFlags | DDRAWILCL_ALLOWMODEX;
}
This->lpLcl->hWnd = (ULONG_PTR) hwnd;
This->lpLcl->hFocusWnd = (ULONG_PTR) hwnd;
/* FIXME fullscreen are not finuish */
retVal = DD_OK;
_SEH_LEAVE;
}
/* /*
* Code from wine, this functions have been cut and paste from wine 0.9.35 * Code from wine, this functions have been cut and paste from wine 0.9.35
@ -47,139 +148,134 @@ Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface, HWND hwnd, DWORD coopl
* msdn document struct and flags * msdn document struct and flags
*/ */
if(hwnd && !IsWindow(hwnd))
{
retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE;
}
/* Handle those levels first which set various hwnds */ ///* Handle those levels first which set various hwnds */
if(cooplevel & DDSCL_SETFOCUSWINDOW) //if(cooplevel & DDSCL_SETFOCUSWINDOW)
{ //{
//
if(This->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED) // if(This->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED)
{ // {
retVal = DDERR_HWNDALREADYSET; // retVal = DDERR_HWNDALREADYSET;
_SEH_LEAVE; // _SEH_LEAVE;
} // }
else if( (This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN) && window) // else if( (This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN) && window)
{ // {
retVal = DDERR_HWNDALREADYSET; // retVal = DDERR_HWNDALREADYSET;
_SEH_LEAVE; // _SEH_LEAVE;
} // }
This->lpLcl->hFocusWnd = (ULONG_PTR) hwnd; // This->lpLcl->hFocusWnd = (ULONG_PTR) hwnd;
/* Won't use the hwnd param for anything else */ // /* Won't use the hwnd param for anything else */
hwnd = NULL; // hwnd = NULL;
/* Use the focus window for drawing too */ // /* Use the focus window for drawing too */
This->lpLcl->hWnd = This->lpLcl->hFocusWnd; // This->lpLcl->hWnd = This->lpLcl->hFocusWnd;
} //}
/* DDSCL_NORMAL or DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE */ ///* DDSCL_NORMAL or DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE */
if(cooplevel & DDSCL_NORMAL) //if(cooplevel & DDSCL_NORMAL)
{ //{
/* Can't coexist with fullscreen or exclusive */ // /* Can't coexist with fullscreen or exclusive */
if(cooplevel & (DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE) ) // if(cooplevel & (DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE) )
{ // {
retVal = DDERR_INVALIDPARAMS; // retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE; // _SEH_LEAVE;
} // }
/* Switching from fullscreen? */ // /* Switching from fullscreen? */
if(This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN) // if(This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN)
{ // {
/* Restore the display mode */ // /* Restore the display mode */
Main_DirectDraw_RestoreDisplayMode(iface); // Main_DirectDraw_RestoreDisplayMode(iface);
This->lpLcl->dwLocalFlags &= ~DDRAWILCL_ISFULLSCREEN; // This->lpLcl->dwLocalFlags &= ~DDRAWILCL_ISFULLSCREEN;
This->lpLcl->dwLocalFlags &= ~DDRAWILCL_HASEXCLUSIVEMODE; // This->lpLcl->dwLocalFlags &= ~DDRAWILCL_HASEXCLUSIVEMODE;
This->lpLcl->dwLocalFlags &= ~DDRAWILCL_ALLOWMODEX; // This->lpLcl->dwLocalFlags &= ~DDRAWILCL_ALLOWMODEX;
} // }
/* Don't override focus windows or private device windows */ // /* Don't override focus windows or private device windows */
if( hwnd && // if( hwnd &&
!(This->lpLcl->hFocusWnd) && // !(This->lpLcl->hFocusWnd) &&
!(This->lpLcl->dwObsolete1) && // !(This->lpLcl->dwObsolete1) &&
(hwnd != window) ) // (hwnd != window) )
{ // {
This->lpLcl->hWnd = (ULONG_PTR)hwnd; // This->lpLcl->hWnd = (ULONG_PTR)hwnd;
} // }
/* FIXME GL // /* FIXME GL
IWineD3DDevice_SetFullscreen(This->wineD3DDevice, // IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
FALSE); // FALSE);
*/ // */
} // }
else if(cooplevel & DDSCL_FULLSCREEN) // else if(cooplevel & DDSCL_FULLSCREEN)
{ // {
/* Needs DDSCL_EXCLUSIVE */ // /* Needs DDSCL_EXCLUSIVE */
if(!(cooplevel & DDSCL_EXCLUSIVE) ) // if(!(cooplevel & DDSCL_EXCLUSIVE) )
{ // {
retVal = DDERR_INVALIDPARAMS; // retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE; // _SEH_LEAVE;
} // }
/* Switch from normal to full screen mode? */ // /* Switch from normal to full screen mode? */
if (!(This->lpLcl->dwLocalFlags & DDRAWILCL_HASEXCLUSIVEMODE)) // if (!(This->lpLcl->dwLocalFlags & DDRAWILCL_HASEXCLUSIVEMODE))
{ // {
/* FIXME GL // /* FIXME GL
IWineD3DDevice_SetFullscreen(This->wineD3DDevice, // IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
TRUE); // TRUE);
*/ // */
} // }
/* Don't override focus windows or private device windows */ // /* Don't override focus windows or private device windows */
if( hwnd && // if( hwnd &&
!(This->lpLcl->hFocusWnd) && // !(This->lpLcl->hFocusWnd) &&
!(This->lpLcl->dwObsolete1) && // !(This->lpLcl->dwObsolete1) &&
(hwnd != window) ) // (hwnd != window) )
{ // {
This->lpLcl->hWnd = (ULONG_PTR) hwnd; // This->lpLcl->hWnd = (ULONG_PTR) hwnd;
} // }
} // }
else if(cooplevel & DDSCL_EXCLUSIVE) // else if(cooplevel & DDSCL_EXCLUSIVE)
{ // {
retVal = DDERR_INVALIDPARAMS; // retVal = DDERR_INVALIDPARAMS;
_SEH_LEAVE; // _SEH_LEAVE;
} // }
if(cooplevel & DDSCL_CREATEDEVICEWINDOW) // if(cooplevel & DDSCL_CREATEDEVICEWINDOW)
{ // {
/* Don't create a device window if a focus window is set */ // /* Don't create a device window if a focus window is set */
if( !This->lpLcl->hFocusWnd) // if( !This->lpLcl->hFocusWnd)
{ // {
HWND devicewindow = CreateWindowExW(0, classname, L"DDraw device window", // HWND devicewindow = CreateWindowExW(0, classname, L"DDraw device window",
WS_POPUP, 0, 0, // WS_POPUP, 0, 0,
GetSystemMetrics(SM_CXSCREEN), // GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN), // GetSystemMetrics(SM_CYSCREEN),
NULL, NULL, GetModuleHandleW(0), NULL); // NULL, NULL, GetModuleHandleW(0), NULL);
ShowWindow(devicewindow, SW_SHOW); /* Just to be sure */ // ShowWindow(devicewindow, SW_SHOW); /* Just to be sure */
This->lpLcl->dwObsolete1 = (DWORD)devicewindow; // This->lpLcl->dwObsolete1 = (DWORD)devicewindow;
} // }
} // }
if(cooplevel & DDSCL_MULTITHREADED && !(This->lpLcl->dwLocalFlags & DDRAWILCL_MULTITHREADED)) // if(cooplevel & DDSCL_MULTITHREADED && !(This->lpLcl->dwLocalFlags & DDRAWILCL_MULTITHREADED))
{ // {
/* FIXME GL // /* FIXME GL
* IWineD3DDevice_SetMultithreaded(This->wineD3DDevice); // * IWineD3DDevice_SetMultithreaded(This->wineD3DDevice);
*/ // */
} // }
/* Store the cooperative_level */ // /* Store the cooperative_level */
/* FIXME GL // /* FIXME GL
* This->cooperative_level |= cooplevel; // * This->cooperative_level |= cooplevel;
*/ // */
} }
_SEH_HANDLE _SEH_HANDLE
{ {