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