XF86Misc.c revision 41b2f0bd
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
5941b2f0bdSmrgBool XF86MiscQueryExtension (dpy, event_basep, error_basep)
6041b2f0bdSmrg    Display *dpy;
6141b2f0bdSmrg    int *event_basep, *error_basep;
6241b2f0bdSmrg{
6341b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
6441b2f0bdSmrg
6541b2f0bdSmrg    if (XextHasExtension(info)) {
6641b2f0bdSmrg	*event_basep = info->codes->first_event;
6741b2f0bdSmrg	*error_basep = info->codes->first_error;
6841b2f0bdSmrg	return True;
6941b2f0bdSmrg    } else {
7041b2f0bdSmrg	return False;
7141b2f0bdSmrg    }
7241b2f0bdSmrg}
7341b2f0bdSmrg
7441b2f0bdSmrgBool XF86MiscQueryVersion(dpy, majorVersion, minorVersion)
7541b2f0bdSmrg    Display* dpy;
7641b2f0bdSmrg    int* majorVersion;
7741b2f0bdSmrg    int* minorVersion;
7841b2f0bdSmrg{
7941b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
8041b2f0bdSmrg    xXF86MiscQueryVersionReply rep;
8141b2f0bdSmrg    xXF86MiscQueryVersionReq *req;
8241b2f0bdSmrg
8341b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
8441b2f0bdSmrg    LockDisplay(dpy);
8541b2f0bdSmrg    GetReq(XF86MiscQueryVersion, req);
8641b2f0bdSmrg    req->reqType = info->codes->major_opcode;
8741b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscQueryVersion;
8841b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
8941b2f0bdSmrg	UnlockDisplay(dpy);
9041b2f0bdSmrg	SyncHandle();
9141b2f0bdSmrg	return False;
9241b2f0bdSmrg    }
9341b2f0bdSmrg    *majorVersion = rep.majorVersion;
9441b2f0bdSmrg    *minorVersion = rep.minorVersion;
9541b2f0bdSmrg    UnlockDisplay(dpy);
9641b2f0bdSmrg    SyncHandle();
9741b2f0bdSmrg    if (*majorVersion > 0 || *minorVersion > 5)
9841b2f0bdSmrg	XF86MiscSetClientVersion(dpy);
9941b2f0bdSmrg
10041b2f0bdSmrg    return True;
10141b2f0bdSmrg}
10241b2f0bdSmrg
10341b2f0bdSmrgBool
10441b2f0bdSmrgXF86MiscSetClientVersion(Display *dpy)
10541b2f0bdSmrg{
10641b2f0bdSmrg    XExtDisplayInfo *info = find_display(dpy);
10741b2f0bdSmrg    xXF86MiscSetClientVersionReq *req;
10841b2f0bdSmrg
10941b2f0bdSmrg    XF86MiscCheckExtension(dpy, info, False);
11041b2f0bdSmrg
11141b2f0bdSmrg    LockDisplay(dpy);
11241b2f0bdSmrg    GetReq(XF86MiscSetClientVersion, req);
11341b2f0bdSmrg    req->reqType = info->codes->major_opcode;
11441b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetClientVersion;
11541b2f0bdSmrg    req->major = XF86MISC_MAJOR_VERSION;
11641b2f0bdSmrg    req->minor = XF86MISC_MINOR_VERSION;
11741b2f0bdSmrg    UnlockDisplay(dpy);
11841b2f0bdSmrg    SyncHandle();
11941b2f0bdSmrg    return True;
12041b2f0bdSmrg}
12141b2f0bdSmrg
12241b2f0bdSmrgBool XF86MiscGetMouseSettings(dpy, mouseinfo)
12341b2f0bdSmrg    Display* dpy;
12441b2f0bdSmrg    XF86MiscMouseSettings *mouseinfo;
12541b2f0bdSmrg{
12641b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
12741b2f0bdSmrg    xXF86MiscGetMouseSettingsReply rep;
12841b2f0bdSmrg    xXF86MiscGetMouseSettingsReq *req;
12941b2f0bdSmrg
13041b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
13141b2f0bdSmrg
13241b2f0bdSmrg    LockDisplay(dpy);
13341b2f0bdSmrg    GetReq(XF86MiscGetMouseSettings, req);
13441b2f0bdSmrg    req->reqType = info->codes->major_opcode;
13541b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetMouseSettings;
13641b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep,
13741b2f0bdSmrg		(SIZEOF(xXF86MiscGetMouseSettingsReply) - SIZEOF(xReply))>>2,
13841b2f0bdSmrg		xFalse)) {
13941b2f0bdSmrg	UnlockDisplay(dpy);
14041b2f0bdSmrg	SyncHandle();
14141b2f0bdSmrg	return False;
14241b2f0bdSmrg    }
14341b2f0bdSmrg
14441b2f0bdSmrg    mouseinfo->type = rep.mousetype;
14541b2f0bdSmrg    mouseinfo->baudrate = rep.baudrate;
14641b2f0bdSmrg    mouseinfo->samplerate = rep.samplerate;
14741b2f0bdSmrg    mouseinfo->resolution = rep.resolution;
14841b2f0bdSmrg    mouseinfo->buttons = rep.buttons;
14941b2f0bdSmrg    mouseinfo->emulate3buttons = rep.emulate3buttons;
15041b2f0bdSmrg    mouseinfo->emulate3timeout = rep.emulate3timeout;
15141b2f0bdSmrg    mouseinfo->chordmiddle = rep.chordmiddle;
15241b2f0bdSmrg    mouseinfo->flags = rep.flags;
15341b2f0bdSmrg    if (rep.devnamelen > 0) {
15441b2f0bdSmrg        if (!(mouseinfo->device = Xcalloc(rep.devnamelen + 1, 1))) {
15541b2f0bdSmrg            _XEatData(dpy, (rep.devnamelen+3) & ~3);
15641b2f0bdSmrg            Xfree(mouseinfo->device);
15741b2f0bdSmrg            return False;
15841b2f0bdSmrg        }
15941b2f0bdSmrg        _XReadPad(dpy, mouseinfo->device, rep.devnamelen);
16041b2f0bdSmrg    } else
16141b2f0bdSmrg	mouseinfo->device = NULL;
16241b2f0bdSmrg
16341b2f0bdSmrg    UnlockDisplay(dpy);
16441b2f0bdSmrg    SyncHandle();
16541b2f0bdSmrg    return True;
16641b2f0bdSmrg}
16741b2f0bdSmrg
16841b2f0bdSmrgBool XF86MiscGetKbdSettings(dpy, kbdinfo)
16941b2f0bdSmrg    Display* dpy;
17041b2f0bdSmrg    XF86MiscKbdSettings *kbdinfo;
17141b2f0bdSmrg{
17241b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
17341b2f0bdSmrg    xXF86MiscGetKbdSettingsReply rep;
17441b2f0bdSmrg    xXF86MiscGetKbdSettingsReq *req;
17541b2f0bdSmrg
17641b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
17741b2f0bdSmrg
17841b2f0bdSmrg    LockDisplay(dpy);
17941b2f0bdSmrg    GetReq(XF86MiscGetKbdSettings, req);
18041b2f0bdSmrg    req->reqType = info->codes->major_opcode;
18141b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetKbdSettings;
18241b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
18341b2f0bdSmrg	UnlockDisplay(dpy);
18441b2f0bdSmrg	SyncHandle();
18541b2f0bdSmrg	return False;
18641b2f0bdSmrg    }
18741b2f0bdSmrg
18841b2f0bdSmrg    kbdinfo->type = rep.kbdtype;
18941b2f0bdSmrg    kbdinfo->rate = rep.rate;
19041b2f0bdSmrg    kbdinfo->delay = rep.delay;
19141b2f0bdSmrg    kbdinfo->servnumlock = rep.servnumlock;
19241b2f0bdSmrg
19341b2f0bdSmrg    UnlockDisplay(dpy);
19441b2f0bdSmrg    SyncHandle();
19541b2f0bdSmrg    return True;
19641b2f0bdSmrg}
19741b2f0bdSmrg
19841b2f0bdSmrgBool XF86MiscSetMouseSettings(dpy, mouseinfo)
19941b2f0bdSmrg    Display* dpy;
20041b2f0bdSmrg    XF86MiscMouseSettings *mouseinfo;
20141b2f0bdSmrg{
20241b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
20341b2f0bdSmrg    xXF86MiscSetMouseSettingsReq *req;
20441b2f0bdSmrg    int majorVersion, minorVersion;
20541b2f0bdSmrg
20641b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
20741b2f0bdSmrg    XF86MiscQueryVersion(dpy, &majorVersion, &minorVersion);
20841b2f0bdSmrg
20941b2f0bdSmrg    LockDisplay(dpy);
21041b2f0bdSmrg    GetReq(XF86MiscSetMouseSettings, req);
21141b2f0bdSmrg
21241b2f0bdSmrg    req->reqType = info->codes->major_opcode;
21341b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetMouseSettings;
21441b2f0bdSmrg    req->mousetype = mouseinfo->type;
21541b2f0bdSmrg    req->baudrate = mouseinfo->baudrate;
21641b2f0bdSmrg    req->samplerate = mouseinfo->samplerate;
21741b2f0bdSmrg    req->resolution = mouseinfo->resolution;
21841b2f0bdSmrg    req->buttons = mouseinfo->buttons;
21941b2f0bdSmrg    req->emulate3buttons = mouseinfo->emulate3buttons;
22041b2f0bdSmrg    req->emulate3timeout = mouseinfo->emulate3timeout;
22141b2f0bdSmrg    req->chordmiddle = mouseinfo->chordmiddle;
22241b2f0bdSmrg    req->flags = mouseinfo->flags;
22341b2f0bdSmrg    if (majorVersion > 0 || minorVersion > 5) {
22441b2f0bdSmrg	int len;
22541b2f0bdSmrg	if ((len = strlen(mouseinfo->device))) {
22641b2f0bdSmrg	req->devnamelen =  len + 1;
22741b2f0bdSmrg	len = (req->devnamelen + 3) >> 2;
22841b2f0bdSmrg	SetReqLen(req,len,len);
22941b2f0bdSmrg	Data(dpy, mouseinfo->device, req->devnamelen);
23041b2f0bdSmrg	}
23141b2f0bdSmrg    }
23241b2f0bdSmrg
23341b2f0bdSmrg    UnlockDisplay(dpy);
23441b2f0bdSmrg    SyncHandle();
23541b2f0bdSmrg    return True;
23641b2f0bdSmrg}
23741b2f0bdSmrg
23841b2f0bdSmrgBool XF86MiscSetKbdSettings(dpy, kbdinfo)
23941b2f0bdSmrg    Display* dpy;
24041b2f0bdSmrg    XF86MiscKbdSettings *kbdinfo;
24141b2f0bdSmrg{
24241b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
24341b2f0bdSmrg    xXF86MiscSetKbdSettingsReq *req;
24441b2f0bdSmrg
24541b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
24641b2f0bdSmrg
24741b2f0bdSmrg    LockDisplay(dpy);
24841b2f0bdSmrg    GetReq(XF86MiscSetKbdSettings, req);
24941b2f0bdSmrg    req->reqType = info->codes->major_opcode;
25041b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetKbdSettings;
25141b2f0bdSmrg    req->kbdtype = kbdinfo->type;
25241b2f0bdSmrg    req->rate = kbdinfo->rate;
25341b2f0bdSmrg    req->delay = kbdinfo->delay;
25441b2f0bdSmrg    req->servnumlock = kbdinfo->servnumlock;
25541b2f0bdSmrg
25641b2f0bdSmrg    UnlockDisplay(dpy);
25741b2f0bdSmrg    SyncHandle();
25841b2f0bdSmrg    return True;
25941b2f0bdSmrg}
26041b2f0bdSmrg
26141b2f0bdSmrgint XF86MiscSetGrabKeysState(dpy, enable)
26241b2f0bdSmrg    Display* dpy;
26341b2f0bdSmrg    Bool enable;
26441b2f0bdSmrg{
26541b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
26641b2f0bdSmrg    xXF86MiscSetGrabKeysStateReply rep;
26741b2f0bdSmrg    xXF86MiscSetGrabKeysStateReq *req;
26841b2f0bdSmrg
26941b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
27041b2f0bdSmrg
27141b2f0bdSmrg    LockDisplay(dpy);
27241b2f0bdSmrg    GetReq(XF86MiscSetGrabKeysState, req);
27341b2f0bdSmrg    req->reqType = info->codes->major_opcode;
27441b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetGrabKeysState;
27541b2f0bdSmrg    req->enable = enable;
27641b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
27741b2f0bdSmrg	UnlockDisplay(dpy);
27841b2f0bdSmrg	SyncHandle();
27941b2f0bdSmrg	return 0;
28041b2f0bdSmrg    }
28141b2f0bdSmrg
28241b2f0bdSmrg    UnlockDisplay(dpy);
28341b2f0bdSmrg    SyncHandle();
28441b2f0bdSmrg    return rep.status;
28541b2f0bdSmrg}
28641b2f0bdSmrg
28741b2f0bdSmrgBool XF86MiscGetFilePaths(dpy, filpaths)
28841b2f0bdSmrg    Display* dpy;
28941b2f0bdSmrg    XF86MiscFilePaths *filpaths;
29041b2f0bdSmrg{
29141b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
29241b2f0bdSmrg    xXF86MiscGetFilePathsReply rep;
29341b2f0bdSmrg    xXF86MiscGetFilePathsReq *req;
29441b2f0bdSmrg
29541b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
29641b2f0bdSmrg
29741b2f0bdSmrg    LockDisplay(dpy);
29841b2f0bdSmrg    GetReq(XF86MiscGetFilePaths, req);
29941b2f0bdSmrg    req->reqType = info->codes->major_opcode;
30041b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetFilePaths;
30141b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
30241b2f0bdSmrg	UnlockDisplay(dpy);
30341b2f0bdSmrg	SyncHandle();
30441b2f0bdSmrg	return False;
30541b2f0bdSmrg    }
30641b2f0bdSmrg
30741b2f0bdSmrg    if (rep.configlen) {
30841b2f0bdSmrg        if (!(filpaths->configfile = Xcalloc(rep.configlen + 1, 1))) {
30941b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
31041b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
31141b2f0bdSmrg            return False;
31241b2f0bdSmrg        }
31341b2f0bdSmrg    }
31441b2f0bdSmrg
31541b2f0bdSmrg    if (rep.modulelen) {
31641b2f0bdSmrg        if (!(filpaths->modulepath = Xcalloc(rep.modulelen + 1, 1))) {
31741b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
31841b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
31941b2f0bdSmrg            if (filpaths->configfile)
32041b2f0bdSmrg		    Xfree(filpaths->configfile);
32141b2f0bdSmrg            return False;
32241b2f0bdSmrg        }
32341b2f0bdSmrg    }
32441b2f0bdSmrg
32541b2f0bdSmrg    if (rep.loglen) {
32641b2f0bdSmrg        if (!(filpaths->logfile = Xcalloc(rep.loglen + 1, 1))) {
32741b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
32841b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
32941b2f0bdSmrg            if (filpaths->configfile)
33041b2f0bdSmrg		    Xfree(filpaths->configfile);
33141b2f0bdSmrg            if (filpaths->modulepath)
33241b2f0bdSmrg		    Xfree(filpaths->modulepath);
33341b2f0bdSmrg            return False;
33441b2f0bdSmrg        }
33541b2f0bdSmrg    }
33641b2f0bdSmrg
33741b2f0bdSmrg    if (rep.configlen)
33841b2f0bdSmrg        _XReadPad(dpy, filpaths->configfile, rep.configlen);
33941b2f0bdSmrg    else
34041b2f0bdSmrg	filpaths->configfile = "";
34141b2f0bdSmrg
34241b2f0bdSmrg    if (rep.modulelen)
34341b2f0bdSmrg        _XReadPad(dpy, filpaths->modulepath, rep.modulelen);
34441b2f0bdSmrg    else
34541b2f0bdSmrg	filpaths->modulepath = "";
34641b2f0bdSmrg
34741b2f0bdSmrg    if (rep.loglen)
34841b2f0bdSmrg        _XReadPad(dpy, filpaths->logfile, rep.loglen);
34941b2f0bdSmrg    else
35041b2f0bdSmrg	filpaths->logfile = "";
35141b2f0bdSmrg
35241b2f0bdSmrg    UnlockDisplay(dpy);
35341b2f0bdSmrg    SyncHandle();
35441b2f0bdSmrg    return True;
35541b2f0bdSmrg}
35641b2f0bdSmrg
35741b2f0bdSmrgStatus XF86MiscPassMessage(dpy, screen, msgtype, msgval, retmsg)
35841b2f0bdSmrg    Display* dpy;
35941b2f0bdSmrg    int screen;
36041b2f0bdSmrg    const char* msgtype;
36141b2f0bdSmrg    const char* msgval;
36241b2f0bdSmrg    char** retmsg;
36341b2f0bdSmrg{
36441b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
36541b2f0bdSmrg    xXF86MiscPassMessageReply rep;
36641b2f0bdSmrg    xXF86MiscPassMessageReq *req;
36741b2f0bdSmrg    int len;
36841b2f0bdSmrg
36941b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
37041b2f0bdSmrg
37141b2f0bdSmrg    LockDisplay(dpy);
37241b2f0bdSmrg    GetReq(XF86MiscPassMessage, req);
37341b2f0bdSmrg    req->reqType = info->codes->major_opcode;
37441b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscPassMessage;
37541b2f0bdSmrg    req->screen = screen;
37641b2f0bdSmrg    if ((len = strlen(msgtype))) {
37741b2f0bdSmrg	req->typelen =  len + 1;
37841b2f0bdSmrg	len = (req->typelen + 3) >> 2;
37941b2f0bdSmrg	SetReqLen(req,len,len);
38041b2f0bdSmrg	Data(dpy, msgtype, req->typelen);
38141b2f0bdSmrg    }
38241b2f0bdSmrg    if ((len = strlen(msgval))) {
38341b2f0bdSmrg	req->vallen =  len + 1;
38441b2f0bdSmrg	len = (req->vallen + 3) >> 2;
38541b2f0bdSmrg	SetReqLen(req,len,len);
38641b2f0bdSmrg	Data(dpy, msgval, req->vallen);
38741b2f0bdSmrg    }
38841b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
38941b2f0bdSmrg	UnlockDisplay(dpy);
39041b2f0bdSmrg	SyncHandle();
39141b2f0bdSmrg	return BadImplementation;
39241b2f0bdSmrg    }
39341b2f0bdSmrg
39441b2f0bdSmrg    if (rep.mesglen) {
39541b2f0bdSmrg        if (!(*retmsg = Xcalloc(rep.mesglen + 1, 1))) {
39641b2f0bdSmrg            _XEatData(dpy, ((rep.mesglen+3) & ~3));
39741b2f0bdSmrg            return BadAlloc;
39841b2f0bdSmrg        }
39941b2f0bdSmrg        _XReadPad(dpy, *retmsg, rep.mesglen);
40041b2f0bdSmrg    }
40141b2f0bdSmrg
40241b2f0bdSmrg    UnlockDisplay(dpy);
40341b2f0bdSmrg    SyncHandle();
40441b2f0bdSmrg    return rep.status;
40541b2f0bdSmrg}
40641b2f0bdSmrg
407