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