(file) Return to xf86MiscExt.c CVS log (file) (dir) Up to [XFree86 CVS] / xc / programs / Xserver / hw / xfree86 / common

  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           

Powered by
ViewCVS 0.9.2