XF86Misc.c revision 11245024
141b2f0bdSmrg/* $XFree86: xc/lib/Xxf86misc/XF86Misc.c,v 3.12 2002/11/20 04:04:57 dawes Exp $ */
241b2f0bdSmrg
341b2f0bdSmrg/*
441b2f0bdSmrg * Copyright (c) 1995, 1996  The XFree86 Project, Inc
541b2f0bdSmrg */
641b2f0bdSmrg
741b2f0bdSmrg/* THIS IS NOT AN X CONSORTIUM STANDARD */
841b2f0bdSmrg
941b2f0bdSmrg#define NEED_EVENTS
1041b2f0bdSmrg#define NEED_REPLIES
1141b2f0bdSmrg#include <X11/Xlibint.h>
1241b2f0bdSmrg#include <X11/extensions/xf86mscstr.h>
1341b2f0bdSmrg#include <X11/extensions/Xext.h>
1441b2f0bdSmrg#include <X11/extensions/extutil.h>
1541b2f0bdSmrg
1641b2f0bdSmrgstatic XExtensionInfo _xf86misc_info_data;
1741b2f0bdSmrgstatic XExtensionInfo *xf86misc_info = &_xf86misc_info_data;
1841b2f0bdSmrgstatic char *xf86misc_extension_name = XF86MISCNAME;
1941b2f0bdSmrg
2041b2f0bdSmrg#define XF86MiscCheckExtension(dpy,i,val) \
2141b2f0bdSmrg  XextCheckExtension (dpy, i, xf86misc_extension_name, val)
2241b2f0bdSmrg
2341b2f0bdSmrg/*****************************************************************************
2441b2f0bdSmrg *                                                                           *
2541b2f0bdSmrg *			   private utility routines                          *
2641b2f0bdSmrg *                                                                           *
2741b2f0bdSmrg *****************************************************************************/
2841b2f0bdSmrg
2941b2f0bdSmrgstatic int close_display(Display *dpy, XExtCodes *codes);
3041b2f0bdSmrg
3141b2f0bdSmrgstatic /* const */ XExtensionHooks xf86misc_extension_hooks = {
3241b2f0bdSmrg    NULL,				/* create_gc */
3341b2f0bdSmrg    NULL,				/* copy_gc */
3441b2f0bdSmrg    NULL,				/* flush_gc */
3541b2f0bdSmrg    NULL,				/* free_gc */
3641b2f0bdSmrg    NULL,				/* create_font */
3741b2f0bdSmrg    NULL,				/* free_font */
3841b2f0bdSmrg    close_display,			/* close_display */
3941b2f0bdSmrg    NULL,				/* wire_to_event */
4041b2f0bdSmrg    NULL,				/* event_to_wire */
4141b2f0bdSmrg    NULL,				/* error */
4241b2f0bdSmrg    NULL,				/* error_string */
4341b2f0bdSmrg};
4441b2f0bdSmrg
4541b2f0bdSmrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xf86misc_info,
4641b2f0bdSmrg				   xf86misc_extension_name,
4741b2f0bdSmrg				   &xf86misc_extension_hooks,
4841b2f0bdSmrg				   0, NULL)
4941b2f0bdSmrg
5041b2f0bdSmrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, xf86misc_info)
5141b2f0bdSmrg
5241b2f0bdSmrg
5341b2f0bdSmrg/*****************************************************************************
5441b2f0bdSmrg *                                                                           *
5541b2f0bdSmrg *		    public XFree86-Misc Extension routines                *
5641b2f0bdSmrg *                                                                           *
5741b2f0bdSmrg *****************************************************************************/
5841b2f0bdSmrg
5911245024SmrgBool XF86MiscQueryExtension (Display *dpy, int *event_basep, int *error_basep)
6041b2f0bdSmrg{
6141b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
6241b2f0bdSmrg
6341b2f0bdSmrg    if (XextHasExtension(info)) {
6441b2f0bdSmrg	*event_basep = info->codes->first_event;
6541b2f0bdSmrg	*error_basep = info->codes->first_error;
6641b2f0bdSmrg	return True;
6741b2f0bdSmrg    } else {
6841b2f0bdSmrg	return False;
6941b2f0bdSmrg    }
7041b2f0bdSmrg}
7141b2f0bdSmrg
7211245024SmrgBool XF86MiscQueryVersion(Display* dpy, int* majorVersion, int* minorVersion)
7341b2f0bdSmrg{
7441b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
7541b2f0bdSmrg    xXF86MiscQueryVersionReply rep;
7641b2f0bdSmrg    xXF86MiscQueryVersionReq *req;
7741b2f0bdSmrg
7841b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
7941b2f0bdSmrg    LockDisplay(dpy);
8041b2f0bdSmrg    GetReq(XF86MiscQueryVersion, req);
8141b2f0bdSmrg    req->reqType = info->codes->major_opcode;
8241b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscQueryVersion;
8341b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
8441b2f0bdSmrg	UnlockDisplay(dpy);
8541b2f0bdSmrg	SyncHandle();
8641b2f0bdSmrg	return False;
8741b2f0bdSmrg    }
8841b2f0bdSmrg    *majorVersion = rep.majorVersion;
8941b2f0bdSmrg    *minorVersion = rep.minorVersion;
9041b2f0bdSmrg    UnlockDisplay(dpy);
9141b2f0bdSmrg    SyncHandle();
9241b2f0bdSmrg    if (*majorVersion > 0 || *minorVersion > 5)
9341b2f0bdSmrg	XF86MiscSetClientVersion(dpy);
9441b2f0bdSmrg
9541b2f0bdSmrg    return True;
9641b2f0bdSmrg}
9741b2f0bdSmrg
9841b2f0bdSmrgBool
9941b2f0bdSmrgXF86MiscSetClientVersion(Display *dpy)
10041b2f0bdSmrg{
10141b2f0bdSmrg    XExtDisplayInfo *info = find_display(dpy);
10241b2f0bdSmrg    xXF86MiscSetClientVersionReq *req;
10341b2f0bdSmrg
10441b2f0bdSmrg    XF86MiscCheckExtension(dpy, info, False);
10541b2f0bdSmrg
10641b2f0bdSmrg    LockDisplay(dpy);
10741b2f0bdSmrg    GetReq(XF86MiscSetClientVersion, req);
10841b2f0bdSmrg    req->reqType = info->codes->major_opcode;
10941b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetClientVersion;
11041b2f0bdSmrg    req->major = XF86MISC_MAJOR_VERSION;
11141b2f0bdSmrg    req->minor = XF86MISC_MINOR_VERSION;
11241b2f0bdSmrg    UnlockDisplay(dpy);
11341b2f0bdSmrg    SyncHandle();
11441b2f0bdSmrg    return True;
11541b2f0bdSmrg}
11641b2f0bdSmrg
11711245024SmrgBool XF86MiscGetMouseSettings(Display* dpy, XF86MiscMouseSettings *mouseinfo)
11841b2f0bdSmrg{
11941b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
12041b2f0bdSmrg    xXF86MiscGetMouseSettingsReply rep;
12141b2f0bdSmrg    xXF86MiscGetMouseSettingsReq *req;
12241b2f0bdSmrg
12341b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
12441b2f0bdSmrg
12541b2f0bdSmrg    LockDisplay(dpy);
12641b2f0bdSmrg    GetReq(XF86MiscGetMouseSettings, req);
12741b2f0bdSmrg    req->reqType = info->codes->major_opcode;
12841b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetMouseSettings;
12941b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep,
13041b2f0bdSmrg		(SIZEOF(xXF86MiscGetMouseSettingsReply) - SIZEOF(xReply))>>2,
13141b2f0bdSmrg		xFalse)) {
13241b2f0bdSmrg	UnlockDisplay(dpy);
13341b2f0bdSmrg	SyncHandle();
13441b2f0bdSmrg	return False;
13541b2f0bdSmrg    }
13641b2f0bdSmrg
13741b2f0bdSmrg    mouseinfo->type = rep.mousetype;
13841b2f0bdSmrg    mouseinfo->baudrate = rep.baudrate;
13941b2f0bdSmrg    mouseinfo->samplerate = rep.samplerate;
14041b2f0bdSmrg    mouseinfo->resolution = rep.resolution;
14141b2f0bdSmrg    mouseinfo->buttons = rep.buttons;
14241b2f0bdSmrg    mouseinfo->emulate3buttons = rep.emulate3buttons;
14341b2f0bdSmrg    mouseinfo->emulate3timeout = rep.emulate3timeout;
14441b2f0bdSmrg    mouseinfo->chordmiddle = rep.chordmiddle;
14541b2f0bdSmrg    mouseinfo->flags = rep.flags;
14641b2f0bdSmrg    if (rep.devnamelen > 0) {
14741b2f0bdSmrg        if (!(mouseinfo->device = Xcalloc(rep.devnamelen + 1, 1))) {
14841b2f0bdSmrg            _XEatData(dpy, (rep.devnamelen+3) & ~3);
14941b2f0bdSmrg            Xfree(mouseinfo->device);
15041b2f0bdSmrg            return False;
15141b2f0bdSmrg        }
15241b2f0bdSmrg        _XReadPad(dpy, mouseinfo->device, rep.devnamelen);
15341b2f0bdSmrg    } else
15441b2f0bdSmrg	mouseinfo->device = NULL;
15541b2f0bdSmrg
15641b2f0bdSmrg    UnlockDisplay(dpy);
15741b2f0bdSmrg    SyncHandle();
15841b2f0bdSmrg    return True;
15941b2f0bdSmrg}
16041b2f0bdSmrg
16111245024SmrgBool XF86MiscGetKbdSettings(Display* dpy, XF86MiscKbdSettings *kbdinfo)
16241b2f0bdSmrg{
16341b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
16441b2f0bdSmrg    xXF86MiscGetKbdSettingsReply rep;
16541b2f0bdSmrg    xXF86MiscGetKbdSettingsReq *req;
16641b2f0bdSmrg
16741b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
16841b2f0bdSmrg
16941b2f0bdSmrg    LockDisplay(dpy);
17041b2f0bdSmrg    GetReq(XF86MiscGetKbdSettings, req);
17141b2f0bdSmrg    req->reqType = info->codes->major_opcode;
17241b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetKbdSettings;
17341b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
17441b2f0bdSmrg	UnlockDisplay(dpy);
17541b2f0bdSmrg	SyncHandle();
17641b2f0bdSmrg	return False;
17741b2f0bdSmrg    }
17841b2f0bdSmrg
17941b2f0bdSmrg    kbdinfo->type = rep.kbdtype;
18041b2f0bdSmrg    kbdinfo->rate = rep.rate;
18141b2f0bdSmrg    kbdinfo->delay = rep.delay;
18241b2f0bdSmrg    kbdinfo->servnumlock = rep.servnumlock;
18341b2f0bdSmrg
18441b2f0bdSmrg    UnlockDisplay(dpy);
18541b2f0bdSmrg    SyncHandle();
18641b2f0bdSmrg    return True;
18741b2f0bdSmrg}
18841b2f0bdSmrg
18911245024SmrgBool XF86MiscSetMouseSettings(Display* dpy, XF86MiscMouseSettings *mouseinfo)
19041b2f0bdSmrg{
19141b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
19241b2f0bdSmrg    xXF86MiscSetMouseSettingsReq *req;
19341b2f0bdSmrg    int majorVersion, minorVersion;
19441b2f0bdSmrg
19541b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
19641b2f0bdSmrg    XF86MiscQueryVersion(dpy, &majorVersion, &minorVersion);
19741b2f0bdSmrg
19841b2f0bdSmrg    LockDisplay(dpy);
19941b2f0bdSmrg    GetReq(XF86MiscSetMouseSettings, req);
20041b2f0bdSmrg
20141b2f0bdSmrg    req->reqType = info->codes->major_opcode;
20241b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetMouseSettings;
20341b2f0bdSmrg    req->mousetype = mouseinfo->type;
20441b2f0bdSmrg    req->baudrate = mouseinfo->baudrate;
20541b2f0bdSmrg    req->samplerate = mouseinfo->samplerate;
20641b2f0bdSmrg    req->resolution = mouseinfo->resolution;
20741b2f0bdSmrg    req->buttons = mouseinfo->buttons;
20841b2f0bdSmrg    req->emulate3buttons = mouseinfo->emulate3buttons;
20941b2f0bdSmrg    req->emulate3timeout = mouseinfo->emulate3timeout;
21041b2f0bdSmrg    req->chordmiddle = mouseinfo->chordmiddle;
21141b2f0bdSmrg    req->flags = mouseinfo->flags;
21241b2f0bdSmrg    if (majorVersion > 0 || minorVersion > 5) {
21341b2f0bdSmrg	int len;
21441b2f0bdSmrg	if ((len = strlen(mouseinfo->device))) {
21541b2f0bdSmrg	req->devnamelen =  len + 1;
21641b2f0bdSmrg	len = (req->devnamelen + 3) >> 2;
21741b2f0bdSmrg	SetReqLen(req,len,len);
21841b2f0bdSmrg	Data(dpy, mouseinfo->device, req->devnamelen);
21941b2f0bdSmrg	}
22041b2f0bdSmrg    }
22141b2f0bdSmrg
22241b2f0bdSmrg    UnlockDisplay(dpy);
22341b2f0bdSmrg    SyncHandle();
22441b2f0bdSmrg    return True;
22541b2f0bdSmrg}
22641b2f0bdSmrg
22711245024SmrgBool XF86MiscSetKbdSettings(Display* dpy, XF86MiscKbdSettings *kbdinfo)
22841b2f0bdSmrg{
22941b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
23041b2f0bdSmrg    xXF86MiscSetKbdSettingsReq *req;
23141b2f0bdSmrg
23241b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
23341b2f0bdSmrg
23441b2f0bdSmrg    LockDisplay(dpy);
23541b2f0bdSmrg    GetReq(XF86MiscSetKbdSettings, req);
23641b2f0bdSmrg    req->reqType = info->codes->major_opcode;
23741b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetKbdSettings;
23841b2f0bdSmrg    req->kbdtype = kbdinfo->type;
23941b2f0bdSmrg    req->rate = kbdinfo->rate;
24041b2f0bdSmrg    req->delay = kbdinfo->delay;
24141b2f0bdSmrg    req->servnumlock = kbdinfo->servnumlock;
24241b2f0bdSmrg
24341b2f0bdSmrg    UnlockDisplay(dpy);
24441b2f0bdSmrg    SyncHandle();
24541b2f0bdSmrg    return True;
24641b2f0bdSmrg}
24741b2f0bdSmrg
24811245024Smrgint XF86MiscSetGrabKeysState(Display* dpy, Bool enable)
24941b2f0bdSmrg{
25041b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
25141b2f0bdSmrg    xXF86MiscSetGrabKeysStateReply rep;
25241b2f0bdSmrg    xXF86MiscSetGrabKeysStateReq *req;
25341b2f0bdSmrg
25441b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
25541b2f0bdSmrg
25641b2f0bdSmrg    LockDisplay(dpy);
25741b2f0bdSmrg    GetReq(XF86MiscSetGrabKeysState, req);
25841b2f0bdSmrg    req->reqType = info->codes->major_opcode;
25941b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetGrabKeysState;
26041b2f0bdSmrg    req->enable = enable;
26141b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
26241b2f0bdSmrg	UnlockDisplay(dpy);
26341b2f0bdSmrg	SyncHandle();
26441b2f0bdSmrg	return 0;
26541b2f0bdSmrg    }
26641b2f0bdSmrg
26741b2f0bdSmrg    UnlockDisplay(dpy);
26841b2f0bdSmrg    SyncHandle();
26941b2f0bdSmrg    return rep.status;
27041b2f0bdSmrg}
27141b2f0bdSmrg
27211245024SmrgBool XF86MiscGetFilePaths(Display* dpy, XF86MiscFilePaths *filpaths)
27341b2f0bdSmrg{
27441b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
27541b2f0bdSmrg    xXF86MiscGetFilePathsReply rep;
27641b2f0bdSmrg    xXF86MiscGetFilePathsReq *req;
27741b2f0bdSmrg
27841b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
27941b2f0bdSmrg
28041b2f0bdSmrg    LockDisplay(dpy);
28141b2f0bdSmrg    GetReq(XF86MiscGetFilePaths, req);
28241b2f0bdSmrg    req->reqType = info->codes->major_opcode;
28341b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetFilePaths;
28441b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
28541b2f0bdSmrg	UnlockDisplay(dpy);
28641b2f0bdSmrg	SyncHandle();
28741b2f0bdSmrg	return False;
28841b2f0bdSmrg    }
28941b2f0bdSmrg
29041b2f0bdSmrg    if (rep.configlen) {
29141b2f0bdSmrg        if (!(filpaths->configfile = Xcalloc(rep.configlen + 1, 1))) {
29241b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
29341b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
29441b2f0bdSmrg            return False;
29541b2f0bdSmrg        }
29641b2f0bdSmrg    }
29741b2f0bdSmrg
29841b2f0bdSmrg    if (rep.modulelen) {
29941b2f0bdSmrg        if (!(filpaths->modulepath = Xcalloc(rep.modulelen + 1, 1))) {
30041b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
30141b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
30241b2f0bdSmrg            if (filpaths->configfile)
30341b2f0bdSmrg		    Xfree(filpaths->configfile);
30441b2f0bdSmrg            return False;
30541b2f0bdSmrg        }
30641b2f0bdSmrg    }
30741b2f0bdSmrg
30841b2f0bdSmrg    if (rep.loglen) {
30941b2f0bdSmrg        if (!(filpaths->logfile = Xcalloc(rep.loglen + 1, 1))) {
31041b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
31141b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
31241b2f0bdSmrg            if (filpaths->configfile)
31341b2f0bdSmrg		    Xfree(filpaths->configfile);
31441b2f0bdSmrg            if (filpaths->modulepath)
31541b2f0bdSmrg		    Xfree(filpaths->modulepath);
31641b2f0bdSmrg            return False;
31741b2f0bdSmrg        }
31841b2f0bdSmrg    }
31941b2f0bdSmrg
32041b2f0bdSmrg    if (rep.configlen)
32141b2f0bdSmrg        _XReadPad(dpy, filpaths->configfile, rep.configlen);
32241b2f0bdSmrg    else
32341b2f0bdSmrg	filpaths->configfile = "";
32441b2f0bdSmrg
32541b2f0bdSmrg    if (rep.modulelen)
32641b2f0bdSmrg        _XReadPad(dpy, filpaths->modulepath, rep.modulelen);
32741b2f0bdSmrg    else
32841b2f0bdSmrg	filpaths->modulepath = "";
32941b2f0bdSmrg
33041b2f0bdSmrg    if (rep.loglen)
33141b2f0bdSmrg        _XReadPad(dpy, filpaths->logfile, rep.loglen);
33241b2f0bdSmrg    else
33341b2f0bdSmrg	filpaths->logfile = "";
33441b2f0bdSmrg
33541b2f0bdSmrg    UnlockDisplay(dpy);
33641b2f0bdSmrg    SyncHandle();
33741b2f0bdSmrg    return True;
33841b2f0bdSmrg}
33941b2f0bdSmrg
34011245024SmrgStatus XF86MiscPassMessage(Display* dpy, int screen,
34111245024Smrg			   const char* msgtype, const char* msgval,
34211245024Smrg			   char** retmsg)
34341b2f0bdSmrg{
34441b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
34541b2f0bdSmrg    xXF86MiscPassMessageReply rep;
34641b2f0bdSmrg    xXF86MiscPassMessageReq *req;
34741b2f0bdSmrg    int len;
34841b2f0bdSmrg
34941b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
35041b2f0bdSmrg
35141b2f0bdSmrg    LockDisplay(dpy);
35241b2f0bdSmrg    GetReq(XF86MiscPassMessage, req);
35341b2f0bdSmrg    req->reqType = info->codes->major_opcode;
35441b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscPassMessage;
35541b2f0bdSmrg    req->screen = screen;
35641b2f0bdSmrg    if ((len = strlen(msgtype))) {
35741b2f0bdSmrg	req->typelen =  len + 1;
35841b2f0bdSmrg	len = (req->typelen + 3) >> 2;
35941b2f0bdSmrg	SetReqLen(req,len,len);
36041b2f0bdSmrg	Data(dpy, msgtype, req->typelen);
36141b2f0bdSmrg    }
36241b2f0bdSmrg    if ((len = strlen(msgval))) {
36341b2f0bdSmrg	req->vallen =  len + 1;
36441b2f0bdSmrg	len = (req->vallen + 3) >> 2;
36541b2f0bdSmrg	SetReqLen(req,len,len);
36641b2f0bdSmrg	Data(dpy, msgval, req->vallen);
36741b2f0bdSmrg    }
36841b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
36941b2f0bdSmrg	UnlockDisplay(dpy);
37041b2f0bdSmrg	SyncHandle();
37141b2f0bdSmrg	return BadImplementation;
37241b2f0bdSmrg    }
37341b2f0bdSmrg
37441b2f0bdSmrg    if (rep.mesglen) {
37541b2f0bdSmrg        if (!(*retmsg = Xcalloc(rep.mesglen + 1, 1))) {
37641b2f0bdSmrg            _XEatData(dpy, ((rep.mesglen+3) & ~3));
37741b2f0bdSmrg            return BadAlloc;
37841b2f0bdSmrg        }
37941b2f0bdSmrg        _XReadPad(dpy, *retmsg, rep.mesglen);
38041b2f0bdSmrg    }
38141b2f0bdSmrg
38241b2f0bdSmrg    UnlockDisplay(dpy);
38341b2f0bdSmrg    SyncHandle();
38441b2f0bdSmrg    return rep.status;
38541b2f0bdSmrg}
38641b2f0bdSmrg
387