1/* 2 * Copyright © 1999 Keith Packard 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that 7 * copyright notice and this permission notice appear in supporting 8 * documentation, and that the name of Keith Packard not be used in 9 * advertising or publicity pertaining to distribution of the software without 10 * specific, written prior permission. Keith Packard makes no 11 * representations about the suitability of this software for any purpose. It 12 * is provided "as is" without express or implied warranty. 13 * 14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20 * PERFORMANCE OF THIS SOFTWARE. 21 */ 22 23#ifdef HAVE_DIX_CONFIG_H 24#include <dix-config.h> 25#endif 26#include "kdrive.h" 27 28KdCardInfo *kdCardInfo; 29 30KdCardInfo * 31KdCardInfoAdd(KdCardFuncs * funcs, void *closure) 32{ 33 KdCardInfo *ci, **prev; 34 35 ci = calloc(1, sizeof(KdCardInfo)); 36 if (!ci) 37 return 0; 38 for (prev = &kdCardInfo; *prev; prev = &(*prev)->next); 39 *prev = ci; 40 ci->cfuncs = funcs; 41 ci->closure = closure; 42 ci->screenList = 0; 43 ci->selected = 0; 44 ci->next = 0; 45 return ci; 46} 47 48KdCardInfo * 49KdCardInfoLast(void) 50{ 51 KdCardInfo *ci; 52 53 if (!kdCardInfo) 54 return 0; 55 for (ci = kdCardInfo; ci->next; ci = ci->next); 56 return ci; 57} 58 59void 60KdCardInfoDispose(KdCardInfo * ci) 61{ 62 KdCardInfo **prev; 63 64 for (prev = &kdCardInfo; *prev; prev = &(*prev)->next) 65 if (*prev == ci) { 66 *prev = ci->next; 67 free(ci); 68 break; 69 } 70} 71 72KdScreenInfo * 73KdScreenInfoAdd(KdCardInfo * ci) 74{ 75 KdScreenInfo *si, **prev; 76 int n; 77 78 si = calloc(1, sizeof(KdScreenInfo)); 79 if (!si) 80 return 0; 81 for (prev = &ci->screenList, n = 0; *prev; prev = &(*prev)->next, n++); 82 *prev = si; 83 si->next = 0; 84 si->card = ci; 85 si->mynum = n; 86 return si; 87} 88 89void 90KdScreenInfoDispose(KdScreenInfo * si) 91{ 92 KdCardInfo *ci = si->card; 93 KdScreenInfo **prev; 94 95 for (prev = &ci->screenList; *prev; prev = &(*prev)->next) { 96 if (*prev == si) { 97 *prev = si->next; 98 free(si); 99 if (!ci->screenList) 100 KdCardInfoDispose(ci); 101 break; 102 } 103 } 104} 105 106KdPointerInfo * 107KdNewPointer(void) 108{ 109 KdPointerInfo *pi; 110 int i; 111 112 pi = (KdPointerInfo *) calloc(1, sizeof(KdPointerInfo)); 113 if (!pi) 114 return NULL; 115 116 pi->name = strdup("Generic Pointer"); 117 pi->path = NULL; 118 pi->inputClass = KD_MOUSE; 119 pi->driver = NULL; 120 pi->driverPrivate = NULL; 121 pi->next = NULL; 122 pi->options = NULL; 123 pi->nAxes = 3; 124 pi->nButtons = KD_MAX_BUTTON; 125 for (i = 1; i < KD_MAX_BUTTON; i++) 126 pi->map[i] = i; 127 128 return pi; 129} 130 131void 132KdFreePointer(KdPointerInfo * pi) 133{ 134 free(pi->name); 135 free(pi->path); 136 input_option_free_list(&pi->options); 137 pi->next = NULL; 138 free(pi); 139} 140 141void 142KdFreeKeyboard(KdKeyboardInfo * ki) 143{ 144 free(ki->name); 145 free(ki->path); 146 free(ki->xkbRules); 147 free(ki->xkbModel); 148 free(ki->xkbLayout); 149 free(ki->xkbVariant); 150 free(ki->xkbOptions); 151 input_option_free_list(&ki->options); 152 ki->next = NULL; 153 free(ki); 154} 155