2 * Graphics driver management functions
4 * Copyright 1996 Alexandre Julliard
9 #include "debugtools.h"
11 DEFAULT_DEBUG_CHANNEL(driver);
13 typedef struct tagGRAPHICS_DRIVER
15 struct tagGRAPHICS_DRIVER *next;
17 const DC_FUNCTIONS *funcs;
20 static GRAPHICS_DRIVER *firstDriver;
21 static GRAPHICS_DRIVER *genericDriver;
23 /**********************************************************************
24 * DRIVER_RegisterDriver
26 BOOL DRIVER_RegisterDriver( LPCSTR name, const DC_FUNCTIONS *funcs )
28 GRAPHICS_DRIVER *driver = HeapAlloc( GetProcessHeap(), 0, sizeof(*driver) );
29 if (!driver) return FALSE;
30 driver->funcs = funcs;
33 driver->name = HeapAlloc( GetProcessHeap(), 0, strlen(name)+1 );
34 driver->next = firstDriver;
35 strcpy( driver->name, name );
39 /* No name -> it's the generic driver */
42 WARN(" already a generic driver\n" );
43 HeapFree( GetProcessHeap(), 0, driver );
47 genericDriver = driver;
52 /**********************************************************************
55 const DC_FUNCTIONS *DRIVER_FindDriver( LPCSTR name )
57 GRAPHICS_DRIVER *driver;
60 TRACE(": %s\n", name);
62 if (!name) return genericDriver ? genericDriver->funcs : NULL;
64 for (driver = firstDriver; driver; driver = driver->next)
65 if (!strcasecmp( driver->name, name )) return driver->funcs;
67 if (!(hDriver = LoadLibraryA (name))) return NULL;
69 for (driver = firstDriver; driver; driver = driver->next)
70 if (!strcasecmp( driver->name, name )) return driver->funcs;
72 FreeLibrary (hDriver);
77 /**********************************************************************
78 * DRIVER_UnregisterDriver
80 BOOL DRIVER_UnregisterDriver( LPCSTR name )
84 GRAPHICS_DRIVER **ppDriver = &firstDriver;
87 if (!strcasecmp( (*ppDriver)->name, name ))
89 GRAPHICS_DRIVER *driver = *ppDriver;
90 (*ppDriver) = driver->next;
91 HeapFree( GetProcessHeap(), 0, driver->name );
92 HeapFree( GetProcessHeap(), 0, driver );
95 ppDriver = &(*ppDriver)->next;
101 if (!genericDriver) return FALSE;
102 HeapFree( GetProcessHeap(), 0, genericDriver );
103 genericDriver = NULL;
108 /*****************************************************************************
109 * DRIVER_GetDriverName
112 BOOL DRIVER_GetDriverName( LPCSTR device, LPSTR driver, DWORD size )
115 size = GetProfileStringA("devices", device, "", driver, size);
117 WARN("Unable to find '%s' in [devices] section of win.ini\n", device);
120 p = strchr(driver, ',');
122 WARN("'%s' entry in [devices] section of win.ini is malformed.\n",
127 TRACE("Found '%s' for '%s'\n", driver, device);
131 /*****************************************************************************
134 * This should thunk to 16-bit and simply call the proc with the given args.
136 INT WINAPI GDI_CallDevInstall16( FARPROC16 lpfnDevInstallProc, HWND hWnd,
137 LPSTR lpModelName, LPSTR OldPort, LPSTR NewPort )
139 FIXME("(%p, %04x, %s, %s, %s)\n",
140 lpfnDevInstallProc, hWnd, lpModelName, OldPort, NewPort );
144 /*****************************************************************************
147 * This should load the correct driver for lpszDevice and calls this driver's
148 * ExtDeviceModePropSheet proc.
150 * Note: The driver calls a callback routine for each property sheet page; these
151 * pages are supposed to be filled into the structure pointed to by lpPropSheet.
152 * The layout of this structure is:
158 * HPROPSHEETPAGE pages[10];
161 INT WINAPI GDI_CallExtDeviceModePropSheet16( HWND hWnd, LPCSTR lpszDevice,
162 LPCSTR lpszPort, LPVOID lpPropSheet )
164 FIXME("(%04x, %s, %s, %p)\n",
165 hWnd, lpszDevice, lpszPort, lpPropSheet );
169 /*****************************************************************************
172 * This should load the correct driver for lpszDevice and calls this driver's
173 * ExtDeviceMode proc.
175 INT WINAPI GDI_CallExtDeviceMode16( HWND hwnd,
176 LPDEVMODEA lpdmOutput, LPSTR lpszDevice,
177 LPSTR lpszPort, LPDEVMODEA lpdmInput,
178 LPSTR lpszProfile, DWORD fwMode )
181 const DC_FUNCTIONS *funcs;
183 TRACE("(%04x, %p, %s, %s, %p, %s, %ld)\n",
184 hwnd, lpdmOutput, lpszDevice, lpszPort,
185 lpdmInput, lpszProfile, fwMode );
187 if(!DRIVER_GetDriverName( lpszDevice, buf, sizeof(buf) )) return -1;
188 funcs = DRIVER_FindDriver( buf );
189 if(!funcs || !funcs->pExtDeviceMode) return -1;
190 return funcs->pExtDeviceMode(buf, hwnd, lpdmOutput, lpszDevice, lpszPort,
191 lpdmInput, lpszProfile, fwMode);
194 /****************************************************************************
197 * This should load the correct driver for lpszDevice and calls this driver's
198 * AdvancedSetupDialog proc.
200 INT WINAPI GDI_CallAdvancedSetupDialog16( HWND hwnd, LPSTR lpszDevice,
201 LPDEVMODEA devin, LPDEVMODEA devout )
203 TRACE("(%04x, %s, %p, %p)\n",
204 hwnd, lpszDevice, devin, devout );
208 /*****************************************************************************
211 * This should load the correct driver for lpszDevice and calls this driver's
212 * DeviceCapabilities proc.
214 DWORD WINAPI GDI_CallDeviceCapabilities16( LPCSTR lpszDevice, LPCSTR lpszPort,
215 WORD fwCapability, LPSTR lpszOutput,
219 const DC_FUNCTIONS *funcs;
221 TRACE("(%s, %s, %d, %p, %p)\n",
222 lpszDevice, lpszPort, fwCapability, lpszOutput, lpdm );
225 if(!DRIVER_GetDriverName( lpszDevice, buf, sizeof(buf) )) return -1;
226 funcs = DRIVER_FindDriver( buf );
227 if(!funcs || !funcs->pDeviceCapabilities) return -1;
228 return funcs->pDeviceCapabilities( buf, lpszDevice, lpszPort,
229 fwCapability, lpszOutput, lpdm);