| /* |
| * Graphics driver management functions |
| * |
| * Copyright 1996 Alexandre Julliard |
| */ |
| |
| #include "gdi.h" |
| #include "heap.h" |
| #include "debug.h" |
| #include <string.h> |
| |
| typedef struct tagGRAPHICS_DRIVER |
| { |
| struct tagGRAPHICS_DRIVER *next; |
| LPSTR name; |
| const DC_FUNCTIONS *funcs; |
| } GRAPHICS_DRIVER; |
| |
| static GRAPHICS_DRIVER *firstDriver = NULL; |
| static GRAPHICS_DRIVER *genericDriver = NULL; |
| |
| /********************************************************************** |
| * DRIVER_RegisterDriver |
| */ |
| BOOL32 DRIVER_RegisterDriver( LPCSTR name, const DC_FUNCTIONS *funcs ) |
| { |
| GRAPHICS_DRIVER *driver = HeapAlloc( SystemHeap, 0, sizeof(*driver) ); |
| if (!driver) return FALSE; |
| driver->funcs = funcs; |
| if (name) |
| { |
| driver->name = HEAP_strdupA( SystemHeap, 0, name ); |
| driver->next = firstDriver; |
| firstDriver = driver; |
| return TRUE; |
| } |
| /* No name -> it's the generic driver */ |
| if (genericDriver) |
| { |
| WARN(driver, " already a generic driver\n" ); |
| HeapFree( SystemHeap, 0, driver ); |
| return FALSE; |
| } |
| driver->name = NULL; |
| genericDriver = driver; |
| return TRUE; |
| } |
| |
| |
| /********************************************************************** |
| * DRIVER_FindDriver |
| */ |
| const DC_FUNCTIONS *DRIVER_FindDriver( LPCSTR name ) |
| { |
| GRAPHICS_DRIVER *driver = firstDriver; |
| |
| while (driver && name) |
| { |
| if (!strcasecmp( driver->name, name )) return driver->funcs; |
| driver = driver->next; |
| } |
| return genericDriver ? genericDriver->funcs : NULL; |
| } |
| |
| |
| /********************************************************************** |
| * DRIVER_UnregisterDriver |
| */ |
| BOOL32 DRIVER_UnregisterDriver( LPCSTR name ) |
| { |
| if (name) |
| { |
| GRAPHICS_DRIVER **ppDriver = &firstDriver; |
| while (*ppDriver) |
| { |
| if (!strcasecmp( (*ppDriver)->name, name )) |
| { |
| GRAPHICS_DRIVER *driver = *ppDriver; |
| (*ppDriver) = driver->next; |
| HeapFree( SystemHeap, 0, driver->name ); |
| HeapFree( SystemHeap, 0, driver ); |
| return TRUE; |
| } |
| ppDriver = &(*ppDriver)->next; |
| } |
| return FALSE; |
| } |
| else |
| { |
| if (!genericDriver) return FALSE; |
| HeapFree( SystemHeap, 0, genericDriver ); |
| genericDriver = NULL; |
| return TRUE; |
| } |
| } |