1 /* $XFree86: xc/lib/Xxf86misc/XF86Misc.c,v 3.12 2002/11/20 04:04:57 dawes Exp $ */
4 * Copyright (c) 1995, 1996 The XFree86 Project, Inc
7 /* THIS IS NOT AN X CONSORTIUM STANDARD */
11 #include <X11/Xlibint.h>
12 #include <X11/extensions/xf86mscstr.h>
13 #include <X11/extensions/Xext.h>
14 #include <X11/extensions/extutil.h>
16 static XExtensionInfo _xf86misc_info_data;
17 static XExtensionInfo *xf86misc_info = &_xf86misc_info_data;
18 static char *xf86misc_extension_name = XF86MISCNAME;
20 #define XF86MiscCheckExtension(dpy,i,val) \
21 XextCheckExtension (dpy, i, xf86misc_extension_name, val)
23 /*****************************************************************************
25 * private utility routines *
27 *****************************************************************************/
29 static int close_display(Display *dpy, XExtCodes *codes);
31 static /* const */ XExtensionHooks xf86misc_extension_hooks = {
36 NULL, /* create_font */
38 close_display, /* close_display */
39 NULL, /* wire_to_event */
40 NULL, /* event_to_wire */
42 NULL, /* error_string */
45 static XEXT_GENERATE_FIND_DISPLAY (find_display, xf86misc_info,
46 xf86misc_extension_name,
47 &xf86misc_extension_hooks,
50 static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xf86misc_info)
53 /*****************************************************************************
55 * public XFree86-Misc Extension routines *
57 *****************************************************************************/
59 Bool XF86MiscQueryExtension (Display *dpy, int *event_basep, int *error_basep)
61 XExtDisplayInfo *info = find_display (dpy);
63 if (XextHasExtension(info)) {
64 *event_basep = info->codes->first_event;
65 *error_basep = info->codes->first_error;
72 Bool XF86MiscQueryVersion(Display* dpy, int* majorVersion, int* minorVersion)
74 XExtDisplayInfo *info = find_display (dpy);
75 xXF86MiscQueryVersionReply rep;
76 xXF86MiscQueryVersionReq *req;
78 XF86MiscCheckExtension (dpy, info, False);
80 GetReq(XF86MiscQueryVersion, req);
81 req->reqType = info->codes->major_opcode;
82 req->xf86miscReqType = X_XF86MiscQueryVersion;
83 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
88 *majorVersion = rep.majorVersion;
89 *minorVersion = rep.minorVersion;
92 if (*majorVersion > 0 || *minorVersion > 5)
93 XF86MiscSetClientVersion(dpy);
99 XF86MiscSetClientVersion(Display *dpy)
101 XExtDisplayInfo *info = find_display(dpy);
102 xXF86MiscSetClientVersionReq *req;
104 XF86MiscCheckExtension(dpy, info, False);
107 GetReq(XF86MiscSetClientVersion, req);
108 req->reqType = info->codes->major_opcode;
109 req->xf86miscReqType = X_XF86MiscSetClientVersion;
110 req->major = XF86MISC_MAJOR_VERSION;
111 req->minor = XF86MISC_MINOR_VERSION;
117 Bool XF86MiscGetMouseSettings(Display* dpy, XF86MiscMouseSettings *mouseinfo)
119 XExtDisplayInfo *info = find_display (dpy);
120 xXF86MiscGetMouseSettingsReply rep;
121 xXF86MiscGetMouseSettingsReq *req;
123 XF86MiscCheckExtension (dpy, info, False);
126 GetReq(XF86MiscGetMouseSettings, req);
127 req->reqType = info->codes->major_opcode;
128 req->xf86miscReqType = X_XF86MiscGetMouseSettings;
129 if (!_XReply(dpy, (xReply *)&rep,
130 (SIZEOF(xXF86MiscGetMouseSettingsReply) - SIZEOF(xReply))>>2,
137 mouseinfo->type = rep.mousetype;
138 mouseinfo->baudrate = rep.baudrate;
139 mouseinfo->samplerate = rep.samplerate;
140 mouseinfo->resolution = rep.resolution;
141 mouseinfo->buttons = rep.buttons;
142 mouseinfo->emulate3buttons = rep.emulate3buttons;
143 mouseinfo->emulate3timeout = rep.emulate3timeout;
144 mouseinfo->chordmiddle = rep.chordmiddle;
145 mouseinfo->flags = rep.flags;
146 if (rep.devnamelen > 0) {
147 if (!(mouseinfo->device = Xcalloc(rep.devnamelen + 1, 1))) {
148 _XEatData(dpy, (rep.devnamelen+3) & ~3);
149 Xfree(mouseinfo->device);
152 _XReadPad(dpy, mouseinfo->device, rep.devnamelen);
154 mouseinfo->device = NULL;
161 Bool XF86MiscGetKbdSettings(Display* dpy, XF86MiscKbdSettings *kbdinfo)
163 XExtDisplayInfo *info = find_display (dpy);
164 xXF86MiscGetKbdSettingsReply rep;
165 xXF86MiscGetKbdSettingsReq *req;
167 XF86MiscCheckExtension (dpy, info, False);
170 GetReq(XF86MiscGetKbdSettings, req);
171 req->reqType = info->codes->major_opcode;
172 req->xf86miscReqType = X_XF86MiscGetKbdSettings;
173 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
179 kbdinfo->type = rep.kbdtype;
180 kbdinfo->rate = rep.rate;
181 kbdinfo->delay = rep.delay;
182 kbdinfo->servnumlock = rep.servnumlock;
189 Bool XF86MiscSetMouseSettings(Display* dpy, XF86MiscMouseSettings *mouseinfo)
191 XExtDisplayInfo *info = find_display (dpy);
192 xXF86MiscSetMouseSettingsReq *req;
193 int majorVersion, minorVersion;
195 XF86MiscCheckExtension (dpy, info, False);
196 XF86MiscQueryVersion(dpy, &majorVersion, &minorVersion);
199 GetReq(XF86MiscSetMouseSettings, req);
201 req->reqType = info->codes->major_opcode;
202 req->xf86miscReqType = X_XF86MiscSetMouseSettings;
203 req->mousetype = mouseinfo->type;
204 req->baudrate = mouseinfo->baudrate;
205 req->samplerate = mouseinfo->samplerate;
206 req->resolution = mouseinfo->resolution;
207 req->buttons = mouseinfo->buttons;
208 req->emulate3buttons = mouseinfo->emulate3buttons;
209 req->emulate3timeout = mouseinfo->emulate3timeout;
210 req->chordmiddle = mouseinfo->chordmiddle;
211 req->flags = mouseinfo->flags;
212 if (majorVersion > 0 || minorVersion > 5) {
214 if ((len = strlen(mouseinfo->device))) {
215 req->devnamelen = len + 1;
216 len = (req->devnamelen + 3) >> 2;
217 SetReqLen(req,len,len);
218 Data(dpy, mouseinfo->device, req->devnamelen);
227 Bool XF86MiscSetKbdSettings(Display* dpy, XF86MiscKbdSettings *kbdinfo)
229 XExtDisplayInfo *info = find_display (dpy);
230 xXF86MiscSetKbdSettingsReq *req;
232 XF86MiscCheckExtension (dpy, info, False);
235 GetReq(XF86MiscSetKbdSettings, req);
236 req->reqType = info->codes->major_opcode;
237 req->xf86miscReqType = X_XF86MiscSetKbdSettings;
238 req->kbdtype = kbdinfo->type;
239 req->rate = kbdinfo->rate;
240 req->delay = kbdinfo->delay;
241 req->servnumlock = kbdinfo->servnumlock;
248 int XF86MiscSetGrabKeysState(Display* dpy, Bool enable)
250 XExtDisplayInfo *info = find_display (dpy);
251 xXF86MiscSetGrabKeysStateReply rep;
252 xXF86MiscSetGrabKeysStateReq *req;
254 XF86MiscCheckExtension (dpy, info, False);
257 GetReq(XF86MiscSetGrabKeysState, req);
258 req->reqType = info->codes->major_opcode;
259 req->xf86miscReqType = X_XF86MiscSetGrabKeysState;
260 req->enable = enable;
261 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
272 Bool XF86MiscGetFilePaths(Display* dpy, XF86MiscFilePaths *filpaths)
274 XExtDisplayInfo *info = find_display (dpy);
275 xXF86MiscGetFilePathsReply rep;
276 xXF86MiscGetFilePathsReq *req;
278 XF86MiscCheckExtension (dpy, info, False);
281 GetReq(XF86MiscGetFilePaths, req);
282 req->reqType = info->codes->major_opcode;
283 req->xf86miscReqType = X_XF86MiscGetFilePaths;
284 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
291 if (!(filpaths->configfile = Xcalloc(rep.configlen + 1, 1))) {
292 _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
293 + ((rep.loglen+3) & ~3));
299 if (!(filpaths->modulepath = Xcalloc(rep.modulelen + 1, 1))) {
300 _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
301 + ((rep.loglen+3) & ~3));
302 if (filpaths->configfile)
303 Xfree(filpaths->configfile);
309 if (!(filpaths->logfile = Xcalloc(rep.loglen + 1, 1))) {
310 _XEatData(dpy, ((rep.configlen+3) & ~3) + ((rep.modulelen+3) & ~3)
311 + ((rep.loglen+3) & ~3));
312 if (filpaths->configfile)
313 Xfree(filpaths->configfile);
314 if (filpaths->modulepath)
315 Xfree(filpaths->modulepath);
321 _XReadPad(dpy, filpaths->configfile, rep.configlen);
323 filpaths->configfile = "";
326 _XReadPad(dpy, filpaths->modulepath, rep.modulelen);
328 filpaths->modulepath = "";
331 _XReadPad(dpy, filpaths->logfile, rep.loglen);
333 filpaths->logfile = "";
340 Status XF86MiscPassMessage(Display* dpy, int screen,
341 const char* msgtype, const char* msgval,
344 XExtDisplayInfo *info = find_display (dpy);
345 xXF86MiscPassMessageReply rep;
346 xXF86MiscPassMessageReq *req;
349 XF86MiscCheckExtension (dpy, info, False);
352 GetReq(XF86MiscPassMessage, req);
353 req->reqType = info->codes->major_opcode;
354 req->xf86miscReqType = X_XF86MiscPassMessage;
355 req->screen = screen;
356 if ((len = strlen(msgtype))) {
357 req->typelen = len + 1;
358 len = (req->typelen + 3) >> 2;
359 SetReqLen(req,len,len);
360 Data(dpy, msgtype, req->typelen);
362 if ((len = strlen(msgval))) {
363 req->vallen = len + 1;
364 len = (req->vallen + 3) >> 2;
365 SetReqLen(req,len,len);
366 Data(dpy, msgval, req->vallen);
368 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
371 return BadImplementation;
375 if (!(*retmsg = Xcalloc(rep.mesglen + 1, 1))) {
376 _XEatData(dpy, ((rep.mesglen+3) & ~3));
379 _XReadPad(dpy, *retmsg, rep.mesglen);