1 dawes 1.1 /*
2 * Copyright (c) 1999 by The XFree86 Project, Inc.
3 */
|
4 dawes 1.4 /* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c,v 1.3 1999/09/04 13:04:34 dawes Exp $ */
|
5 dawes 1.1
6 /*
7 * This file contains the Pointer/Keyboard functions needed by the
8 * XFree86-Misc extension.
9 */
10
11 #include "X.h"
12 #include "os.h"
13 #include "xf86.h"
14 #include "xf86Priv.h"
15
16 #ifdef XF86MISC
17 #define _XF86MISC_SERVER_
18 #include "xf86misc.h"
19 #include "xf86miscproc.h"
20 #endif
21
|
22 dawes 1.2 #define XF86_OS_PRIVS
23 #include "xf86_OSlib.h"
24
|
25 dawes 1.1 #ifdef XINPUT
26 #include "XI.h"
27 #include "XIproto.h"
28 #include "extnsionst.h"
29 #include "extinit.h"
30 #include "xf86Xinput.h"
31 #else
32 #include "inputstr.h"
33 #endif
34
35 #include "xf86OSmouse.h"
36 #include "../input/mouse/mouse.h"
|
37 eich 1.6
|
38 dawes 1.1 #ifdef DEBUG
39 # define DEBUG_P(x) ErrorF(x"\n");
40 #else
41 # define DEBUG_P(x) /**/
42 #endif
43
44 #ifdef XF86MISC
45
46 typedef struct {
47 int type;
48 int baudrate;
49 int samplerate;
50 int resolution;
51 int buttons;
52 Bool em3buttons;
53 int em3timeout;
54 Bool chordmiddle;
55 int flags;
|
56 eich 1.6 char* device;
57 pointer private;
|
58 dawes 1.1 } mseParamsRec, *mseParamsPtr;
59
60 typedef struct {
61 int type;
62 int rate;
63 int delay;
64 int serverNumLock; /* obsolete */
65 } kbdParamsRec, *kbdParamsPtr;
66
67 typedef enum {
68 TO_MISC,
69 FROM_MISC
70 } MseProtoMapDirection;
71
72 /*
73 Sigh...
74
75 The extension should probably be changed to use protocol
76 names instead of ID numbers
77 */
78 static int
79 dawes 1.1 MapMseProto(int proto, MseProtoMapDirection mapping)
80 {
81 static int MapProto_ToMisc[] = {
82 MTYPE_MICROSOFT, MTYPE_MOUSESYS, MTYPE_MMSERIES,
83 MTYPE_LOGITECH, MTYPE_LOGIMAN, MTYPE_MMHIT,
84 MTYPE_GLIDEPOINT, MTYPE_IMSERIAL, MTYPE_THINKING,
85 MTYPE_ACECAD, MTYPE_PS_2, MTYPE_IMPS2,
|
86 eich 1.5 MTYPE_EXPPS2, MTYPE_THINKINGPS2, MTYPE_MMANPLUSPS2,
87 MTYPE_GLIDEPOINTPS2, MTYPE_NETPS2, MTYPE_NETSCROLLPS2,
88 MTYPE_BUSMOUSE, MTYPE_AUTOMOUSE, MTYPE_SYSMOUSE
|
89 dawes 1.1 };
90
|
91 eich 1.5 static MouseProtocolID MapProto_FromMisc[] = {
|
92 dawes 1.1 PROT_MS, PROT_MSC, PROT_MM, PROT_LOGI,
93 PROT_BM, PROT_LOGIMAN, PROT_PS2, PROT_MMHIT,
94 PROT_GLIDE, PROT_IMSERIAL, PROT_THINKING, PROT_IMPS2,
95 PROT_THINKPS2, PROT_MMPS2, PROT_GLIDEPS2, PROT_NETPS2,
|
96 eich 1.5 PROT_NETSCPS2, PROT_SYSMOUSE, PROT_AUTO, PROT_ACECAD,
97 PROT_EXPPS2
|
98 dawes 1.1 };
99 #define PROT_DEFAULT -2 /* PROT_UNKNOWN */
100
101 if (mapping == TO_MISC) {
102 if (proto < 0 || proto >= sizeof(MapProto_ToMisc)/sizeof(int))
103 return MTYPE_UNKNOWN;
104 return MapProto_ToMisc[proto];
105 } else {
106 if (proto < 0 || proto >= sizeof(MapProto_FromMisc)/sizeof(int))
107 return PROT_DEFAULT;
108 return MapProto_FromMisc[proto];
109 }
110 #undef PROT_DEFAULT
111 }
112
113 Bool
114 MiscExtGetMouseSettings(pointer *mouse, char **devname)
115 {
116 mseParamsPtr mseptr;
117
118 DEBUG_P("MiscExtGetMouseSettings");
119 dawes 1.1
|
120 eich 1.5 mseptr = MiscExtCreateStruct(MISC_POINTER);
|
121 dawes 1.1 if (!mseptr)
122 return FALSE;
123
124 {
|
125 eich 1.5 InputInfoPtr pInfo = mseptr->private;
|
126 dawes 1.1 MouseDevPtr pMse;
127
128 *devname = xf86FindOptionValue(pInfo->options, "Device");
129 pMse = pInfo->private;
130
131 mseptr->type = MapMseProto(pMse->protocolID, TO_MISC);
132 mseptr->baudrate = pMse->baudRate;
133 mseptr->samplerate = pMse->sampleRate;
134 mseptr->resolution = pMse->resolution;
135 mseptr->buttons = pMse->buttons;
136 mseptr->em3buttons = pMse->emulate3Buttons;
137 mseptr->em3timeout = pMse->emulate3Timeout;
138 mseptr->chordmiddle = pMse->chordMiddle;
139 mseptr->flags = pMse->mouseFlags;
140 }
141 *mouse = mseptr;
142 return TRUE;
143 }
144
145 int
146 MiscExtGetMouseValue(pointer mouse, MiscExtMseValType valtype)
147 dawes 1.1 {
148 mseParamsPtr mse = mouse;
149
150 DEBUG_P("MiscExtGetMouseValue");
151
152 switch (valtype) {
153 case MISC_MSE_PROTO: return mse->type;
154 case MISC_MSE_BAUDRATE: return mse->baudrate;
155 case MISC_MSE_SAMPLERATE: return mse->samplerate;
156 case MISC_MSE_RESOLUTION: return mse->resolution;
157 case MISC_MSE_BUTTONS: return mse->buttons;
158 case MISC_MSE_EM3BUTTONS: return mse->em3buttons;
159 case MISC_MSE_EM3TIMEOUT: return mse->em3timeout;
160 case MISC_MSE_CHORDMIDDLE: return mse->chordmiddle;
161 case MISC_MSE_FLAGS: return mse->flags;
162 }
163 return 0;
164 }
165
166 Bool
167 MiscExtSetMouseValue(pointer mouse, MiscExtMseValType valtype, int value)
168 dawes 1.1 {
169 mseParamsPtr mse = mouse;
170
171 DEBUG_P("MiscExtSetMouseValue");
172
173 switch (valtype) {
174 case MISC_MSE_PROTO:
|
175 eich 1.5 mse->type = value;
|
176 dawes 1.1 return TRUE;
177 case MISC_MSE_BAUDRATE:
178 mse->baudrate = value;
179 return TRUE;
180 case MISC_MSE_SAMPLERATE:
181 mse->samplerate = value;
182 return TRUE;
183 case MISC_MSE_RESOLUTION:
184 mse->resolution = value;
185 return TRUE;
186 case MISC_MSE_BUTTONS:
187 mse->buttons = value;
188 return TRUE;
189 case MISC_MSE_EM3BUTTONS:
190 mse->em3buttons = value;
191 return TRUE;
192 case MISC_MSE_EM3TIMEOUT:
193 mse->em3timeout = value;
194 return TRUE;
195 case MISC_MSE_CHORDMIDDLE:
196 mse->chordmiddle = value;
197 dawes 1.1 return TRUE;
198 case MISC_MSE_FLAGS:
199 mse->flags = value;
200 return TRUE;
201 }
202 return FALSE;
203 }
204
205 Bool
|
206 eich 1.6 MiscExtSetMouseDevice(pointer mouse, char* device)
207 {
208 mseParamsPtr mse = mouse;
209
210 mse->device = device;
211 return TRUE;
212 }
213
214 Bool
|
215 dawes 1.1 MiscExtGetKbdSettings(pointer *kbd)
216 {
217 kbdParamsPtr kbdptr;
218
219 DEBUG_P("MiscExtGetKbdSettings");
220
221 kbdptr = MiscExtCreateStruct(MISC_KEYBOARD);
222 if (!kbdptr)
223 return FALSE;
224 kbdptr->type = xf86Info.kbdType;
225 kbdptr->rate = xf86Info.kbdRate;
226 kbdptr->delay = xf86Info.kbdDelay;
227 *kbd = kbdptr;
228 return TRUE;
229 }
230
231 int
232 MiscExtGetKbdValue(pointer keyboard, MiscExtKbdValType valtype)
233 {
234 kbdParamsPtr kbd = keyboard;
235
236 dawes 1.1 DEBUG_P("MiscExtGetKbdValue");
237 switch (valtype) {
238 case MISC_KBD_TYPE: return kbd->type;
239 case MISC_KBD_RATE: return kbd->rate;
240 case MISC_KBD_DELAY: return kbd->delay;
241 case MISC_KBD_SERVNUMLOCK: return 0;
242 }
243 return 0;
244 }
245
246 Bool
247 MiscExtSetKbdValue(pointer keyboard, MiscExtKbdValType valtype, int value)
248 {
249 kbdParamsPtr kbd = keyboard;
250
251 DEBUG_P("MiscExtSetKbdValue");
252 switch (valtype) {
253 case MISC_KBD_TYPE:
254 kbd->type = value;
255 return TRUE;
256 case MISC_KBD_RATE:
257 dawes 1.1 kbd->rate = value;
258 return TRUE;
259 case MISC_KBD_DELAY:
260 kbd->delay = value;
261 return TRUE;
262 case MISC_KBD_SERVNUMLOCK:
263 return TRUE;
264 }
265 return FALSE;
266 }
267
268 pointer
269 MiscExtCreateStruct(MiscExtStructType mse_or_kbd)
270 {
271 DEBUG_P("MiscExtCreateStruct");
|
272 eich 1.5
|
273 dawes 1.1 switch (mse_or_kbd) {
|
274 eich 1.5 case MISC_POINTER:
275 {
276 mseParamsPtr mseptr;
277 InputInfoPtr pInfo = xf86InputDevs;
278
279 while (pInfo) {
280 if (xf86IsCorePointer(pInfo->dev))
281 break;
282 pInfo = pInfo->next;
283 }
284 if (!pInfo)
285 return NULL;
286
287 mseptr = xcalloc(sizeof(mseParamsRec),1);
288 if (mseptr)
289 mseptr->private = pInfo;
290 return mseptr;
291 }
292 case MISC_KEYBOARD:
293 return xcalloc(sizeof(kbdParamsRec),1);
|
294 dawes 1.1 }
295 return 0;
296 }
297
298 void
299 MiscExtDestroyStruct(pointer structure, MiscExtStructType mse_or_kbd)
300 {
301 DEBUG_P("MiscExtDestroyStruct");
302
303 switch (mse_or_kbd) {
304 case MISC_POINTER:
305 case MISC_KEYBOARD:
306 xfree(structure);
307 }
308 }
309
310 MiscExtReturn
311 MiscExtApply(pointer structure, MiscExtStructType mse_or_kbd)
312 {
313 DEBUG_P("MiscExtApply");
314
315 dawes 1.1 if (mse_or_kbd == MISC_POINTER) {
316 Bool reopen = FALSE;
317 mseParamsPtr mse = structure;
318 InputInfoPtr pInfo;
319 MouseDevPtr pMse;
|
320 eich 1.5 #ifdef XFree86LOADER
321 pointer xf86MouseProtocolIDToName
322 = LoaderSymbol("xf86MouseProtocolIDToName");
323 if (!xf86MouseProtocolIDToName)
324 return MISC_RET_NOMODULE;
325 #endif
|
326 dawes 1.1 if (mse->type < MTYPE_MICROSOFT
327 || ( mse->type > MTYPE_ACECAD
328 && (mse->type!=MTYPE_OSMOUSE && mse->type!=MTYPE_XQUEUE)))
329 return MISC_RET_BADMSEPROTO;
330 #ifdef OSMOUSE_ONLY
331 if (mse->type != MTYPE_OSMOUSE)
332 return MISC_RET_BADMSEPROTO;
333 #else
334 if (mse->type == MTYPE_XQUEUE)
335 return MISC_RET_BADMSEPROTO;
336 if (mse->type == MTYPE_OSMOUSE)
337 return MISC_RET_BADMSEPROTO;
338 #endif /* OSMOUSE_ONLY */
339
340 if (mse->em3timeout < 0)
341 return MISC_RET_BADVAL;
342
343 if (mse->type == MTYPE_LOGIMAN
344 && !(mse->baudrate == 1200 || mse->baudrate == 9600) )
345 return MISC_RET_BADBAUDRATE;
346 if (mse->type == MTYPE_LOGIMAN && mse->samplerate)
347 dawes 1.1 return MISC_RET_BADCOMBO;
348
349 if (mse->flags & MF_REOPEN) {
350 reopen = TRUE;
351 mse->flags &= ~MF_REOPEN;
352 }
353 if (mse->type != MTYPE_OSMOUSE
354 && mse->type != MTYPE_XQUEUE
355 && mse->type != MTYPE_PS_2
356 && mse->type != MTYPE_BUSMOUSE
357 && mse->type != MTYPE_IMPS2
358 && mse->type != MTYPE_THINKINGPS2
359 && mse->type != MTYPE_MMANPLUSPS2
360 && mse->type != MTYPE_GLIDEPOINTPS2
361 && mse->type != MTYPE_NETPS2
362 && mse->type != MTYPE_NETSCROLLPS2
363 && mse->type != MTYPE_SYSMOUSE)
364 {
365 if (mse->baudrate % 1200 != 0
366 || mse->baudrate < 1200 || mse->baudrate > 9600)
367 return MISC_RET_BADBAUDRATE;
368 dawes 1.1 }
369 if ((mse->flags & (MF_CLEAR_DTR|MF_CLEAR_RTS))
370 && (mse->type != MTYPE_MOUSESYS))
371 return MISC_RET_BADFLAGS;
372
373 if (mse->type != MTYPE_OSMOUSE
374 && mse->type != MTYPE_XQUEUE
375 && mse->type != MTYPE_BUSMOUSE)
376 {
377 if (mse->samplerate < 0)
378 return MISC_RET_BADVAL;
379 }
380
381 if (mse->resolution < 0)
382 return MISC_RET_BADVAL;
383 if (mse->chordmiddle)
384 {
385 if (mse->em3buttons || !(mse->type == MTYPE_MICROSOFT
386 || mse->type == MTYPE_LOGIMAN) )
387 return MISC_RET_BADCOMBO;
388 }
389 dawes 1.1
390 /* XXX - This still needs work */
391
392 pInfo = mse->private;
393 pMse = pInfo->private;
394
395 if (pMse->protocolID != MapMseProto(mse->type, FROM_MISC)
396 || pMse->baudRate != mse->baudrate
397 || pMse->sampleRate != mse->samplerate
398 || pMse->resolution != mse->resolution
399 || pMse->mouseFlags != mse->flags)
400 reopen = TRUE;
401
402 if (reopen)
403 (pMse->device->deviceProc)(pMse->device, DEVICE_CLOSE);
404
405 pMse->protocolID = MapMseProto(mse->type, FROM_MISC);
406 pMse->baudRate = mse->baudrate;
407 pMse->sampleRate = mse->samplerate;
408 pMse->resolution = mse->resolution;
409 pMse->buttons = mse->buttons;
410 dawes 1.1 pMse->emulate3Buttons = mse->em3buttons;
411 pMse->emulate3Timeout = mse->em3timeout;
412 pMse->chordMiddle = mse->chordmiddle;
413 pMse->mouseFlags = mse->flags;
414
|
415 eich 1.5 #ifdef XFree86LOADER
416 pMse->protocol = ((const char *(*)(MouseProtocolID))
417 xf86MouseProtocolIDToName)(pMse->protocolID);
418 #else
419 pMse->protocol = xf86MouseProtocolIDToName(pMse->protocolID);
420 #endif
|
421 dawes 1.1 if (reopen)
422 (pMse->device->deviceProc)(pMse->device, DEVICE_ON);
423 /* Set pInfo->options too */
|
424 eich 1.6
425 if (mse->device)
426 xf86ReplaceStrOption(pInfo->options, "Device", mse->device);
|
427 dawes 1.1
428 }
429 if (mse_or_kbd == MISC_KEYBOARD) {
430 kbdParamsPtr kbd = structure;
431
432 if (kbd->rate < 0)
433 return MISC_RET_BADVAL;
434 if (kbd->delay < 0)
435 return MISC_RET_BADVAL;
436 if (kbd->type < KTYPE_UNKNOWN || kbd->type > KTYPE_XQUEUE)
437 return MISC_RET_BADKBDTYPE;
438
439 if (xf86Info.kbdRate!=kbd->rate || xf86Info.kbdDelay!=kbd->delay) {
440 char rad;
441
442 xf86Info.kbdRate = kbd->rate;
443 xf86Info.kbdDelay = kbd->delay;
444 if (xf86Info.kbdDelay <= 375) rad = 0x00;
445 else if (xf86Info.kbdDelay <= 625) rad = 0x20;
446 else if (xf86Info.kbdDelay <= 875) rad = 0x40;
447 else rad = 0x60;
448 dawes 1.1
449 if (xf86Info.kbdRate <= 2) rad |= 0x1F;
450 else if (xf86Info.kbdRate >= 30) rad |= 0x00;
451 else rad |= ((58/xf86Info.kbdRate)-2);
452
453 xf86SetKbdRepeat(rad);
454 }
455 #if 0 /* Not done yet */
456 xf86Info.kbdType = kbd->kbdtype;
457 #endif
458 }
459 return MISC_RET_SUCCESS;
460 }
461
462 #endif /* XF86MISC */
463
|