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
456b526288Smrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xf86misc_info,
466b526288Smrg				   xf86misc_extension_name,
476b526288Smrg				   &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);
946b526288Smrg
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);
1506b526288Smrg	    UnlockDisplay(dpy);
1516b526288Smrg	    SyncHandle();
15241b2f0bdSmrg            return False;
15341b2f0bdSmrg        }
15441b2f0bdSmrg        _XReadPad(dpy, mouseinfo->device, rep.devnamelen);
15541b2f0bdSmrg    } else
15641b2f0bdSmrg	mouseinfo->device = NULL;
15741b2f0bdSmrg
15841b2f0bdSmrg    UnlockDisplay(dpy);
15941b2f0bdSmrg    SyncHandle();
16041b2f0bdSmrg    return True;
16141b2f0bdSmrg}
16241b2f0bdSmrg
16311245024SmrgBool XF86MiscGetKbdSettings(Display* dpy, XF86MiscKbdSettings *kbdinfo)
16441b2f0bdSmrg{
16541b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
16641b2f0bdSmrg    xXF86MiscGetKbdSettingsReply rep;
16741b2f0bdSmrg    xXF86MiscGetKbdSettingsReq *req;
16841b2f0bdSmrg
16941b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
17041b2f0bdSmrg
17141b2f0bdSmrg    LockDisplay(dpy);
17241b2f0bdSmrg    GetReq(XF86MiscGetKbdSettings, req);
17341b2f0bdSmrg    req->reqType = info->codes->major_opcode;
17441b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetKbdSettings;
17541b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
17641b2f0bdSmrg	UnlockDisplay(dpy);
17741b2f0bdSmrg	SyncHandle();
17841b2f0bdSmrg	return False;
17941b2f0bdSmrg    }
18041b2f0bdSmrg
18141b2f0bdSmrg    kbdinfo->type = rep.kbdtype;
18241b2f0bdSmrg    kbdinfo->rate = rep.rate;
18341b2f0bdSmrg    kbdinfo->delay = rep.delay;
18441b2f0bdSmrg    kbdinfo->servnumlock = rep.servnumlock;
18541b2f0bdSmrg
18641b2f0bdSmrg    UnlockDisplay(dpy);
18741b2f0bdSmrg    SyncHandle();
18841b2f0bdSmrg    return True;
18941b2f0bdSmrg}
19041b2f0bdSmrg
19111245024SmrgBool XF86MiscSetMouseSettings(Display* dpy, XF86MiscMouseSettings *mouseinfo)
19241b2f0bdSmrg{
19341b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
19441b2f0bdSmrg    xXF86MiscSetMouseSettingsReq *req;
19541b2f0bdSmrg    int majorVersion, minorVersion;
1966b526288Smrg
19741b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
19841b2f0bdSmrg    XF86MiscQueryVersion(dpy, &majorVersion, &minorVersion);
1996b526288Smrg
20041b2f0bdSmrg    LockDisplay(dpy);
20141b2f0bdSmrg    GetReq(XF86MiscSetMouseSettings, req);
2026b526288Smrg
20341b2f0bdSmrg    req->reqType = info->codes->major_opcode;
20441b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetMouseSettings;
20541b2f0bdSmrg    req->mousetype = mouseinfo->type;
20641b2f0bdSmrg    req->baudrate = mouseinfo->baudrate;
20741b2f0bdSmrg    req->samplerate = mouseinfo->samplerate;
20841b2f0bdSmrg    req->resolution = mouseinfo->resolution;
20941b2f0bdSmrg    req->buttons = mouseinfo->buttons;
21041b2f0bdSmrg    req->emulate3buttons = mouseinfo->emulate3buttons;
21141b2f0bdSmrg    req->emulate3timeout = mouseinfo->emulate3timeout;
21241b2f0bdSmrg    req->chordmiddle = mouseinfo->chordmiddle;
21341b2f0bdSmrg    req->flags = mouseinfo->flags;
21441b2f0bdSmrg    if (majorVersion > 0 || minorVersion > 5) {
21541b2f0bdSmrg	int len;
21641b2f0bdSmrg	if ((len = strlen(mouseinfo->device))) {
21741b2f0bdSmrg	req->devnamelen =  len + 1;
21841b2f0bdSmrg	len = (req->devnamelen + 3) >> 2;
21941b2f0bdSmrg	SetReqLen(req,len,len);
22041b2f0bdSmrg	Data(dpy, mouseinfo->device, req->devnamelen);
22141b2f0bdSmrg	}
22241b2f0bdSmrg    }
2236b526288Smrg
22441b2f0bdSmrg    UnlockDisplay(dpy);
22541b2f0bdSmrg    SyncHandle();
22641b2f0bdSmrg    return True;
22741b2f0bdSmrg}
22841b2f0bdSmrg
22911245024SmrgBool XF86MiscSetKbdSettings(Display* dpy, XF86MiscKbdSettings *kbdinfo)
23041b2f0bdSmrg{
23141b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
23241b2f0bdSmrg    xXF86MiscSetKbdSettingsReq *req;
23341b2f0bdSmrg
23441b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
23541b2f0bdSmrg
23641b2f0bdSmrg    LockDisplay(dpy);
23741b2f0bdSmrg    GetReq(XF86MiscSetKbdSettings, req);
23841b2f0bdSmrg    req->reqType = info->codes->major_opcode;
23941b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetKbdSettings;
24041b2f0bdSmrg    req->kbdtype = kbdinfo->type;
24141b2f0bdSmrg    req->rate = kbdinfo->rate;
24241b2f0bdSmrg    req->delay = kbdinfo->delay;
24341b2f0bdSmrg    req->servnumlock = kbdinfo->servnumlock;
24441b2f0bdSmrg
24541b2f0bdSmrg    UnlockDisplay(dpy);
24641b2f0bdSmrg    SyncHandle();
24741b2f0bdSmrg    return True;
24841b2f0bdSmrg}
24941b2f0bdSmrg
25011245024Smrgint XF86MiscSetGrabKeysState(Display* dpy, Bool enable)
25141b2f0bdSmrg{
25241b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
25341b2f0bdSmrg    xXF86MiscSetGrabKeysStateReply rep;
25441b2f0bdSmrg    xXF86MiscSetGrabKeysStateReq *req;
25541b2f0bdSmrg
25641b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
25741b2f0bdSmrg
25841b2f0bdSmrg    LockDisplay(dpy);
25941b2f0bdSmrg    GetReq(XF86MiscSetGrabKeysState, req);
26041b2f0bdSmrg    req->reqType = info->codes->major_opcode;
26141b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscSetGrabKeysState;
26241b2f0bdSmrg    req->enable = enable;
26341b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
26441b2f0bdSmrg	UnlockDisplay(dpy);
26541b2f0bdSmrg	SyncHandle();
26641b2f0bdSmrg	return 0;
26741b2f0bdSmrg    }
26841b2f0bdSmrg
26941b2f0bdSmrg    UnlockDisplay(dpy);
27041b2f0bdSmrg    SyncHandle();
27141b2f0bdSmrg    return rep.status;
27241b2f0bdSmrg}
27341b2f0bdSmrg
27411245024SmrgBool XF86MiscGetFilePaths(Display* dpy, XF86MiscFilePaths *filpaths)
27541b2f0bdSmrg{
27641b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
27741b2f0bdSmrg    xXF86MiscGetFilePathsReply rep;
27841b2f0bdSmrg    xXF86MiscGetFilePathsReq *req;
27941b2f0bdSmrg
28041b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
28141b2f0bdSmrg
28241b2f0bdSmrg    LockDisplay(dpy);
28341b2f0bdSmrg    GetReq(XF86MiscGetFilePaths, req);
28441b2f0bdSmrg    req->reqType = info->codes->major_opcode;
28541b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscGetFilePaths;
28641b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
28741b2f0bdSmrg	UnlockDisplay(dpy);
28841b2f0bdSmrg	SyncHandle();
28941b2f0bdSmrg	return False;
29041b2f0bdSmrg    }
29141b2f0bdSmrg
29241b2f0bdSmrg    if (rep.configlen) {
29341b2f0bdSmrg        if (!(filpaths->configfile = Xcalloc(rep.configlen + 1, 1))) {
29441b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
29541b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
2966b526288Smrg	    UnlockDisplay(dpy);
2976b526288Smrg	    SyncHandle();
29841b2f0bdSmrg            return False;
29941b2f0bdSmrg        }
30041b2f0bdSmrg    }
30141b2f0bdSmrg
30241b2f0bdSmrg    if (rep.modulelen) {
30341b2f0bdSmrg        if (!(filpaths->modulepath = Xcalloc(rep.modulelen + 1, 1))) {
30441b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
30541b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
30641b2f0bdSmrg            if (filpaths->configfile)
30741b2f0bdSmrg		    Xfree(filpaths->configfile);
3086b526288Smrg	    UnlockDisplay(dpy);
3096b526288Smrg	    SyncHandle();
31041b2f0bdSmrg            return False;
31141b2f0bdSmrg        }
31241b2f0bdSmrg    }
31341b2f0bdSmrg
31441b2f0bdSmrg    if (rep.loglen) {
31541b2f0bdSmrg        if (!(filpaths->logfile = Xcalloc(rep.loglen + 1, 1))) {
31641b2f0bdSmrg            _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
31741b2f0bdSmrg			    + ((rep.loglen+3) & ~3));
31841b2f0bdSmrg            if (filpaths->configfile)
31941b2f0bdSmrg		    Xfree(filpaths->configfile);
32041b2f0bdSmrg            if (filpaths->modulepath)
32141b2f0bdSmrg		    Xfree(filpaths->modulepath);
3226b526288Smrg	    UnlockDisplay(dpy);
3236b526288Smrg	    SyncHandle();
32441b2f0bdSmrg            return False;
32541b2f0bdSmrg        }
32641b2f0bdSmrg    }
32741b2f0bdSmrg
32841b2f0bdSmrg    if (rep.configlen)
32941b2f0bdSmrg        _XReadPad(dpy, filpaths->configfile, rep.configlen);
33041b2f0bdSmrg    else
33141b2f0bdSmrg	filpaths->configfile = "";
33241b2f0bdSmrg
33341b2f0bdSmrg    if (rep.modulelen)
33441b2f0bdSmrg        _XReadPad(dpy, filpaths->modulepath, rep.modulelen);
33541b2f0bdSmrg    else
33641b2f0bdSmrg	filpaths->modulepath = "";
33741b2f0bdSmrg
33841b2f0bdSmrg    if (rep.loglen)
33941b2f0bdSmrg        _XReadPad(dpy, filpaths->logfile, rep.loglen);
34041b2f0bdSmrg    else
34141b2f0bdSmrg	filpaths->logfile = "";
34241b2f0bdSmrg
34341b2f0bdSmrg    UnlockDisplay(dpy);
34441b2f0bdSmrg    SyncHandle();
34541b2f0bdSmrg    return True;
34641b2f0bdSmrg}
34741b2f0bdSmrg
34811245024SmrgStatus XF86MiscPassMessage(Display* dpy, int screen,
34911245024Smrg			   const char* msgtype, const char* msgval,
35011245024Smrg			   char** retmsg)
35141b2f0bdSmrg{
35241b2f0bdSmrg    XExtDisplayInfo *info = find_display (dpy);
35341b2f0bdSmrg    xXF86MiscPassMessageReply rep;
35441b2f0bdSmrg    xXF86MiscPassMessageReq *req;
35541b2f0bdSmrg    int len;
35641b2f0bdSmrg
35741b2f0bdSmrg    XF86MiscCheckExtension (dpy, info, False);
35841b2f0bdSmrg
35941b2f0bdSmrg    LockDisplay(dpy);
36041b2f0bdSmrg    GetReq(XF86MiscPassMessage, req);
36141b2f0bdSmrg    req->reqType = info->codes->major_opcode;
36241b2f0bdSmrg    req->xf86miscReqType = X_XF86MiscPassMessage;
36341b2f0bdSmrg    req->screen = screen;
36441b2f0bdSmrg    if ((len = strlen(msgtype))) {
36541b2f0bdSmrg	req->typelen =  len + 1;
36641b2f0bdSmrg	len = (req->typelen + 3) >> 2;
36741b2f0bdSmrg	SetReqLen(req,len,len);
36841b2f0bdSmrg	Data(dpy, msgtype, req->typelen);
36941b2f0bdSmrg    }
37041b2f0bdSmrg    if ((len = strlen(msgval))) {
37141b2f0bdSmrg	req->vallen =  len + 1;
37241b2f0bdSmrg	len = (req->vallen + 3) >> 2;
37341b2f0bdSmrg	SetReqLen(req,len,len);
37441b2f0bdSmrg	Data(dpy, msgval, req->vallen);
37541b2f0bdSmrg    }
37641b2f0bdSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
37741b2f0bdSmrg	UnlockDisplay(dpy);
37841b2f0bdSmrg	SyncHandle();
37941b2f0bdSmrg	return BadImplementation;
38041b2f0bdSmrg    }
38141b2f0bdSmrg
38241b2f0bdSmrg    if (rep.mesglen) {
38341b2f0bdSmrg        if (!(*retmsg = Xcalloc(rep.mesglen + 1, 1))) {
38441b2f0bdSmrg            _XEatData(dpy, ((rep.mesglen+3) & ~3));
3856b526288Smrg	    UnlockDisplay(dpy);
3866b526288Smrg	    SyncHandle();
38741b2f0bdSmrg            return BadAlloc;
38841b2f0bdSmrg        }
38941b2f0bdSmrg        _XReadPad(dpy, *retmsg, rep.mesglen);
39041b2f0bdSmrg    }
39141b2f0bdSmrg
39241b2f0bdSmrg    UnlockDisplay(dpy);
39341b2f0bdSmrg    SyncHandle();
39441b2f0bdSmrg    return rep.status;
39541b2f0bdSmrg}
39641b2f0bdSmrg
397