From 3e6313050bff97a720026735ca2f267575edeb26 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 22 Dec 2011 21:51:21 +0100 Subject: [PATCH] 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 364e74f12d2..21107f9beb7 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 9640bf0bad6..b2f339427ee 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 e3e9e862751..824250ab87e 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 48f5768d5a3..ead2aa3cc8b 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 6448ea66ade..7c400ea8408 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");