Initial commit
[xorg_rtime.git] / xorg-server-1.4 / hw / xgl / egl / xeglinput.c
blob8c50b7846a22b8fc2a34791cb670fdffdbdd0bcc
1 #include "xgl.h"
2 #include "xegl.h"
4 KdOsFuncs *kdOsFuncs;
5 Bool kdEmulateMiddleButton;
6 Bool kdRawPointerCoordinates;
7 Bool kdDontZap;
8 Bool kdDisableZaphod;
9 int kdScreenPrivateIndex;
11 static char *
12 KdParseFindNext (char *cur, char *delim, char *save, char *last)
14 while (*cur && !strchr (delim, *cur))
16 *save++ = *cur++;
18 *save = 0;
19 *last = *cur;
20 if (*cur)
21 cur++;
22 return cur;
26 * Mouse argument syntax:
28 * device,protocol,options...
30 * Options are any of:
31 * 1-5 n button mouse
32 * 2button emulate middle button
33 * {NMO} Reorder buttons
35 char *
36 KdSaveString (char *str)
38 char *n = (char *) xalloc (strlen (str) + 1);
40 if (!n)
41 return 0;
42 strcpy (n, str);
43 return n;
47 * Parse mouse information. Syntax:
49 * <device>,<nbutton>,<protocol>{,<option>}...
51 * options: {nmo} pointer mapping (e.g. {321})
52 * 2button emulate middle button
53 * 3button dont emulate middle button
55 void
56 KdParseMouse (char *arg)
58 char save[1024];
59 char delim;
60 KdMouseInfo *mi;
61 int i;
63 mi = KdMouseInfoAdd ();
64 if (!mi)
65 return;
66 mi->name = 0;
67 mi->prot = 0;
68 mi->emulateMiddleButton = kdEmulateMiddleButton;
69 mi->transformCoordinates = !kdRawPointerCoordinates;
70 mi->nbutton = 3;
71 for (i = 0; i < KD_MAX_BUTTON; i++)
72 mi->map[i] = i + 1;
74 if (!arg)
75 return;
76 if (strlen (arg) >= sizeof (save))
77 return;
78 arg = KdParseFindNext (arg, ",", save, &delim);
79 if (!save[0])
80 return;
81 mi->name = KdSaveString (save);
82 if (delim != ',')
83 return;
85 arg = KdParseFindNext (arg, ",", save, &delim);
86 if (!save[0])
87 return;
89 if ('1' <= save[0] && save[0] <= '0' + KD_MAX_BUTTON && save[1] == '\0')
91 mi->nbutton = save[0] - '0';
92 if (mi->nbutton > KD_MAX_BUTTON)
94 UseMsg ();
95 return;
99 if (!delim != ',')
100 return;
102 arg = KdParseFindNext (arg, ",", save, &delim);
104 if (save[0])
105 mi->prot = KdSaveString (save);
107 while (delim == ',')
109 arg = KdParseFindNext (arg, ",", save, &delim);
110 if (save[0] == '{')
112 char *s = save + 1;
113 i = 0;
114 while (*s && *s != '}')
116 if ('1' <= *s && *s <= '0' + mi->nbutton)
117 mi->map[i] = *s - '0';
118 else
119 UseMsg ();
120 s++;
123 else if (!strcmp (save, "2button"))
124 mi->emulateMiddleButton = TRUE;
125 else if (!strcmp (save, "3button"))
126 mi->emulateMiddleButton = FALSE;
127 else if (!strcmp (save, "rawcoord"))
128 mi->transformCoordinates = FALSE;
129 else if (!strcmp (save, "transform"))
130 mi->transformCoordinates = TRUE;
131 else
132 UseMsg ();
136 KdMouseInfo *kdMouseInfo;
138 KdMouseInfo *
139 KdMouseInfoAdd (void)
141 KdMouseInfo *mi, **prev;
143 mi = (KdMouseInfo *) xalloc (sizeof (KdMouseInfo));
144 if (!mi)
145 return 0;
146 bzero (mi, sizeof (KdMouseInfo));
147 for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next);
148 *prev = mi;
149 return mi;
152 void
153 KdMouseInfoDispose (KdMouseInfo *mi)
155 KdMouseInfo **prev;
157 for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next)
158 if (*prev == mi)
160 *prev = mi->next;
161 if (mi->name)
162 xfree (mi->name);
163 if (mi->prot)
164 xfree (mi->prot);
165 xfree (mi);
166 break;