[PATCH] D3D: Remove IWineD3DDevice::SetHwnd=0A=

Stefan Doesinger stefan at codeweavers.com
Tue Aug 5 14:24:10 CDT 2008


=0A=
The window handle can now be communicated via=0A=
CreateAdditionalSwapChain=0A=
=0A=
The DDraw API theoretically allows to change the window after=0A=
creating a primary surface, but the msdn says this is not valid.=0A=
This is untested so far, but even if it was possible the old code=0A=
wouldn't have been able to handle this. If we have to handle it,=0A=
we can use the dest window override of the swapchain, which a=0A=
later patch will do for clippers=0A=
---=0A=
 dlls/ddraw/ddraw.c               |   34 =
+++++++---------------------------=0A=
 dlls/ddraw/ddraw_private.h       |    1 +=0A=
 dlls/wined3d/device.c            |   36 =
++++++------------------------------=0A=
 include/wine/wined3d_interface.h |    4 ----=0A=
 4 files changed, 14 insertions(+), 61 deletions(-)=0A=
=0A=
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c=0A=
index d037769..6ae0269 100644=0A=
--- a/dlls/ddraw/ddraw.c=0A=
+++ b/dlls/ddraw/ddraw.c=0A=
@@ -357,7 +357,6 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 =
*iface,=0A=
 {=0A=
     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);=0A=
     HWND window;=0A=
-    HRESULT hr;=0A=
 =0A=
     TRACE("(%p)->(%p,%08x)\n",This,hwnd,cooplevel);=0A=
     DDRAW_dump_cooperativelevel(cooplevel);=0A=
@@ -365,13 +364,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 =
*iface,=0A=
     EnterCriticalSection(&ddraw_cs);=0A=
 =0A=
     /* Get the old window */=0A=
-    hr =3D IWineD3DDevice_GetHWND(This->wineD3DDevice, &window);=0A=
-    if(hr !=3D D3D_OK)=0A=
-    {=0A=
-        ERR("IWineD3DDevice::GetHWND failed, hr =3D %08x\n", hr);=0A=
-        LeaveCriticalSection(&ddraw_cs);=0A=
-        return hr;=0A=
-    }=0A=
+    window =3D This->dest_window;=0A=
 =0A=
     /* Tests suggest that we need one of them: */=0A=
     if(!(cooplevel & (DDSCL_SETFOCUSWINDOW |=0A=
@@ -413,7 +406,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 =
*iface,=0A=
         hwnd =3D NULL;=0A=
 =0A=
         /* Use the focus window for drawing too */=0A=
-        IWineD3DDevice_SetHWND(This->wineD3DDevice, This->focuswindow);=0A=
+        This->dest_window =3D This->focuswindow;=0A=
 =0A=
         /* Destroy the device window, if we have one */=0A=
         if(This->devicewindow)=0A=
@@ -450,7 +443,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 =
*iface,=0A=
             !(This->devicewindow) &&=0A=
             (hwnd !=3D window) )=0A=
         {=0A=
-            IWineD3DDevice_SetHWND(This->wineD3DDevice, hwnd);=0A=
+            This->dest_window =3D hwnd;=0A=
         }=0A=
 =0A=
         IWineD3DDevice_SetFullscreen(This->wineD3DDevice,=0A=
@@ -483,7 +476,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 =
*iface,=0A=
             !(This->devicewindow) &&=0A=
             (hwnd !=3D window) )=0A=
         {=0A=
-            IWineD3DDevice_SetHWND(This->wineD3DDevice, hwnd);=0A=
+            This->dest_window =3D hwnd;=0A=
         }=0A=
     }=0A=
     else if(cooplevel & DDSCL_EXCLUSIVE)=0A=
@@ -507,8 +500,8 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 =
*iface,=0A=
             ShowWindow(devicewindow, SW_SHOW);   /* Just to be sure */=0A=
             TRACE("(%p) Created a DDraw device window. HWND=3D%p\n", =
This, devicewindow);=0A=
 =0A=
-            IWineD3DDevice_SetHWND(This->wineD3DDevice, devicewindow);=0A=
             This->devicewindow =3D devicewindow;=0A=
+            This->dest_window =3D devicewindow;=0A=
         }=0A=
     }=0A=
 =0A=
