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