[PATCH 3/5] ddraw: Setup the device window in SetCooperativeLevel().

Henri Verbeet hverbeet at codeweavers.com
Mon Nov 8 04:50:33 CST 2010


---
 dlls/d3d8/device.c             |    9 ++++++++-
 dlls/d3d9/device.c             |   26 ++++++++++++++++++--------
 dlls/ddraw/ddraw.c             |   37 +++++++++++++++++++++++--------------
 dlls/ddraw/tests/d3d.c         |    3 +++
 dlls/ddraw/tests/ddrawmodes.c  |    2 +-
 dlls/wined3d/device.c          |   14 +++++++++-----
 dlls/wined3d/swapchain.c       |    7 -------
 dlls/wined3d/wined3d_private.h |    2 --
 include/wine/wined3d.idl       |    8 ++++++++
 9 files changed, 70 insertions(+), 38 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 03a97b6..7700dfb 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -2855,7 +2855,9 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
 
     if (!parameters->Windowed)
     {
-        if (!focus_window) focus_window = parameters->hDeviceWindow;
+        HWND device_window = parameters->hDeviceWindow;
+
+        if (!focus_window) focus_window = device_window;
         if (FAILED(hr = IWineD3DDevice_AcquireFocusWindow(device->WineD3DDevice, focus_window)))
         {
             ERR("Failed to acquire focus window, hr %#x.\n", hr);
@@ -2864,6 +2866,11 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
             HeapFree(GetProcessHeap(), 0, device->handle_table.entries);
             return hr;
         }
+
+        if (!device_window) device_window = focus_window;
+        IWineD3DDevice_SetupFullscreenWindow(device->WineD3DDevice, device_window,
+                parameters->BackBufferWidth,
+                parameters->BackBufferHeight);
     }
 
     if (flags & D3DCREATE_MULTITHREADED) IWineD3DDevice_SetMultithreaded(device->WineD3DDevice);
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index c0b8b74..b097ece 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -3271,6 +3271,16 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
         return hr;
     }
 
+    if (flags & D3DCREATE_ADAPTERGROUP_DEVICE)
+    {
+        WINED3DCAPS caps;
+
+        IWineD3D_GetDeviceCaps(wined3d, adapter, device_type, &caps);
+        count = caps.NumberOfAdaptersInGroup;
+    }
+
+    if (flags & D3DCREATE_MULTITHREADED) IWineD3DDevice_SetMultithreaded(device->WineD3DDevice);
+
     if (!parameters->Windowed)
     {
         if (!focus_window) focus_window = parameters->hDeviceWindow;
@@ -3281,18 +3291,18 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
             wined3d_mutex_unlock();
             return hr;
         }
-    }
 
-    if (flags & D3DCREATE_ADAPTERGROUP_DEVICE)
-    {
-        WINED3DCAPS caps;
+        for (i = 0; i < count; ++i)
+        {
+            HWND device_window = parameters[i].hDeviceWindow;
 
-        IWineD3D_GetDeviceCaps(wined3d, adapter, device_type, &caps);
-        count = caps.NumberOfAdaptersInGroup;
+            if (!device_window) device_window = focus_window;
+            IWineD3DDevice_SetupFullscreenWindow(device->WineD3DDevice, device_window,
+                    parameters[i].BackBufferWidth,
+                    parameters[i].BackBufferHeight);
+        }
     }
 
