[1/3] Make mac driver the default on OS X

Josh DuBois duboisj at codeweavers.com
Tue Mar 5 18:32:13 CST 2013


---
  dlls/gdi32/driver.c       |  102 
+++++++++++++++++++++++++++++++++++++++++++--
  dlls/gdi32/gdi32.spec     |    1 +
  dlls/gdi32/gdi_private.h  |    2 +
  dlls/user32/driver.c      |   27 ++++++------
  include/wine/gdi_driver.h |   11 +++++
  5 files changed, 125 insertions(+), 18 deletions(-)

-------------- next part --------------
>From b13a292df36c2c95e59796112fa9a1ee23719d25 Mon Sep 17 00:00:00 2001
From: Josh DuBois <duboisj at CodeWeavers.com>
Date: Tue, 5 Mar 2013 15:30:03 -0600
Subject: Track and report multiple errors loading display drivers.

---
 dlls/gdi32/driver.c       |  102 +++++++++++++++++++++++++++++++++++++++++++--
 dlls/gdi32/gdi32.spec     |    1 +
 dlls/gdi32/gdi_private.h  |    2 +
 dlls/user32/driver.c      |   27 ++++++------
 include/wine/gdi_driver.h |   11 +++++
 5 files changed, 125 insertions(+), 18 deletions(-)

diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 70208fb..6324a80 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -48,7 +48,24 @@ struct graphics_driver
 
 static struct list drivers = LIST_INIT( drivers );
 static struct graphics_driver *display_driver;
-static DWORD display_driver_load_error;
+static DWORD last_display_driver_load_error;
+
+static display_driver_load_error display_driver_load_errors[] =
+{
+    {
+        "X11",
+        0,
+        0,
+        ""
+    },
+    {
+        "Mac",
+        0,
+        0,
+        ""
+    }
+    
+};
 
 const struct gdi_dc_funcs *font_driver = NULL;
 
@@ -119,11 +136,12 @@ static const struct gdi_dc_funcs *get_display_driver( HMODULE *module_ret )
 
         snprintf( libname, sizeof(libname), "wine%s.drv", name );
         if ((module = LoadLibraryA( libname )) != 0) break;
+
+        set_display_driver_load_error( name );
+
         name = next;
     }
 
-    if (!module) display_driver_load_error = GetLastError();
-
     if (!(driver = create_driver( module )))
     {
         MESSAGE( "Could not create graphics driver '%s'\n", buffer );
@@ -143,6 +161,82 @@ done:
 
 
 /**********************************************************************
+ *	     __wine_get_display_driver_load_errors
+ *
+ * Retrive user-readable information re: why display drivers failed to load.
+ */
+void CDECL __wine_get_display_driver_load_errors( display_driver_load_error **load_errs,
+                                                 int *num_known_drivers )
+{
+    int n = sizeof(display_driver_load_errors) /
+        sizeof(display_driver_load_errors[0]);
+
+    if (load_errs) *load_errs = display_driver_load_errors;
+    if (num_known_drivers) *num_known_drivers = n;
+}
+
+
+/**********************************************************************
+ *	     set_display_driver_load_error
+ *
+ * Set error information after failure to load a display driver.
+ */
+void set_display_driver_load_error( const char *name )
+{
+    display_driver_load_error *load_err = NULL;
+    int n = sizeof(display_driver_load_errors) /
+        sizeof(display_driver_load_errors[0]);
+    int j;
+
+    last_display_driver_load_error = GetLastError();
+
+    for (j = 0; j < n; j++)
+        if (!strcasecmp( display_driver_load_errors[j].name, name ))
+            load_err = &display_driver_load_errors[j];
+
+    if (!load_err)
+    {
+        ERR( "Attempted to load unknown display driver '%s' failed with %d\n",
+             name, last_display_driver_load_error );
+        return;
+    }
+    
+    load_err->load_failed = 1;
+    load_err->err = last_display_driver_load_error;
+
+    if (!strcasecmp( name, "X11" ))
+    {
+        switch (load_err->err)
+        {
+        case ERROR_MOD_NOT_FOUND:
+            load_err->err_msg = "The X11 driver is missing. Check your build!";
+            break;
+        case ERROR_DLL_INIT_FAILED:
+            load_err->err_msg = "Make sure that your X server is running \nand that $DISPLAY is set correctly.";
+            break;
+        default:
+            load_err->err_msg = "Unknown error loding X11 driver.";
+        }
+    } else if (!strcasecmp( name, "Mac" ))
+    {
+        switch (load_err->err)
+        {
+        case ERROR_MOD_NOT_FOUND:
+            load_err->err_msg = "The Mac driver is missing. Check your build!";
+            break;
+        case ERROR_DLL_INIT_FAILED:
+            load_err->err_msg = "Make sure you have permission to create \na window or check for errors with Console.app. \n(The Mac driver cannot do remote display: try X11 if you need that.)";
+            break;
+        default:
+            load_err->err_msg = "Unknown error loding Mac driver.";
+        }
+    } 
+
+    return;
+}
+
+
+/**********************************************************************
  *	     DRIVER_load_driver
  */
 const struct gdi_dc_funcs *DRIVER_load_driver( LPCWSTR name, HMODULE *module_ret )
@@ -210,7 +304,7 @@ HMODULE CDECL __wine_get_driver_module( HDC hdc )
     {
         ret = dc->module;
         release_dc_ptr( dc );
-        if (!ret) SetLastError( display_driver_load_error );
+        if (!ret) SetLastError( last_display_driver_load_error );
     }
     else SetLastError( ERROR_INVALID_HANDLE );
     return ret;
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 65f1d0c..a67a41f 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -515,6 +515,7 @@
 
 # Graphics drivers
 @ cdecl __wine_get_driver_module(long)
+@ cdecl __wine_get_display_driver_load_errors(ptr ptr)
 
 # OpenGL
 @ cdecl __wine_get_wgl_driver(long long)
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index edd4bf6..ebec942 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -526,4 +526,6 @@ extern void free_heap_bits( struct gdi_image_bits *bits ) DECLSPEC_HIDDEN;
 
 extern HMODULE gdi32_module DECLSPEC_HIDDEN;
 
+void set_display_driver_load_error( const char *name );
+
 #endif /* __WINE_GDI_PRIVATE_H */
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index 1c12134..6c66717 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -32,7 +32,6 @@
 static USER_DRIVER null_driver, lazy_load_driver;
 
 const USER_DRIVER *USER_Driver = &lazy_load_driver;
-static DWORD driver_load_error;
 
 /* load the graphics driver */
 static const USER_DRIVER *load_driver(void)
@@ -109,7 +108,6 @@ static const USER_DRIVER *load_driver(void)
         GET_USER_FUNC(SystemParametersInfo);
 #undef GET_USER_FUNC
     }
