Author: greatlrd Date: Fri Jun 15 02:04:32 2007 New Revision: 27181
URL: http://svn.reactos.org/svn/reactos?rev=27181&view=rev Log: more rewriting of setcooperlevel, it start working simluare as windows ddraw. and it start setup same value as well in the private struct.
Modified: trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_setcooperativelevel.c
Modified: trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/Ddraw/ddr... ============================================================================== --- trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c (original) +++ trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c Fri Jun 15 02:04:32 2007 @@ -161,7 +161,7 @@
_SEH_TRY { - if (This->lpLcl->lpGbl->lpExclusiveOwner == This->lpLcl) + if (This->lpLcl->lpGbl->lpExclusiveOwner != This->lpLcl) { retVal = DDERR_NOEXCLUSIVEMODE; }
Modified: trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_setcooperativelevel.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/Ddraw/ddr... ============================================================================== --- trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_setcooperativelevel.c (original) +++ trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_setcooperativelevel.c Fri Jun 15 02:04:32 2007 @@ -26,20 +26,121 @@
_SEH_TRY { + + if (hwnd && !IsWindow(hwnd)) + { + 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 | + 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))) || - (!( cooplevel & (DDSCL_NORMAL | DDSCL_EXCLUSIVE | DDSCL_SETFOCUSWINDOW))) || - ((cooplevel & DDSCL_FPUSETUP) && (cooplevel & DDSCL_FPUPRESERVE))) - { - return DDERR_INVALIDPARAMS; - } - - - - - + 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 @@ -47,139 +148,134 @@ * msdn document struct and flags */
- if(hwnd && !IsWindow(hwnd)) - { - retVal = DDERR_INVALIDPARAMS; - _SEH_LEAVE; - } - - - /* Handle those levels first which set various hwnds */ - if(cooplevel & DDSCL_SETFOCUSWINDOW) - { - - - if(This->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED) - { - retVal = DDERR_HWNDALREADYSET; - _SEH_LEAVE; - } - else if( (This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN) && window) - { - retVal = DDERR_HWNDALREADYSET; - _SEH_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; - _SEH_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; - _SEH_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; - _SEH_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; - */ + + + ///* Handle those levels first which set various hwnds */ + //if(cooplevel & DDSCL_SETFOCUSWINDOW) + //{ + // + + // if(This->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED) + // { + // retVal = DDERR_HWNDALREADYSET; + // _SEH_LEAVE; + // } + // else if( (This->lpLcl->dwLocalFlags & DDRAWILCL_ISFULLSCREEN) && window) + // { + // retVal = DDERR_HWNDALREADYSET; + // _SEH_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; + // _SEH_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; + // _SEH_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; + // _SEH_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; + // */ } _SEH_HANDLE {