ddraw: Setup the device window in SetCooperativeLevel().

This commit is contained in:
Henri Verbeet 2010-11-08 11:50:33 +01:00 committed by Alexandre Julliard
parent b898130a11
commit 7e3985e1fe
9 changed files with 72 additions and 40 deletions

View File

@ -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);

View File

@ -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;
}
for (i = 0; i < count; ++i)
{
HWND device_window = parameters[i].hDeviceWindow;
if (!device_window) device_window = focus_window;
IWineD3DDevice_SetupFullscreenWindow(device->WineD3DDevice, device_window,
parameters[i].BackBufferWidth,
parameters[i].BackBufferHeight);
}
}
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);
wined3d_parameters = HeapAlloc(GetProcessHeap(), 0, sizeof(*wined3d_parameters) * count);
if (!wined3d_parameters)
{

View File

@ -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)
{

View File

@ -3272,6 +3272,9 @@ static void test_wndproc(void)
static const UINT messages[] =
{
WM_WINDOWPOSCHANGING,
WM_MOVE,
WM_SIZE,
WM_WINDOWPOSCHANGING,
WM_ACTIVATE,
WM_SETFOCUS,

View File

@ -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,

View File

@ -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,

View File

@ -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;

View File

@ -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,

View File

@ -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);