Henri Verbeet : ddraw: Handle the special DDSCL_SETFOCUSWINDOW | DDSCL_CREATEDEVICEWINDOW combination .

Alexandre Julliard julliard at winehq.org
Fri Dec 23 13:03:22 CST 2011


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Dec 22 21:51:21 2011 +0100

ddraw: Handle the special DDSCL_SETFOCUSWINDOW | DDSCL_CREATEDEVICEWINDOW combination.

---

 dlls/ddraw/ddraw.c        |   42 ++++++++++++++++++++++++++++++------------
 dlls/ddraw/tests/ddraw1.c |    4 ++--
 dlls/ddraw/tests/ddraw2.c |    4 ++--
 dlls/ddraw/tests/ddraw4.c |    4 ++--
 dlls/ddraw/tests/ddraw7.c |    4 ++--
 5 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 364e74f..21107f9 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -788,21 +788,20 @@ static HRESULT WINAPI ddraw7_SetCooperativeLevel(IDirectDraw7 *iface, HWND hwnd,
     }
 
     /* Handle those levels first which set various hwnds */
-    if(cooplevel & DDSCL_SETFOCUSWINDOW)
+    if ((cooplevel & DDSCL_SETFOCUSWINDOW) && !(cooplevel & DDSCL_CREATEDEVICEWINDOW))
     {
         /* This isn't compatible with a lot of flags */
-        if(cooplevel & ( DDSCL_MULTITHREADED      |
-                         DDSCL_CREATEDEVICEWINDOW |
-                         DDSCL_FPUSETUP           |
-                         DDSCL_FPUPRESERVE        |
-                         DDSCL_ALLOWREBOOT        |
-                         DDSCL_ALLOWMODEX         |
-                         DDSCL_SETDEVICEWINDOW    |
-                         DDSCL_NORMAL             |
-                         DDSCL_EXCLUSIVE          |
-                         DDSCL_FULLSCREEN         ) )
+        if (cooplevel & (DDSCL_MULTITHREADED
+                | DDSCL_FPUSETUP
+                | DDSCL_FPUPRESERVE
+                | DDSCL_ALLOWREBOOT
+                | DDSCL_ALLOWMODEX
+                | DDSCL_SETDEVICEWINDOW
+                | DDSCL_NORMAL
+                | DDSCL_EXCLUSIVE
+                | DDSCL_FULLSCREEN))
         {
-            TRACE("Called with incompatible flags, returning DDERR_INVALIDPARAMS\n");
+            WARN("Called with incompatible flags, returning DDERR_INVALIDPARAMS.\n");
             wined3d_mutex_unlock();
             return DDERR_INVALIDPARAMS;
         }
@@ -845,7 +844,26 @@ static HRESULT WINAPI ddraw7_SetCooperativeLevel(IDirectDraw7 *iface, HWND hwnd,
             ShowWindow(device_window, SW_SHOW);
             TRACE("Created a device window %p.\n", device_window);
 
+            /* Native apparently leaks the created device window if setting the
+             * focus window below fails. */
+            This->cooperative_level |= DDSCL_CREATEDEVICEWINDOW;
             This->devicewindow = device_window;
+
+            if (cooplevel & DDSCL_SETFOCUSWINDOW)
+            {
+                if (!hwnd)
+                {
+                    wined3d_mutex_unlock();
+                    return DDERR_NOHWND;
+                }
+
+                if (FAILED(hr = ddraw_set_focus_window(This, hwnd)))
+                {
+                    wined3d_mutex_unlock();
+                    return hr;
+                }
+            }
+
             hwnd = device_window;
         }
     }
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 9640bf0..b2f3394 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -89,7 +89,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw_SetCooperativeLevel(ddraw, NULL, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 
@@ -99,7 +99,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw_SetCooperativeLevel(ddraw, focus_window, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index e3e9e86..824250a 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -96,7 +96,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw2_SetCooperativeLevel(ddraw, NULL, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 
@@ -106,7 +106,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw2_SetCooperativeLevel(ddraw, focus_window, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 48f5768..ead2aa3 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -392,7 +392,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 
@@ -402,7 +402,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw4_SetCooperativeLevel(ddraw, focus_window, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 6448ea6..7c400ea 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -385,7 +385,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DDERR_NOHWND, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 
@@ -395,7 +395,7 @@ static void test_coop_level_create_device_window(void)
     ok(!device_window, "Unexpected device window found.\n");
     hr = IDirectDraw7_SetCooperativeLevel(ddraw, focus_window, DDSCL_SETFOCUSWINDOW
             | DDSCL_CREATEDEVICEWINDOW | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
-    todo_wine ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+    ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
     device_window = FindWindowA("DirectDrawDeviceWnd", "DirectDrawDeviceWnd");
     todo_wine ok(!!device_window, "Device window not found.\n");
 




More information about the wine-cvs mailing list