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