Alexandre Julliard : gdi32: Trigger creation of the desktop window when the display driver is needed.
Alexandre Julliard
julliard at winehq.org
Tue Oct 29 15:12:25 CDT 2013
Module: wine
Branch: master
Commit: 74efeab238558902d1f3f3e8c31035f52d9920d4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=74efeab238558902d1f3f3e8c31035f52d9920d4
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Oct 29 12:43:30 2013 +0100
gdi32: Trigger creation of the desktop window when the display driver is needed.
---
dlls/gdi32/driver.c | 67 +++++---------------------------------------
dlls/gdi32/gdi32.spec | 1 -
include/wine/gdi_driver.h | 1 -
3 files changed, 8 insertions(+), 61 deletions(-)
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 73d11da..99ac146 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -28,7 +28,6 @@
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
-#include "winreg.h"
#include "ddrawgdi.h"
#include "wine/winbase16.h"
@@ -48,7 +47,6 @@ struct graphics_driver
static struct list drivers = LIST_INIT( drivers );
static struct graphics_driver *display_driver;
-static DWORD display_driver_load_error;
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 )
{
- struct graphics_driver *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);
- RegQueryValueExA( hkey, "Graphics", 0, &type, (LPBYTE) buffer, &count );
- RegCloseKey( hkey );
- }
-
- name = buffer;
- while (name)
+ if (!display_driver)
{
- next = strchr( name, ',' );
- if (next) *next++ = 0;
+ HMODULE user32 = LoadLibraryA( "user32.dll" );
+ HWND (WINAPI *pGetDesktopWindow)(void) = (void *)GetProcAddress( user32, "GetDesktopWindow" );
- snprintf( libname, sizeof(libname), "wine%s.drv", name );
- if ((module = LoadLibraryA( libname )) != 0) break;
- name = next;
+ if (!pGetDesktopWindow() || !display_driver)
+ {
+ WARN( "failed to load the display driver, falling back to null driver\n" );
+ __wine_set_display_driver( 0 );
+ }
}
- 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;
return display_driver->funcs;
}
@@ -205,25 +173,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.@)
*/
void CDECL __wine_set_display_driver( HMODULE module )
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index be6410d..6ebad3c 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -514,7 +514,6 @@
@ cdecl __wine_set_visible_region(long long ptr ptr ptr)
# Graphics drivers
-@ cdecl __wine_get_driver_module(long)
@ cdecl __wine_set_display_driver(long)
# OpenGL
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index ad9c7c4..06e4caa 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -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_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect,
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 struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version );
More information about the wine-cvs
mailing list