user32: Retrieve the graphics driver module from gdi32.
This commit is contained in:
parent
5c1a752d61
commit
e17cdb266d
|
@ -25,6 +25,7 @@
|
||||||
#include "wingdi.h"
|
#include "wingdi.h"
|
||||||
#include "winuser.h"
|
#include "winuser.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "wine/gdi_driver.h"
|
||||||
|
|
||||||
#include "user_private.h"
|
#include "user_private.h"
|
||||||
|
|
||||||
|
@ -36,38 +37,18 @@ static DWORD driver_load_error;
|
||||||
/* load the graphics driver */
|
/* load the graphics driver */
|
||||||
static const USER_DRIVER *load_driver(void)
|
static const USER_DRIVER *load_driver(void)
|
||||||
{
|
{
|
||||||
char buffer[MAX_PATH], libname[32], *name, *next;
|
static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0};
|
||||||
HKEY hkey;
|
HDC hdc;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
HMODULE graphics_driver;
|
HMODULE graphics_driver;
|
||||||
USER_DRIVER *driver, *prev;
|
USER_DRIVER *driver, *prev;
|
||||||
|
|
||||||
strcpy( buffer, "x11" ); /* default value */
|
|
||||||
/* @@ 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)
|
|
||||||
{
|
|
||||||
next = strchr( name, ',' );
|
|
||||||
if (next) *next++ = 0;
|
|
||||||
|
|
||||||
snprintf( libname, sizeof(libname), "wine%s.drv", name );
|
|
||||||
if ((graphics_driver = LoadLibraryA( libname )) != 0) break;
|
|
||||||
name = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!graphics_driver)
|
|
||||||
driver_load_error = GetLastError();
|
|
||||||
|
|
||||||
driver = HeapAlloc( GetProcessHeap(), 0, sizeof(*driver) );
|
driver = HeapAlloc( GetProcessHeap(), 0, sizeof(*driver) );
|
||||||
*driver = null_driver;
|
*driver = null_driver;
|
||||||
|
|
||||||
|
hdc = CreateDCW( displayW, NULL, NULL, NULL );
|
||||||
|
|
||||||
|
graphics_driver = __wine_get_driver_module( hdc );
|
||||||
if (graphics_driver)
|
if (graphics_driver)
|
||||||
{
|
{
|
||||||
#define GET_USER_FUNC(name) \
|
#define GET_USER_FUNC(name) \
|
||||||
|
@ -129,15 +110,18 @@ static const USER_DRIVER *load_driver(void)
|
||||||
GET_USER_FUNC(WindowPosChanged);
|
GET_USER_FUNC(WindowPosChanged);
|
||||||
#undef GET_USER_FUNC
|
#undef GET_USER_FUNC
|
||||||
}
|
}
|
||||||
|
else driver_load_error = GetLastError();
|
||||||
|
|
||||||
prev = InterlockedCompareExchangePointer( (void **)&USER_Driver, driver, &lazy_load_driver );
|
prev = InterlockedCompareExchangePointer( (void **)&USER_Driver, driver, &lazy_load_driver );
|
||||||
if (prev != &lazy_load_driver)
|
if (prev != &lazy_load_driver)
|
||||||
{
|
{
|
||||||
/* another thread beat us to it */
|
/* another thread beat us to it */
|
||||||
HeapFree( GetProcessHeap(), 0, driver );
|
HeapFree( GetProcessHeap(), 0, driver );
|
||||||
FreeLibrary( graphics_driver );
|
|
||||||
driver = prev;
|
driver = prev;
|
||||||
}
|
}
|
||||||
|
else LdrAddRefDll( 0, graphics_driver );
|
||||||
|
|
||||||
|
DeleteDC( hdc );
|
||||||
return driver;
|
return driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,7 +318,7 @@ static BOOL CDECL nulldrv_CreateWindow( HWND hwnd )
|
||||||
switch (driver_load_error)
|
switch (driver_load_error)
|
||||||
{
|
{
|
||||||
case ERROR_MOD_NOT_FOUND:
|
case ERROR_MOD_NOT_FOUND:
|
||||||
MESSAGE( "The X11 driver is missing. Check your build!\n" );
|
MESSAGE( "The graphics driver is missing. Check your build!\n" );
|
||||||
break;
|
break;
|
||||||
case ERROR_DLL_INIT_FAILED:
|
case ERROR_DLL_INIT_FAILED:
|
||||||
MESSAGE( "Make sure that your X server is running and that $DISPLAY is set correctly.\n" );
|
MESSAGE( "Make sure that your X server is running and that $DISPLAY is set correctly.\n" );
|
||||||
|
|
Loading…
Reference in New Issue