2 * Graphics driver management functions
4 * Copyright 1996 Alexandre Julliard
11 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( SystemHeap
, 0, sizeof(*driver
) );
30 if (!driver
) return FALSE
;
31 driver
->funcs
= funcs
;
34 driver
->name
= HEAP_strdupA( SystemHeap
, 0, name
);
35 driver
->next
= firstDriver
;
39 /* No name -> it's the generic driver */
42 WARN(driver
, " already a generic driver\n" );
43 HeapFree( SystemHeap
, 0, driver
);
47 genericDriver
= driver
;
52 /**********************************************************************
55 const DC_FUNCTIONS
*DRIVER_FindDriver( LPCSTR name
)
57 GRAPHICS_DRIVER
*driver
= firstDriver
;
59 while (driver
&& name
)
61 if (!strcasecmp( driver
->name
, name
)) return driver
->funcs
;
62 driver
= driver
->next
;
64 return genericDriver
? genericDriver
->funcs
: NULL
;
68 /**********************************************************************
69 * DRIVER_UnregisterDriver
71 BOOL
DRIVER_UnregisterDriver( LPCSTR name
)
75 GRAPHICS_DRIVER
**ppDriver
= &firstDriver
;
78 if (!strcasecmp( (*ppDriver
)->name
, name
))
80 GRAPHICS_DRIVER
*driver
= *ppDriver
;
81 (*ppDriver
) = driver
->next
;
82 HeapFree( SystemHeap
, 0, driver
->name
);
83 HeapFree( SystemHeap
, 0, driver
);
86 ppDriver
= &(*ppDriver
)->next
;
92 if (!genericDriver
) return FALSE
;
93 HeapFree( SystemHeap
, 0, genericDriver
);