reactos/dll/directx/ddraw/Ddraw/ddraw_setcooperativelevel.c

280 lines
8.9 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DirectX
* FILE: dll/directx/ddraw/Ddraw/ddraw_setcooperativelevel.c
* PURPOSE: IDirectDraw7::SetCooperativeLevel Implementation
* PROGRAMMER: Magnus Olsen
*
*/
#include "rosdraw.h"
HRESULT WINAPI
Main_DirectDraw_SetCooperativeLevel (LPDDRAWI_DIRECTDRAW_INT This, HWND hwnd, DWORD cooplevel)
{
HRESULT retVal = DD_OK;
DX_WINDBG_trace();
_SEH2_TRY
{
if (hwnd && !IsWindow(hwnd))
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_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;
_SEH2_LEAVE;
}
if (!( cooplevel & (DDSCL_NORMAL | DDSCL_EXCLUSIVE | DDSCL_SETFOCUSWINDOW)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_LEAVE;
}
if ((cooplevel & DDSCL_FPUSETUP) && (cooplevel & DDSCL_FPUPRESERVE))
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_LEAVE;
}
if ((cooplevel & DDSCL_EXCLUSIVE) && (!(cooplevel & DDSCL_FULLSCREEN)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_LEAVE;
}
if ((cooplevel & DDSCL_ALLOWMODEX) && (!(cooplevel & DDSCL_FULLSCREEN)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_LEAVE;
}
if ((cooplevel & (DDSCL_CREATEDEVICEWINDOW | DDSCL_SETFOCUSWINDOW)))
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_LEAVE;
}
if (!cooplevel)
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_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 ;
This->lpLcl->hWnd = (ULONG_PTR) hwnd;
This->lpLcl->hFocusWnd = (ULONG_PTR) hwnd;
This->lpLcl->lpGbl->lpExclusiveOwner=NULL;
retVal = DD_OK;
_SEH2_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;
_SEH2_LEAVE;
}
if( (GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CHILD) )
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_LEAVE;
}
if( (This->lpLcl->lpGbl->lpExclusiveOwner != NULL) &&
(This->lpLcl->lpGbl->lpExclusiveOwner != This->lpLcl) )
{
retVal = DDERR_INVALIDPARAMS;
_SEH2_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;
_SEH2_LEAVE;
}
/*
* Code from wine, this functions have been cut and paste from wine 0.9.35
* and have been modify allot and are still in devloping so it match with
* msdn document struct and flags
*/
///* Handle those levels first which set various hwnds */
//if(cooplevel & DDSCL_SETFOCUSWINDOW)
//{
//
// if(This->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED)
// {
// retVal = DDERR_HWNDALREADYSET;
// _SEH2_LEAVE;
// }
// else if( (This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN) && window)
// {
// retVal = DDERR_HWNDALREADYSET;
// _SEH2_LEAVE;
// }
// This->lpLcl->hFocusWnd = (ULONG_PTR) hwnd;
// /* Won't use the hwnd param for anything else */
// hwnd = NULL;
// /* Use the focus window for drawing too */
// This->lpLcl->hWnd = This->lpLcl->hFocusWnd;
//}
///* DDSCL_NORMAL or DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE */
//if(cooplevel & DDSCL_NORMAL)
//{
// /* Can't coexist with fullscreen or exclusive */
// if(cooplevel & (DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE) )
// {
// retVal = DDERR_INVALIDPARAMS;
// _SEH2_LEAVE;
// }
// /* Switching from fullscreen? */
// if(This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN)
// {
// /* Restore the display mode */
// Main_DirectDraw_RestoreDisplayMode(iface);
// This->lpLcl->dwLocalFlags &= ~DDRAWILCL_ISFULLSCREEN;
// This->lpLcl->dwLocalFlags &= ~DDRAWILCL_HASEXCLUSIVEMODE;
// This->lpLcl->dwLocalFlags &= ~DDRAWILCL_ALLOWMODEX;
// }
// /* Don't override focus windows or private device windows */
// if( hwnd &&
// !(This->lpLcl->hFocusWnd) &&
// !(This->lpLcl->dwObsolete1) &&
// (hwnd != window) )
// {
// This->lpLcl->hWnd = (ULONG_PTR)hwnd;
// }
// /* FIXME GL
// IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
// FALSE);
// */
// }
// else if(cooplevel & DDSCL_FULLSCREEN)
// {
// /* Needs DDSCL_EXCLUSIVE */
// if(!(cooplevel & DDSCL_EXCLUSIVE) )
// {
// retVal = DDERR_INVALIDPARAMS;
// _SEH2_LEAVE;
// }
// /* Switch from normal to full screen mode? */
// if (!(This->lpLcl->dwLocalFlags & DDRAWILCL_HASEXCLUSIVEMODE))
// {
// /* FIXME GL
// IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
// TRUE);
// */
// }
// /* Don't override focus windows or private device windows */
// if( hwnd &&
// !(This->lpLcl->hFocusWnd) &&
// !(This->lpLcl->dwObsolete1) &&
// (hwnd != window) )
// {
// This->lpLcl->hWnd = (ULONG_PTR) hwnd;
// }
// }
// else if(cooplevel & DDSCL_EXCLUSIVE)
// {
// retVal = DDERR_INVALIDPARAMS;
// _SEH2_LEAVE;
// }
// if(cooplevel & DDSCL_CREATEDEVICEWINDOW)
// {
// /* Don't create a device window if a focus window is set */
// if( !This->lpLcl->hFocusWnd)
// {
// HWND devicewindow = CreateWindowExW(0, classname, L"DDraw device window",
// WS_POPUP, 0, 0,
// GetSystemMetrics(SM_CXSCREEN),
// GetSystemMetrics(SM_CYSCREEN),
// NULL, NULL, GetModuleHandleW(0), NULL);
// ShowWindow(devicewindow, SW_SHOW); /* Just to be sure */
// This->lpLcl->dwObsolete1 = (DWORD)devicewindow;
// }
// }
// if(cooplevel & DDSCL_MULTITHREADED && !(This->lpLcl->dwLocalFlags & DDRAWILCL_MULTITHREADED))
// {
// /* FIXME GL
// * IWineD3DDevice_SetMultithreaded(This->wineD3DDevice);
// */
// }
// /* Store the cooperative_level */
// /* FIXME GL
// * This->cooperative_level |= cooplevel;
// */
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
}
_SEH2_END;
return retVal;
}