gdi32: Trigger creation of the desktop window when the display driver is needed.

This commit is contained in:
Alexandre Julliard 2013-10-29 12:43:30 +01:00
parent 9675aa173a
commit 74efeab238
3 changed files with 9 additions and 62 deletions

View File

@ -28,7 +28,6 @@
#include <stdio.h> #include <stdio.h>
#include "windef.h" #include "windef.h"
#include "winbase.h" #include "winbase.h"
#include "winreg.h"
#include "ddrawgdi.h" #include "ddrawgdi.h"
#include "wine/winbase16.h" #include "wine/winbase16.h"
@ -48,7 +47,6 @@ struct graphics_driver
static struct list drivers = LIST_INIT( drivers ); static struct list drivers = LIST_INIT( drivers );
static struct graphics_driver *display_driver; static struct graphics_driver *display_driver;
static DWORD display_driver_load_error;
const struct gdi_dc_funcs *font_driver = NULL; const struct gdi_dc_funcs *font_driver = NULL;
@ -101,48 +99,18 @@ static struct graphics_driver *create_driver( HMODULE module )
*/ */
static const struct gdi_dc_funcs *get_display_driver( HMODULE *module_ret ) static const struct gdi_dc_funcs *get_display_driver( HMODULE *module_ret )
{ {
struct graphics_driver *driver; if (!display_driver)
char buffer[MAX_PATH], libname[32], *name, *next;
HMODULE module = 0;
HKEY hkey;
if (display_driver) goto done;
strcpy( buffer, default_driver );
/* @@ Wine registry key: HKCU\Software\Wine\Drivers */
if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\Drivers", &hkey ))
{ {
DWORD type, count = sizeof(buffer); HMODULE user32 = LoadLibraryA( "user32.dll" );
RegQueryValueExA( hkey, "Graphics", 0, &type, (LPBYTE) buffer, &count ); HWND (WINAPI *pGetDesktopWindow)(void) = (void *)GetProcAddress( user32, "GetDesktopWindow" );
RegCloseKey( hkey );
if (!pGetDesktopWindow() || !display_driver)
{
WARN( "failed to load the display driver, falling back to null driver\n" );
__wine_set_display_driver( 0 );
}
} }
name = buffer;
while (name)
{
next = strchr( name, ',' );
if (next) *next++ = 0;
snprintf( libname, sizeof(libname), "wine%s.drv", name );
if ((module = LoadLibraryA( libname )) != 0) break;
name = next;
}
if (!module) display_driver_load_error = GetLastError();
if (!(driver = create_driver( module )))
{
MESSAGE( "Could not create graphics driver '%s'\n", buffer );
FreeLibrary( module );
ExitProcess(1);
}
if (InterlockedCompareExchangePointer( (void **)&display_driver, driver, NULL ))
{
/* somebody beat us to it */
FreeLibrary( driver->module );
HeapFree( GetProcessHeap(), 0, driver );
}
done:
*module_ret = display_driver->module; *module_ret = display_driver->module;
return display_driver->funcs; return display_driver->funcs;
} }
@ -204,25 +172,6 @@ done:
} }
/***********************************************************************
* __wine_get_driver_module (GDI32.@)
*/
HMODULE CDECL __wine_get_driver_module( HDC hdc )
{
DC *dc;
HMODULE ret = 0;
if ((dc = get_dc_ptr( hdc )))
{
ret = dc->module;
release_dc_ptr( dc );
if (!ret) SetLastError( display_driver_load_error );
}
else SetLastError( ERROR_INVALID_HANDLE );
return ret;
}
/*********************************************************************** /***********************************************************************
* __wine_set_display_driver_module (GDI32.@) * __wine_set_display_driver_module (GDI32.@)
*/ */

View File

@ -514,7 +514,6 @@
@ cdecl __wine_set_visible_region(long long ptr ptr ptr) @ cdecl __wine_set_visible_region(long long ptr ptr ptr)
# Graphics drivers # Graphics drivers
@ cdecl __wine_get_driver_module(long)
@ cdecl __wine_set_display_driver(long) @ cdecl __wine_set_display_driver(long)
# OpenGL # OpenGL

View File

@ -276,7 +276,6 @@ WINGDIAPI WORD WINAPI SetHookFlags(HDC,WORD);
extern void CDECL __wine_make_gdi_object_system( HGDIOBJ handle, BOOL set ); extern void CDECL __wine_make_gdi_object_system( HGDIOBJ handle, BOOL set );
extern void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect, extern void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect,
const RECT *device_rect, struct window_surface *surface ); const RECT *device_rect, struct window_surface *surface );
extern HMODULE CDECL __wine_get_driver_module( HDC hdc );
extern void CDECL __wine_set_display_driver( HMODULE module ); extern void CDECL __wine_set_display_driver( HMODULE module );
extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version ); extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version );