1 /* $XFree86: xc/programs/Xserver/Xext/xf86misc.c,v 3.21.2.4 1998/02/25 14:26:43 dawes Exp $ */
4 * Copyright (c) 1995, 1996 The XFree86 Project, Inc
7 /* THIS IS NOT AN X CONSORTIUM STANDARD */
14 #include "dixstruct.h"
15 #include "extnsionst.h"
16 #include "scrnintstr.h"
19 #define _XF86MISC_SERVER_
20 #define _XF86MISC_SAVER_COMPAT_
21 #include "xf86mscstr.h"
22 #include "Xfuncproto.h"
25 #include "xf86_OSlib.h"
27 #include <X11/Xtrans.h>
28 #include "../os/osdep.h"
29 #include <X11/Xauth.h>
32 #include <sys/socket.h>
37 #include <lan/socket.h>
42 extern int xf86ScreenIndex;
43 extern Bool xf86MiscModInDevEnabled;
44 extern Bool xf86MiscModInDevAllowNonLocal;
46 static int miscErrorBase;
48 static void XF86MiscResetProc(
49 #if NeedFunctionPrototypes
50 ExtensionEntry* /* extEntry */
54 static DISPATCH_PROC(ProcXF86MiscDispatch);
55 static DISPATCH_PROC(ProcXF86MiscGetKbdSettings);
56 static DISPATCH_PROC(ProcXF86MiscGetMouseSettings);
57 static DISPATCH_PROC(ProcXF86MiscGetSaver);
58 static DISPATCH_PROC(ProcXF86MiscQueryVersion);
59 static DISPATCH_PROC(ProcXF86MiscSetKbdSettings);
60 static DISPATCH_PROC(ProcXF86MiscSetMouseSettings);
61 static DISPATCH_PROC(ProcXF86MiscSetSaver);
62 static DISPATCH_PROC(SProcXF86MiscDispatch);
63 static DISPATCH_PROC(SProcXF86MiscGetKbdSettings);
64 static DISPATCH_PROC(SProcXF86MiscGetMouseSettings);
65 static DISPATCH_PROC(SProcXF86MiscGetSaver);
66 static DISPATCH_PROC(SProcXF86MiscQueryVersion);
67 static DISPATCH_PROC(SProcXF86MiscSetKbdSettings);
68 static DISPATCH_PROC(SProcXF86MiscSetMouseSettings);
69 static DISPATCH_PROC(SProcXF86MiscSetSaver);
71 static unsigned char XF86MiscReqCode = 0;
73 extern InputInfo inputInfo;
76 XFree86MiscExtensionInit()
78 ExtensionEntry* extEntry;
81 (extEntry = AddExtension(XF86MISCNAME,
85 SProcXF86MiscDispatch,
87 StandardMinorOpcode))) {
88 XF86MiscReqCode = (unsigned char)extEntry->base;
89 miscErrorBase = extEntry->errorBase;
95 XF86MiscResetProc (extEntry)
96 ExtensionEntry* extEntry;
101 ProcXF86MiscQueryVersion(client)
102 register ClientPtr client;
104 xXF86MiscQueryVersionReply rep;
107 REQUEST_SIZE_MATCH(xXF86MiscQueryVersionReq);
110 rep.sequenceNumber = client->sequence;
111 rep.majorVersion = XF86MISC_MAJOR_VERSION;
112 rep.minorVersion = XF86MISC_MINOR_VERSION;
113 if (client->swapped) {
114 swaps(&rep.sequenceNumber, n);
115 swapl(&rep.length, n);
116 swaps(&rep.majorVersion, n);
117 swaps(&rep.minorVersion, n);
119 WriteToClient(client, sizeof(xXF86MiscQueryVersionReply), (char *)&rep);
120 return (client->noClientException);
124 * This will go away, but remains for now for compatibility with older
128 ProcXF86MiscSetSaver(client)
129 register ClientPtr client;
131 REQUEST(xXF86MiscSetSaverReq);
134 if (stuff->screen > screenInfo.numScreens)
137 vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
139 REQUEST_SIZE_MATCH(xXF86MiscSetSaverReq);
141 if (stuff->suspendTime < 0)
143 if (stuff->offTime < 0)
146 return (client->noClientException);
150 * This will go away, but remains for now for compatibility with older
154 ProcXF86MiscGetSaver(client)
155 register ClientPtr client;
157 REQUEST(xXF86MiscGetSaverReq);
158 xXF86MiscGetSaverReply rep;
162 if (stuff->screen > screenInfo.numScreens)
165 vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
167 REQUEST_SIZE_MATCH(xXF86MiscGetSaverReq);
170 rep.sequenceNumber = client->sequence;
174 if (client->swapped) {
175 swaps(&rep.sequenceNumber, n);
176 swapl(&rep.length, n);
177 swapl(&rep.suspendTime, n);
178 swapl(&rep.offTime, n);
180 WriteToClient(client, SIZEOF(xXF86MiscGetSaverReply), (char *)&rep);
181 return (client->noClientException);
185 ProcXF86MiscGetMouseSettings(client)
186 register ClientPtr client;
188 xXF86MiscGetMouseSettingsReply rep;
191 REQUEST_SIZE_MATCH(xXF86MiscGetMouseSettingsReq);
193 rep.sequenceNumber = client->sequence;
194 rep.mousetype = xf86Info.mouseDev->mseType;
196 if (xf86Info.mouseDev->mseProc == xf86XqueMseProc)
197 rep.mousetype = MTYPE_XQUEUE;
199 #if defined(USE_OSMOUSE) || defined(OSMOUSE_ONLY)
200 if (xf86Info.mouseDev->mseProc == xf86OsMouseProc)
201 rep.mousetype = MTYPE_OSMOUSE;
203 rep.baudrate = xf86Info.mouseDev->baudRate;
204 rep.samplerate = xf86Info.mouseDev->sampleRate;
205 rep.resolution = xf86Info.mouseDev->resolution;
206 rep.buttons = xf86Info.mouseDev->buttons;
207 rep.emulate3buttons = xf86Info.mouseDev->emulate3Buttons;
208 rep.emulate3timeout = xf86Info.mouseDev->emulate3Timeout;
209 rep.chordmiddle = xf86Info.mouseDev->chordMiddle;
210 rep.flags = xf86Info.mouseDev->mouseFlags;
211 if (xf86Info.mouseDev->mseDevice)
212 rep.devnamelen = strlen(xf86Info.mouseDev->mseDevice);
215 rep.length = (sizeof(xXF86MiscGetMouseSettingsReply) -
216 sizeof(xGenericReply) + ((rep.devnamelen+3) & ~3)) >> 2;
218 if (client->swapped) {
219 swaps(&rep.sequenceNumber, n);
220 swapl(&rep.length, n);
221 swapl(&rep.mousetype, n);
222 swapl(&rep.baudrate, n);
223 swapl(&rep.samplerate, n);
224 swapl(&rep.resolution, n);
225 swapl(&rep.buttons, n);
226 swapl(&rep.emulate3buttons, n);
227 swapl(&rep.emulate3timeout, n);
228 swapl(&rep.chordmiddle, n);
229 swapl(&rep.flags, n);
231 WriteToClient(client, SIZEOF(xXF86MiscGetMouseSettingsReply), (char *)&rep);
233 WriteToClient(client, rep.devnamelen, xf86Info.mouseDev->mseDevice);
234 return (client->noClientException);
238 ProcXF86MiscGetKbdSettings(client)
239 register ClientPtr client;
241 xXF86MiscGetKbdSettingsReply rep;
244 REQUEST_SIZE_MATCH(xXF86MiscGetKbdSettingsReq);
247 rep.sequenceNumber = client->sequence;
248 rep.kbdtype = xf86Info.kbdType;
250 if (xf86Info.kbdProc == xf86XqueKbdProc)
251 rep.kbdtype = KTYPE_XQUEUE;
253 rep.rate = xf86Info.kbdRate;
254 rep.delay = xf86Info.kbdDelay;
255 rep.servnumlock = xf86Info.serverNumLock;
256 if (client->swapped) {
257 swaps(&rep.sequenceNumber, n);
258 swapl(&rep.length, n);
259 swapl(&rep.kbdtype, n);
261 swapl(&rep.delay, n);
263 WriteToClient(client, SIZEOF(xXF86MiscGetKbdSettingsReply), (char *)&rep);
264 return (client->noClientException);
268 ProcXF86MiscSetMouseSettings(client)
269 register ClientPtr client;
271 int reopen, msetype, flags, baudrate, samplerate, resolution;
273 REQUEST(xXF86MiscSetMouseSettingsReq);
275 REQUEST_SIZE_MATCH(xXF86MiscSetMouseSettingsReq);
278 ErrorF("SetMouseSettings - type: %d brate: %d srate: %d chdmid: %d\n",
279 stuff->mousetype, stuff->baudrate,
280 stuff->samplerate, stuff->chordmiddle);
281 ErrorF(" em3but: %d em3tim: %d res: %d flags: %d\n",
282 stuff->emulate3buttons, stuff->emulate3timeout,
283 stuff->resolution, stuff->flags);
285 if (stuff->mousetype > MTYPE_OSMOUSE
286 || stuff->mousetype < MTYPE_MICROSOFT)
287 return miscErrorBase + XF86MiscBadMouseProtocol;
289 if (stuff->mousetype != MTYPE_OSMOUSE)
290 return miscErrorBase + XF86MiscBadMouseProtocol;
293 if (stuff->mousetype == MTYPE_XQUEUE)
294 return miscErrorBase + XF86MiscBadMouseProtocol;
297 if (stuff->mousetype == MTYPE_OSMOUSE)
298 return miscErrorBase + XF86MiscBadMouseProtocol;
300 #endif /* OSMOUSE_ONLY */
302 if (stuff->emulate3timeout < 0)
305 if (stuff->mousetype == MTYPE_LOGIMAN
306 && !(stuff->baudrate == 1200 || stuff->baudrate == 9600) )
307 return miscErrorBase + XF86MiscBadMouseBaudRate;
308 if (stuff->mousetype == MTYPE_LOGIMAN && stuff->samplerate)
309 return miscErrorBase + XF86MiscBadMouseCombo;
311 samplerate = xf86Info.mouseDev->sampleRate;
312 resolution = xf86Info.mouseDev->resolution;
313 baudrate = xf86Info.mouseDev->baudRate;
314 flags = xf86Info.mouseDev->mouseFlags;
315 msetype = xf86Info.mouseDev->mseType;
317 if (xf86Info.mouseDev->mseProc == xf86XqueMseProc)
318 msetype = MTYPE_XQUEUE;
320 #if defined(USE_OSMOUSE) || defined(OSMOUSE_ONLY)
321 if (xf86Info.mouseDev->mseProc == xf86OsMouseProc)
322 msetype = MTYPE_OSMOUSE;
327 if (stuff->mousetype != msetype)
328 if (stuff->mousetype == MTYPE_XQUEUE
329 || stuff->mousetype == MTYPE_OSMOUSE
330 || msetype == MTYPE_XQUEUE
331 || msetype == MTYPE_OSMOUSE)
332 return miscErrorBase + XF86MiscBadMouseProtocol;
335 msetype = stuff->mousetype;
338 if (stuff->flags & MF_REOPEN) {
340 stuff->flags &= ~MF_REOPEN;
342 if (stuff->mousetype != MTYPE_OSMOUSE
343 && stuff->mousetype != MTYPE_XQUEUE
344 && stuff->mousetype != MTYPE_PS_2
345 && stuff->mousetype != MTYPE_BUSMOUSE
346 && stuff->mousetype != MTYPE_IMPS2
347 && stuff->mousetype != MTYPE_THINKINGPS2
348 && stuff->mousetype != MTYPE_MMANPLUSPS2
349 && stuff->mousetype != MTYPE_GLIDEPOINTPS2
350 && stuff->mousetype != MTYPE_NETPS2
351 && stuff->mousetype != MTYPE_NETSCROLLPS2
352 && stuff->mousetype != MTYPE_SYSMOUSE)
354 if (stuff->baudrate < 1200)
355 return miscErrorBase + XF86MiscBadMouseBaudRate;
356 if (stuff->baudrate % 1200 != 0
357 || stuff->baudrate < 1200 || stuff->baudrate > 9600)
358 return miscErrorBase + XF86MiscBadMouseBaudRate;
359 if (xf86Info.mouseDev->baudRate != stuff->baudrate) {
361 baudrate = stuff->baudrate;
364 if (stuff->flags & (MF_CLEAR_DTR|MF_CLEAR_RTS))
365 if (stuff->mousetype != MTYPE_MOUSESYS)
366 return miscErrorBase + XF86MiscBadMouseFlags;
367 else if (xf86Info.mouseDev->mouseFlags != stuff->flags) {
369 flags = stuff->flags;
372 if (stuff->mousetype != MTYPE_OSMOUSE
373 && stuff->mousetype != MTYPE_XQUEUE
374 && stuff->mousetype != MTYPE_BUSMOUSE)
376 if (stuff->samplerate < 0)
379 if (xf86Info.mouseDev->sampleRate != stuff->samplerate) {
381 samplerate = stuff->samplerate;
385 if (stuff->resolution < 0)
387 if (xf86Info.mouseDev->resolution != stuff->resolution) {
389 resolution = stuff->resolution;
393 /* Ignore the buttons field */
394 if (xf86Info.mouseDev->buttons != stuff->buttons)
395 /* we cannot change this field on the fly... */
399 if (stuff->chordmiddle)
400 if (stuff->emulate3buttons
401 || !(stuff->mousetype == MTYPE_MICROSOFT
402 || stuff->mousetype == MTYPE_LOGIMAN) )
403 return miscErrorBase + XF86MiscBadMouseCombo;
405 xf86Info.mouseDev->chordMiddle = stuff->chordmiddle!=0;
406 xf86Info.mouseDev->emulate3Buttons = stuff->emulate3buttons!=0;
407 xf86Info.mouseDev->emulate3Timeout = stuff->emulate3timeout;
409 if (reopen && msetype != MTYPE_OSMOUSE && msetype != MTYPE_XQUEUE) {
411 (xf86Info.mouseDev->mseProc)(xf86Info.pMouse, DEVICE_CLOSE);
413 xf86Info.mouseDev->mseType = msetype;
414 xf86Info.mouseDev->mouseFlags = flags;
415 xf86Info.mouseDev->baudRate = baudrate;
416 xf86Info.mouseDev->sampleRate = samplerate;
417 xf86Info.mouseDev->resolution = resolution;
419 xf86Info.pMouse->public.on = FALSE;
420 xf86AllowMouseOpenFail = TRUE;
421 xf86MouseInit(xf86Info.mouseDev);
422 (xf86Info.mouseDev->mseProc)(xf86Info.pMouse, DEVICE_ON);
426 ErrorF("SetMouseSettings - Succeeded\n");
427 return (client->noClientException);
431 ProcXF86MiscSetKbdSettings(client)
432 register ClientPtr client;
434 REQUEST(xXF86MiscSetKbdSettingsReq);
436 REQUEST_SIZE_MATCH(xXF86MiscSetKbdSettingsReq);
439 ErrorF("SetKbdSettings - type: %d rate: %d delay: %d snumlk: %d\n",
440 stuff->kbdtype, stuff->rate,
441 stuff->delay, stuff->servnumlock);
444 if (stuff->delay < 0)
446 if (stuff->kbdtype < KTYPE_UNKNOWN || stuff->kbdtype > KTYPE_XQUEUE)
447 return miscErrorBase + XF86MiscBadKbdType;
449 if (xf86Info.kbdRate!=stuff->rate || xf86Info.kbdDelay!=stuff->delay) {
452 xf86Info.kbdRate = stuff->rate;
453 xf86Info.kbdDelay = stuff->delay;
454 if (xf86Info.kbdDelay <= 375) rad = 0x00;
455 else if (xf86Info.kbdDelay <= 625) rad = 0x20;
456 else if (xf86Info.kbdDelay <= 875) rad = 0x40;
459 if (xf86Info.kbdRate <= 2) rad |= 0x1F;
460 else if (xf86Info.kbdRate >= 30) rad |= 0x00;
461 else rad |= ((58/xf86Info.kbdRate)-2);
463 xf86SetKbdRepeat(rad);
465 #if 0 /* Not done yet */
466 xf86Info.kbdType = stuff->kbdtype;
467 xf86Info.serverNumLock = stuff->servnumlock!=0;
471 ErrorF("SetKbdSettings - Succeeded\n");
472 return (client->noClientException);
476 ProcXF86MiscDispatch (client)
477 register ClientPtr client;
482 case X_XF86MiscQueryVersion:
483 return ProcXF86MiscQueryVersion(client);
484 case X_XF86MiscGetSaver:
485 return ProcXF86MiscGetSaver(client);
486 case X_XF86MiscSetSaver:
487 return ProcXF86MiscSetSaver(client);
488 case X_XF86MiscGetMouseSettings:
489 return ProcXF86MiscGetMouseSettings(client);
490 case X_XF86MiscGetKbdSettings:
491 return ProcXF86MiscGetKbdSettings(client);
493 if (!xf86MiscModInDevEnabled)
494 return miscErrorBase + XF86MiscModInDevDisabled;
495 if (xf86MiscModInDevAllowNonLocal || LocalClient (client)) {
496 switch (stuff->data) {
497 case X_XF86MiscSetMouseSettings:
498 return ProcXF86MiscSetMouseSettings(client);
499 case X_XF86MiscSetKbdSettings:
500 return ProcXF86MiscSetKbdSettings(client);
505 return miscErrorBase + XF86MiscModInDevClientNotLocal;
510 SProcXF86MiscQueryVersion(client)
511 register ClientPtr client;
514 REQUEST(xXF86MiscQueryVersionReq);
515 swaps(&stuff->length, n);
516 return ProcXF86MiscQueryVersion(client);
520 SProcXF86MiscGetSaver(client)
524 REQUEST(xXF86MiscGetSaverReq);
525 swaps(&stuff->length, n);
526 REQUEST_SIZE_MATCH(xXF86MiscGetSaverReq);
527 swaps(&stuff->screen, n);
528 return ProcXF86MiscGetSaver(client);
532 SProcXF86MiscSetSaver(client)
536 REQUEST(xXF86MiscSetSaverReq);
537 swaps(&stuff->length, n);
538 REQUEST_SIZE_MATCH(xXF86MiscSetSaverReq);
539 swaps(&stuff->screen, n);
540 swapl(&stuff->suspendTime, n);
541 swapl(&stuff->offTime, n);
542 return ProcXF86MiscSetSaver(client);
546 SProcXF86MiscGetMouseSettings(client)
550 REQUEST(xXF86MiscGetMouseSettingsReq);
551 swaps(&stuff->length, n);
552 REQUEST_SIZE_MATCH(xXF86MiscGetMouseSettingsReq);
553 return ProcXF86MiscGetMouseSettings(client);
557 SProcXF86MiscGetKbdSettings(client)
561 REQUEST(xXF86MiscGetKbdSettingsReq);
562 swaps(&stuff->length, n);
563 REQUEST_SIZE_MATCH(xXF86MiscGetKbdSettingsReq);
564 return ProcXF86MiscGetKbdSettings(client);
568 SProcXF86MiscSetMouseSettings(client)
572 REQUEST(xXF86MiscSetMouseSettingsReq);
573 swaps(&stuff->length, n);
574 REQUEST_SIZE_MATCH(xXF86MiscSetMouseSettingsReq);
575 swapl(&stuff->mousetype, n);
576 swapl(&stuff->baudrate, n);
577 swapl(&stuff->samplerate, n);
578 swapl(&stuff->resolution, n);
579 swapl(&stuff->buttons, n);
580 swapl(&stuff->emulate3timeout, n);
581 swapl(&stuff->flags, n);
582 return ProcXF86MiscSetMouseSettings(client);
586 SProcXF86MiscSetKbdSettings(client)
590 REQUEST(xXF86MiscSetKbdSettingsReq);
591 swaps(&stuff->length, n);
592 REQUEST_SIZE_MATCH(xXF86MiscSetKbdSettingsReq);
593 swapl(&stuff->kbdtype, n);
594 swapl(&stuff->rate, n);
595 swapl(&stuff->delay, n);
596 return ProcXF86MiscSetKbdSettings(client);
600 SProcXF86MiscDispatch (client)
601 register ClientPtr client;
606 case X_XF86MiscQueryVersion:
607 return SProcXF86MiscQueryVersion(client);
608 case X_XF86MiscGetSaver:
609 return SProcXF86MiscGetSaver(client);
610 case X_XF86MiscSetSaver:
611 return SProcXF86MiscSetSaver(client);
612 case X_XF86MiscGetMouseSettings:
613 return SProcXF86MiscGetMouseSettings(client);
614 case X_XF86MiscGetKbdSettings:
615 return SProcXF86MiscGetKbdSettings(client);
617 if (!xf86MiscModInDevEnabled)
618 return miscErrorBase + XF86MiscModInDevDisabled;
619 if (xf86MiscModInDevAllowNonLocal || LocalClient (client)) {
620 switch (stuff->data) {
621 case X_XF86MiscSetMouseSettings:
622 return SProcXF86MiscSetMouseSettings(client);
623 case X_XF86MiscSetKbdSettings:
624 return SProcXF86MiscSetKbdSettings(client);
629 return miscErrorBase + XF86MiscModInDevClientNotLocal;