-    if (flags & D3DCREATE_MULTITHREADED) IWineD3DDevice_SetMultithreaded(device->WineD3DDevice);
-
     wined3d_parameters = HeapAlloc(GetProcessHeap(), 0, sizeof(*wined3d_parameters) * count);
     if (!wined3d_parameters)
     {
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 20f743f..512fd8e 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -644,24 +644,31 @@ static HRESULT WINAPI ddraw7_SetCooperativeLevel(IDirectDraw7 *iface, HWND hwnd,
      }
 
     /* Do we switch from fullscreen to non-fullscreen ? */
-
-    if( !(cooplevel & DDSCL_FULLSCREEN) && (This->cooperative_level & DDSCL_FULLSCREEN) )
+    if (!(cooplevel & DDSCL_FULLSCREEN) && (This->cooperative_level & DDSCL_FULLSCREEN))
+    {
         IWineD3DDevice_ReleaseFocusWindow(This->wineD3DDevice);
+        IWineD3DDevice_RestoreFullscreenWindow(This->wineD3DDevice, This->dest_window);
+    }
 
     /* Don't override focus windows or private device windows */
-    if( hwnd && !This->focuswindow && !This->devicewindow && (hwnd != window))
+    if (hwnd && !This->focuswindow && !This->devicewindow && (hwnd != window))
     {
-         if( cooplevel & DDSCL_FULLSCREEN )
-         {
-             HRESULT hr = IWineD3DDevice_AcquireFocusWindow(This->wineD3DDevice, hwnd);
-             if (FAILED(hr))
-             {
-                 ERR("Failed to acquire focus window, hr %#x.\n", hr);
-                 LeaveCriticalSection(&ddraw_cs);
-                 return hr;
-             }
-         }
-         This->dest_window = hwnd;
+        if (cooplevel & DDSCL_FULLSCREEN)
+        {
+            WINED3DDISPLAYMODE display_mode;
+            HRESULT hr;
+
+            IWineD3D_GetAdapterDisplayMode(This->wineD3D, WINED3DADAPTER_DEFAULT, &display_mode);
+            IWineD3DDevice_SetupFullscreenWindow(This->wineD3DDevice, hwnd, display_mode.Width, display_mode.Height);
+            hr = IWineD3DDevice_AcquireFocusWindow(This->wineD3DDevice, hwnd);
+            if (FAILED(hr))
+            {
+                ERR("Failed to acquire focus window, hr %#x.\n", hr);
+                LeaveCriticalSection(&ddraw_cs);
+                return hr;
+            }
+        }
+        This->dest_window = hwnd;
     }
 
     if(cooplevel & DDSCL_CREATEDEVICEWINDOW)
@@ -797,6 +804,8 @@ static HRESULT ddraw_set_display_mode(IDirectDraw7 *iface, DWORD Width, DWORD He
     hr = IWineD3DDevice_SetDisplayMode(This->wineD3DDevice,
                                        0, /* First swapchain */
                                        &Mode);
+    IWineD3DDevice_RestoreFullscreenWindow(This->wineD3DDevice, This->dest_window);
+    IWineD3DDevice_SetupFullscreenWindow(This->wineD3DDevice, This->dest_window, Width, Height);
     LeaveCriticalSection(&ddraw_cs);
     switch(hr)
     {
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index afa1d84..9066e4e 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -3273,6 +3273,9 @@ static void test_wndproc(void)
     static const UINT messages[] =
     {
         WM_WINDOWPOSCHANGING,
+        WM_MOVE,
+        WM_SIZE,
+        WM_WINDOWPOSCHANGING,
         WM_ACTIVATE,
         WM_SETFOCUS,
         0,
diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c
index 0ced9da..a103d65 100644
--- a/dlls/ddraw/tests/ddrawmodes.c
+++ b/dlls/ddraw/tests/ddrawmodes.c
@@ -779,7 +779,7 @@ static void testcooperativelevels_exclusive(void)
     /* rect_before_create is assumed to hold the screen rect */
     GetClientRect(hwnd, &window_rect);
     rc = EqualRect(&rect_before_create, &window_rect);
-    todo_wine ok(rc!=0, "Fullscreen window has wrong size\n");
+    ok(rc, "Fullscreen window has wrong size.\n");
 
     /* Set the focus window. Should fail */
     rc = IDirectDraw_SetCooperativeLevel(lpDD,
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8030bc3..ed3df0a 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1767,8 +1767,9 @@ static LONG fullscreen_exstyle(LONG exstyle)
     return exstyle;
 }
 
-void device_setup_fullscreen_window(IWineD3DDeviceImpl *device, HWND window, UINT w, UINT h)
+static void WINAPI IWineD3DDeviceImpl_SetupFullscreenWindow(IWineD3DDevice *iface, HWND window, UINT w, UINT h)
 {
+    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
     BOOL filter_messages;
     LONG style, exstyle;
 
@@ -1799,8 +1800,9 @@ void device_setup_fullscreen_window(IWineD3DDeviceImpl *device, HWND window, UIN
     device->filter_messages = filter_messages;
 }
 
-void device_restore_fullscreen_window(IWineD3DDeviceImpl *device, HWND window)
+static void WINAPI IWineD3DDeviceImpl_RestoreFullscreenWindow(IWineD3DDevice *iface, HWND window)
 {
+    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
     BOOL filter_messages;
     LONG style, exstyle;
 
@@ -6454,7 +6456,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice *iface,
                 }
 
                 /* switch from windowed to fs */
-                device_setup_fullscreen_window(This, swapchain->device_window,
+                IWineD3DDevice_SetupFullscreenWindow(iface, swapchain->device_window,
                         pPresentationParameters->BackBufferWidth,
                         pPresentationParameters->BackBufferHeight);
             }
@@ -6469,7 +6471,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice *iface,
         else if (!swapchain->presentParms.Windowed)
         {
             /* Fullscreen -> windowed switch */
-            device_restore_fullscreen_window(This, swapchain->device_window);
+            IWineD3DDevice_RestoreFullscreenWindow(iface, swapchain->device_window);
             IWineD3DDevice_ReleaseFocusWindow(iface);
         }
         swapchain->presentParms.Windowed = pPresentationParameters->Windowed;
@@ -6485,7 +6487,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice *iface,
          */
         This->style = 0;
         This->exStyle = 0;
-        device_setup_fullscreen_window(This, swapchain->device_window,
+        IWineD3DDevice_SetupFullscreenWindow(iface, swapchain->device_window,
                 pPresentationParameters->BackBufferWidth,
                 pPresentationParameters->BackBufferHeight);
         This->style = style;
@@ -6888,6 +6890,8 @@ static const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
     IWineD3DDeviceImpl_GetSurfaceFromDC,
     IWineD3DDeviceImpl_AcquireFocusWindow,
     IWineD3DDeviceImpl_ReleaseFocusWindow,
+    IWineD3DDeviceImpl_SetupFullscreenWindow,
+    IWineD3DDeviceImpl_RestoreFullscreenWindow,
 };
 
 HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 006f353..c0467db 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -581,13 +581,6 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
     swapchain->win_handle = window;
     swapchain->device_window = window;
 
-    if (!present_parameters->Windowed && window)
-    {
-        device_setup_fullscreen_window(device, window,
-                present_parameters->BackBufferWidth,
-                present_parameters->BackBufferHeight);
-    }
-
     IWineD3D_GetAdapterDisplayMode(device->wined3d, adapter->ordinal, &mode);
     swapchain->orig_width = mode.Width;
     swapchain->orig_height = mode.Height;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 39b5734..f8550d1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1773,8 +1773,6 @@ LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window, BOOL uni
         UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
 void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
 void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
-void device_restore_fullscreen_window(IWineD3DDeviceImpl *device, HWND hwnd) DECLSPEC_HIDDEN;
-void device_setup_fullscreen_window(IWineD3DDeviceImpl *device, HWND hwnd, UINT w, UINT h) DECLSPEC_HIDDEN;
 void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
         BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) DECLSPEC_HIDDEN;
 void device_switch_onscreen_ds(IWineD3DDeviceImpl *device, struct wined3d_context *context,
diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl
index c816a29..8876c3b 100644
--- a/include/wine/wined3d.idl
+++ b/include/wine/wined3d.idl
@@ -3374,6 +3374,14 @@ interface IWineD3DDevice : IUnknown
     );
     void ReleaseFocusWindow(
     );
+    void SetupFullscreenWindow(
+        [in] HWND window,
+        [in] UINT w,
+        [in] UINT h
+    );
+    void RestoreFullscreenWindow(
+        [in] HWND window
+    );
 }
 
 IWineD3D * __stdcall WineDirect3DCreate(UINT dxVersion, void *parent);
-- 
1.7.2.2




More information about the wine-patches mailing list