@@ -3195,11 +3188,7 @@ static HRESULT WINAPI =
IDirectDrawImpl_CreateGDISwapChain(IDirectDrawImpl *This,=0A=
     WINED3DPRESENT_PARAMETERS presentation_parameters;=0A=
     HWND window;=0A=
 =0A=
-    hr =3D IWineD3DDevice_GetHWND(This->wineD3DDevice,=0A=
-                                &window);=0A=
-    if(FAILED(hr)) {=0A=
-        return hr;=0A=
-    }=0A=
+    window =3D This->dest_window;=0A=
 =0A=
     memset(&presentation_parameters, 0, =
sizeof(presentation_parameters));=0A=
 =0A=
@@ -3253,21 +3242,12 @@ IDirectDrawImpl_AttachD3DDevice(IDirectDrawImpl =
*This,=0A=
                                 IDirectDrawSurfaceImpl *primary)=0A=
 {=0A=
     HRESULT hr;=0A=
-    HWND                  window;=0A=
+    HWND                  window =3D This->dest_window;=0A=
 =0A=
     WINED3DPRESENT_PARAMETERS localParameters;=0A=
 =0A=
     TRACE("(%p)->(%p)\n", This, primary);=0A=
 =0A=
-    /* Get the window */=0A=
-    hr =3D IWineD3DDevice_GetHWND(This->wineD3DDevice,=0A=
-                                &window);=0A=
-    if(hr !=3D D3D_OK)=0A=
-    {=0A=
-        ERR("IWineD3DDevice::GetHWND failed\n");=0A=
-        return hr;=0A=
-    }=0A=
-=0A=
     /* If there's no window, create a hidden window. WineD3D needs it */=0A=
     if(window =3D=3D 0)=0A=
     {=0A=
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h=0A=
index b7816d7..a92f7f4 100644=0A=
--- a/dlls/ddraw/ddraw_private.h=0A=
+++ b/dlls/ddraw/ddraw_private.h=0A=
@@ -137,6 +137,7 @@ struct IDirectDrawImpl=0A=
     /* Various HWNDs */=0A=
     HWND                    focuswindow;=0A=
     HWND                    devicewindow;=0A=
+    HWND                    dest_window;=0A=
 =0A=
     /* The surface type to request */=0A=
     WINED3DSURFTYPE         ImplType;=0A=
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c=0A=
index abcd90f..b89db16 100644=0A=
--- a/dlls/wined3d/device.c=0A=
+++ b/dlls/wined3d/device.c=0A=
@@ -1432,7 +1432,12 @@ static HRESULT WINAPI =
IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic=0A=
     if (!object->win_handle) {=0A=
         object->win_handle =3D This->createParms.hFocusWindow;=0A=
     }=0A=
-    if(!This->ddraw_window) IWineD3DDevice_SetHWND(iface, =
object->win_handle);=0A=
+    if(!This->ddraw_window) {=0A=
+        if(This->ddraw_fullscreen && object->win_handle) {=0A=
+            IWineD3DDeviceImpl_SetupFullscreenWindow(iface, =
object->win_handle);=0A=
+        }=0A=
+        This->ddraw_window =3D object->win_handle;=0A=
+    }=0A=
 =0A=
     hDc                =3D GetDC(object->win_handle);=0A=
     TRACE("Using hDc %p\n", hDc);=0A=
@@ -4827,31 +4832,6 @@ static HRESULT WINAPI =
IWineD3DDeviceImpl_GetDisplayMode(IWineD3DDevice *iface, U=0A=
     return hr;=0A=
 }=0A=
 =0A=
-static HRESULT WINAPI IWineD3DDeviceImpl_SetHWND(IWineD3DDevice *iface, =
HWND hWnd) {=0A=
-    IWineD3DDeviceImpl *This =3D (IWineD3DDeviceImpl *)iface;=0A=
-    TRACE("(%p)->(%p)\n", This, hWnd);=0A=
-=0A=
-    if(This->ddraw_fullscreen) {=0A=
-        if(This->ddraw_window && This->ddraw_window !=3D hWnd) {=0A=
-            IWineD3DDeviceImpl_RestoreWindow(iface, This->ddraw_window);=0A=
-        }=0A=
-        if(hWnd && This->ddraw_window !=3D hWnd) {=0A=
-            IWineD3DDeviceImpl_SetupFullscreenWindow(iface, hWnd);=0A=
-        }=0A=
-    }=0A=
-=0A=
-    This->ddraw_window =3D hWnd;=0A=
-    return WINED3D_OK;=0A=
-}=0A=
-=0A=
-static HRESULT WINAPI IWineD3DDeviceImpl_GetHWND(IWineD3DDevice *iface, =
HWND *hWnd) {=0A=
-    IWineD3DDeviceImpl *This =3D (IWineD3DDeviceImpl *)iface;=0A=
-    TRACE("(%p)->(%p)\n", This, hWnd);=0A=
-=0A=
-    *hWnd =3D This->ddraw_window;=0A=
-    return WINED3D_OK;=0A=
-}=0A=
-=0A=
 /*****=0A=
  * Stateblock related functions=0A=
  *****/=0A=
@@ -7734,8 +7714,6 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =3D=0A=
     IWineD3DDeviceImpl_GetDirect3D,=0A=
     IWineD3DDeviceImpl_GetDisplayMode,=0A=
     IWineD3DDeviceImpl_SetDisplayMode,=0A=
-    IWineD3DDeviceImpl_GetHWND,=0A=
-    IWineD3DDeviceImpl_SetHWND,=0A=
     IWineD3DDeviceImpl_GetNumberOfSwapChains,=0A=
     IWineD3DDeviceImpl_GetRasterStatus,=0A=
     IWineD3DDeviceImpl_GetSwapChain,=0A=
@@ -7882,8 +7860,6 @@ const IWineD3DDeviceVtbl =
IWineD3DDevice_DirtyConst_Vtbl =3D=0A=
     IWineD3DDeviceImpl_GetDirect3D,=0A=
     IWineD3DDeviceImpl_GetDisplayMode,=0A=
     IWineD3DDeviceImpl_SetDisplayMode,=0A=
-    IWineD3DDeviceImpl_GetHWND,=0A=
-    IWineD3DDeviceImpl_SetHWND,=0A=
     IWineD3DDeviceImpl_GetNumberOfSwapChains,=0A=
     IWineD3DDeviceImpl_GetRasterStatus,=0A=
     IWineD3DDeviceImpl_GetSwapChain,=0A=
diff --git a/include/wine/wined3d_interface.h =
b/include/wine/wined3d_interface.h=0A=
index e8b4d94..72ee7fd 100644=0A=
--- a/include/wine/wined3d_interface.h=0A=
+++ b/include/wine/wined3d_interface.h=0A=
@@ -387,8 +387,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase)=0A=
     STDMETHOD(GetDirect3D)(THIS_ IWineD3D** ppD3D) PURE;=0A=
     STDMETHOD(GetDisplayMode)(THIS_ UINT iSwapChain, =
WINED3DDISPLAYMODE* pMode) PURE;=0A=
     STDMETHOD(SetDisplayMode)(THIS_ UINT iSwapChain, =
WINED3DDISPLAYMODE* pMode) PURE;=0A=
-    STDMETHOD(GetHWND)(THIS_ HWND *hwnd) PURE;=0A=
-    STDMETHOD(SetHWND)(THIS_ HWND hwnd) PURE;=0A=
     STDMETHOD_(UINT, GetNumberOfSwapChains)(THIS) PURE;=0A=
     STDMETHOD(GetRasterStatus)(THIS_ UINT iSwapChain, =
WINED3DRASTER_STATUS* pRasterStatus) PURE;=0A=
     STDMETHOD(GetSwapChain)(THIS_ UINT iSwapChain, struct =
IWineD3DSwapChain **pSwapChain) PURE;=0A=
@@ -530,8 +528,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase)=0A=
 #define IWineD3DDevice_GetDirect3D(p,a)                         =
(p)->lpVtbl->GetDirect3D(p,a)=0A=
 #define IWineD3DDevice_GetDisplayMode(p,a,b)                    =
(p)->lpVtbl->GetDisplayMode(p,a,b)=0A=
 #define IWineD3DDevice_SetDisplayMode(p,a,b)                    =
(p)->lpVtbl->SetDisplayMode(p,a,b)=0A=
-#define IWineD3DDevice_GetHWND(p, a)                            =
(p)->lpVtbl->GetHWND(p, a)=0A=
-#define IWineD3DDevice_SetHWND(p, a)                            =
(p)->lpVtbl->SetHWND(p, a)=0A=
 #define IWineD3DDevice_GetNumberOfSwapChains(p)                 =
(p)->lpVtbl->GetNumberOfSwapChains(p)=0A=
 #define IWineD3DDevice_Reset(p,a)                               =
(p)->lpVtbl->Reset(p,a)=0A=
 #define IWineD3DDevice_SetDialogBoxMode(p,a)                    =
(p)->lpVtbl->SetDialogBoxMode(p,a)=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0015_01C90123.E1A415C0--




More information about the wine-patches mailing list