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