-    else driver_load_error = GetLastError();
 
     prev = InterlockedCompareExchangePointer( (void **)&USER_Driver, driver, &lazy_load_driver );
     if (prev != &lazy_load_driver)
@@ -299,23 +297,24 @@ static BOOL CDECL nulldrv_CreateDesktopWindow( HWND hwnd )
 static BOOL CDECL nulldrv_CreateWindow( HWND hwnd )
 {
     static int warned;
+    display_driver_load_error *load_errs;
+    int known_drivers;
+    int j;
 
     /* HWND_MESSAGE windows don't need a graphics driver */
     if (GetAncestor( hwnd, GA_PARENT ) == get_user_thread_info()->msg_window) return TRUE;
     if (warned++) return FALSE;
 
-    MESSAGE( "Application tried to create a window, but no driver could be loaded.\n");
-    switch (driver_load_error)
-    {
-    case ERROR_MOD_NOT_FOUND:
-        MESSAGE( "The graphics driver is missing. Check your build!\n" );
-        break;
-    case ERROR_DLL_INIT_FAILED:
-        MESSAGE( "Make sure that your X server is running and that $DISPLAY is set correctly.\n" );
-        break;
-    default:
-        MESSAGE( "Unknown error (%d).\n", driver_load_error );
-    }
+    MESSAGE( "Application tried to create a window, but no display driver could be loaded.\n" );
+
+    __wine_get_display_driver_load_errors( &load_errs, &known_drivers );
+
+    for (j = 0; j < known_drivers; j++)
+        if (load_errs[j].load_failed)
+            MESSAGE( "The %s display driver failed to load: %s (err: %d)\n",
+                    load_errs[j].name, 
+                    load_errs[j].err_msg,
+                    load_errs[j].err );
 
     return FALSE;
 }
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index fffbad0..4ab58fc 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -279,4 +279,15 @@ extern void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis
 extern HMODULE CDECL __wine_get_driver_module( HDC hdc );
 extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version );
 
+typedef struct display_driver_load_error_t
+{
+    const char *name;
+    int load_failed;
+    DWORD err;
+    const char *err_msg;
+} display_driver_load_error;
+
+void CDECL __wine_get_display_driver_load_errors( display_driver_load_error **load_errs, 
+                                                  int *num_known_drivers );
+
 #endif /* __WINE_WINE_GDI_DRIVER_H */
-- 
1.7.7.4



More information about the wine-patches mailing list