wined3d: More fullscreen window fixes.

This commit is contained in:
Stefan Dösinger 2007-02-14 17:59:08 +01:00 committed by Alexandre Julliard
parent 7f5dccb696
commit 388499ff28
3 changed files with 32 additions and 18 deletions

View File

@ -426,9 +426,6 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
/* Restore the display mode */
IDirectDraw7_RestoreDisplayMode(iface);
if(window)
IWineD3DDevice_RestoreWindow(This->wineD3DDevice, window);
This->cooperative_level &= ~DDSCL_FULLSCREEN;
This->cooperative_level &= ~DDSCL_EXCLUSIVE;
This->cooperative_level &= ~DDSCL_ALLOWMODEX;
@ -476,13 +473,6 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
!(This->devicewindow) &&
(hwnd != window) )
{
/* On a window change, restore the old window and set the new one */
if(window != hwnd)
{
if(window)
IWineD3DDevice_RestoreWindow(This->wineD3DDevice, window);
IWineD3DDevice_SetupFullscreenWindow(This->wineD3DDevice, hwnd);
}
IWineD3DDevice_SetHWND(This->wineD3DDevice, hwnd);
}
}

View File

@ -1159,7 +1159,7 @@ static void WINAPI IWineD3DDeviceImpl_SetupFullscreenWindow(IWineD3DDevice *ifac
* That shouldn't happen
*/
TRACE("(%p): Setting up window %p for exclusive mode\n", This, window);
if (This->style && This->exStyle) {
if (This->style || This->exStyle) {
ERR("(%p): Want to change the window parameters of HWND %p, but "
"another style is stored for restoration afterwards\n", This, window);
}
@ -1404,7 +1404,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
This->ddraw_height = devmode.dmPelsHeight;
This->ddraw_format = *(pPresentationParameters->BackBufferFormat);
IWineD3DDeviceImpl_SetupFullscreenWindow(iface, object->win_handle);
IWineD3DDevice_SetFullscreen(iface, TRUE);
/* And finally clip mouse to our screen */
SetRect(&clip_rc, 0, 0, devmode.dmPelsWidth, devmode.dmPelsHeight);
@ -1681,6 +1681,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR
}
This->swapchains[0] = (IWineD3DSwapChain *) swapchain;
if(!This->ddraw_window) IWineD3DDevice_SetHWND(iface, swapchain->win_handle);
if(swapchain->backBuffer && swapchain->backBuffer[0]) {
TRACE("Setting rendertarget to %p\n", swapchain->backBuffer);
This->render_targets[0] = swapchain->backBuffer[0];
@ -1810,6 +1812,13 @@ static void WINAPI IWineD3DDeviceImpl_SetFullscreen(IWineD3DDevice *iface, BOOL
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
TRACE("(%p) Setting DDraw fullscreen mode to %s\n", This, fullscreen ? "true" : "false");
/* Setup the window for fullscreen mode */
if(fullscreen && !This->ddraw_fullscreen) {
IWineD3DDeviceImpl_SetupFullscreenWindow(iface, This->ddraw_window);
} else if(!fullscreen && This->ddraw_fullscreen) {
IWineD3DDeviceImpl_RestoreWindow(iface, This->ddraw_window);
}
/* DirectDraw apps can change between fullscreen and windowed mode after device creation with
* IDirectDraw7::SetCooperativeLevel. The GDI surface implementation needs to know this.
* DDraw doesn't necessarily have a swapchain, so we have to store the fullscreen flag
@ -4006,6 +4015,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetHWND(IWineD3DDevice *iface, HWND hWn
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
TRACE("(%p)->(%p)\n", This, hWnd);
if(This->ddraw_fullscreen) {
if(This->ddraw_window && This->ddraw_window != hWnd) {
IWineD3DDeviceImpl_RestoreWindow(iface, This->ddraw_window);
}
if(hWnd && This->ddraw_window != hWnd) {
IWineD3DDeviceImpl_SetupFullscreenWindow(iface, hWnd);
}
}
This->ddraw_window = hWnd;
return WINED3D_OK;
}
@ -5455,7 +5473,19 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
if((*pPresentationParameters->Windowed && !swapchain->presentParms.Windowed) ||
(swapchain->presentParms.Windowed && !*pPresentationParameters->Windowed) ||
DisplayModeChanged) {
/* Switching to fullscreen? Change to fullscreen mode, THEN change the screen res */
if(!(*pPresentationParameters->Windowed)) {
IWineD3DDevice_SetFullscreen(iface, TRUE);
}
IWineD3DDevice_SetDisplayMode(iface, 0, &mode);
/* Switching out of fullscreen mode? First set the original res, then change the window */
if(*pPresentationParameters->Windowed) {
IWineD3DDevice_SetFullscreen(iface, FALSE);
}
swapchain->presentParms.Windowed = *pPresentationParameters->Windowed;
}
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
@ -5809,8 +5839,6 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
IWineD3DDeviceImpl_UpdateTexture,
IWineD3DDeviceImpl_UpdateSurface,
IWineD3DDeviceImpl_GetFrontBufferData,
IWineD3DDeviceImpl_SetupFullscreenWindow,
IWineD3DDeviceImpl_RestoreWindow,
/*** object tracking ***/
IWineD3DDeviceImpl_ResourceReleased
};

View File

@ -470,8 +470,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase)
STDMETHOD(UpdateTexture)(THIS_ struct IWineD3DBaseTexture *pSourceTexture, struct IWineD3DBaseTexture *pDestinationTexture) PURE;
STDMETHOD(UpdateSurface)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRect, struct IWineD3DSurface* pDestinationSurface, CONST POINT* pDestPoint) PURE;
STDMETHOD(GetFrontBufferData)(THIS_ UINT iSwapChain,struct IWineD3DSurface* pSurface) PURE;
STDMETHOD_(void, SetupFullscreenWindow)(THIS_ HWND window) PURE;
STDMETHOD_(void, RestoreWindow)(THIS_ HWND window) PURE;
/*** object tracking ***/
STDMETHOD_(void, ResourceReleased)(THIS_ struct IWineD3DResource *resource);
};
@ -609,8 +607,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase)
#define IWineD3DDevice_UpdateTexture(p,a,b) (p)->lpVtbl->UpdateTexture(p,a,b)
#define IWineD3DDevice_UpdateSurface(p,a,b,c,d) (p)->lpVtbl->UpdateSurface(p,a,b,c,d)
#define IWineD3DDevice_GetFrontBufferData(p,a,b) (p)->lpVtbl->GetFrontBufferData(p,a,b)
#define IWineD3DDevice_SetupFullscreenWindow(p, a) (p)->lpVtbl->SetupFullscreenWindow(p,a);
#define IWineD3DDevice_RestoreWindow(p, a) (p)->lpVtbl->RestoreWindow(p,a);
#define IWineD3DDevice_ResourceReleased(p,a) (p)->lpVtbl->ResourceReleased(p,a)
#endif