Stefan Dösinger : ddraw: Pass the fullscreen flag to wined3d.

Alexandre Julliard julliard at wine.codeweavers.com
Sun Sep 10 03:28:28 CDT 2006


Module: wine
Branch: master
Commit: 6286c4e70d6fa964dceecd517df6141dd6eacf1e
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=6286c4e70d6fa964dceecd517df6141dd6eacf1e

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Sat Sep  9 13:33:17 2006 +0200

ddraw: Pass the fullscreen flag to wined3d.

---

 dlls/ddraw/ddraw.c               |    5 +++++
 dlls/wined3d/device.c            |   13 +++++++++++++
 dlls/wined3d/wined3d_private.h   |    1 +
 include/wine/wined3d_interface.h |    2 ++
 4 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 5e4a909..333fcde 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -550,6 +550,9 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
         {
             IWineD3DDevice_SetHWND(This->wineD3DDevice, hwnd);
         }
+
+        IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
+                                     FALSE);
     }
     else if(cooplevel & DDSCL_FULLSCREEN)
     {
@@ -571,6 +574,8 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
         if(This->cooperative_level & DDSCL_NORMAL)
         {
             This->cooperative_level &= ~DDSCL_NORMAL;
+            IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
+                                         TRUE);
         }
 
         /* Don't override focus windows or private device windows */
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 5a07adf..34026db 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2175,6 +2175,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     return WINED3D_OK;
 }
 
+static void WINAPI IWineD3DDeviceImpl_SetFullscreen(IWineD3DDevice *iface, BOOL fullscreen) {
+    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+    TRACE("(%p) Setting DDraw fullscreen mode to %s\n", This, fullscreen ? "true" : "false");
+
+    /* 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 necessarilly have a swapchain, so we have to store the fullscreen flag
+     * seperately.
+     */
+    This->ddraw_fullscreen = fullscreen;
+}
+
 static HRESULT WINAPI IWineD3DDeviceImpl_EnumDisplayModes(IWineD3DDevice *iface, DWORD Flags, UINT Width, UINT Height, WINED3DFORMAT pixelformat, LPVOID context, D3DCB_ENUMDISPLAYMODESCALLBACK callback) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
 
@@ -7965,6 +7977,7 @@ const IWineD3DDeviceVtbl IWineD3DDevice_
     /*** Odd functions **/
     IWineD3DDeviceImpl_Init3D,
     IWineD3DDeviceImpl_Uninit3D,
+    IWineD3DDeviceImpl_SetFullscreen,
     IWineD3DDeviceImpl_EnumDisplayModes,
     IWineD3DDeviceImpl_EvictManagedResources,
     IWineD3DDeviceImpl_GetAvailableTextureMem,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f103705..9b36a70 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -576,6 +576,7 @@ #define                         NEEDS_DI
     IWineD3DSurface *ddraw_primary;
     DWORD ddraw_width, ddraw_height;
     WINED3DFORMAT ddraw_format;
+    BOOL ddraw_fullscreen;
 
     /* List of GLSL shader programs and their associated vertex & pixel shaders */
     struct list glsl_shader_progs;
diff --git a/include/wine/wined3d_interface.h b/include/wine/wined3d_interface.h
index 01cc8ef..e76bc55 100644
--- a/include/wine/wined3d_interface.h
+++ b/include/wine/wined3d_interface.h
@@ -381,6 +381,7 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD
     STDMETHOD_(HRESULT,CreatePalette)(THIS_ DWORD Flags, PALETTEENTRY *PalEnt, struct IWineD3DPalette **Palette, IUnknown *Parent);
     STDMETHOD(Init3D)(THIS_ WINED3DPRESENT_PARAMETERS* pPresentationParameters, D3DCB_CREATEADDITIONALSWAPCHAIN D3DCB_CreateAdditionalSwapChain);
     STDMETHOD(Uninit3D)(THIS);
+    STDMETHOD_(void, SetFullscreen)(THIS_ BOOL fullscreen);
     STDMETHOD(EnumDisplayModes)(THIS_ DWORD Flags, UINT Width, UINT Height, WINED3DFORMAT Format, void *context, D3DCB_ENUMDISPLAYMODESCALLBACK cb) PURE;
     STDMETHOD(EvictManagedResources)(THIS) PURE;
     STDMETHOD_(UINT, GetAvailableTextureMem)(THIS) PURE;
@@ -521,6 +522,7 @@ #define IWineD3DDevice_CreatePixelShader
 #define IWineD3DDevice_CreatePalette(p, a, b, c, d)             (p)->lpVtbl->CreatePalette(p, a, b, c, d)
 #define IWineD3DDevice_Init3D(p, a, b)                          (p)->lpVtbl->Init3D(p, a, b)
 #define IWineD3DDevice_Uninit3D(p)                              (p)->lpVtbl->Uninit3D(p)
+#define IWineD3DDevice_SetFullscreen(p, a)                      (p)->lpVtbl->SetFullscreen(p, a)
 #define IWineD3DDevice_EnumDisplayModes(p,a,b,c,d,e,f)          (p)->lpVtbl->EnumDisplayModes(p,a,b,c,d,e,f)
 #define IWineD3DDevice_EvictManagedResources(p)                 (p)->lpVtbl->EvictManagedResources(p)
 #define IWineD3DDevice_GetAvailableTextureMem(p)                (p)->lpVtbl->GetAvailableTextureMem(p)




More information about the wine-cvs mailing list