2 * Graphics driver management functions
4 * Copyright 1996 Alexandre Julliard
10 #include "debugtools.h"
12 DEFAULT_DEBUG_CHANNEL(driver
);
14 typedef struct tagGRAPHICS_DRIVER
16 struct tagGRAPHICS_DRIVER
*next
;
18 const DC_FUNCTIONS
*funcs
;
21 static GRAPHICS_DRIVER
*firstDriver
= NULL
;
22 static GRAPHICS_DRIVER
*genericDriver
= NULL
;
24 /**********************************************************************
25 * DRIVER_RegisterDriver
27 BOOL
DRIVER_RegisterDriver( LPCSTR name
, const DC_FUNCTIONS
*funcs
)
29 GRAPHICS_DRIVER
*driver
= HeapAlloc( GetProcessHeap(), 0, sizeof(*driver
) );
30 if (!driver
) return FALSE
;
31 driver
->funcs
= funcs
;
34 driver
->name
= HEAP_strdupA( GetProcessHeap(), 0, name
);
35 driver
->next
= firstDriver
;
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 /*****************************************************************************
132 * GDI_CallDevInstall16 [GDI32.100]
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 /*****************************************************************************
145 * GDI_CallExtDeviceModePropSheet16 [GDI32.101]
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 /*****************************************************************************
170 * GDI_CallExtDeviceMode16 [GDI32.102]
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 /****************************************************************************
195 * GDI_CallAdvancedSetupDialog16 [GDI32.103]
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 /*****************************************************************************
209 * GDI_CallDeviceCapabilities16 [GDI32.104]
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
);