xref: /OK3568_Linux_fs/external/xserver/hw/kdrive/src/kinfo.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 
28 KdCardInfo *kdCardInfo;
29 
30 KdCardInfo *
KdCardInfoAdd(KdCardFuncs * funcs,void * closure)31 KdCardInfoAdd(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 
48 KdCardInfo *
KdCardInfoLast(void)49 KdCardInfoLast(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 
59 void
KdCardInfoDispose(KdCardInfo * ci)60 KdCardInfoDispose(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 
72 KdScreenInfo *
KdScreenInfoAdd(KdCardInfo * ci)73 KdScreenInfoAdd(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 
89 void
KdScreenInfoDispose(KdScreenInfo * si)90 KdScreenInfoDispose(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 
106 KdPointerInfo *
KdNewPointer(void)107 KdNewPointer(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 
131 void
KdFreePointer(KdPointerInfo * pi)132 KdFreePointer(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 
141 void
KdFreeKeyboard(KdKeyboardInfo * ki)142 KdFreeKeyboard(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