Module: wine Branch: master Commit: 3e6313050bff97a720026735ca2f267575edeb26 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3e6313050bff97a720026735ca...
Author: Henri Verbeet hverbeet@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");