3 #include <X11/Xlibint.h>
5 #include <X11/extensions/Xext.h>
8 #include "nv_control.h"
10 #if !defined(XTRHEADS)
11 #warning XTRHEADS not defined -- this libXNVCtrl.a will not be thread safe!
14 static XExtensionInfo _nvctrl_ext_info_data;
15 static XExtensionInfo *nvctrl_ext_info = &_nvctrl_ext_info_data;
16 static /* const */ char *nvctrl_extension_name = NV_CONTROL_NAME;
18 #define XNVCTRLCheckExtension(dpy,i,val) \
19 XextCheckExtension (dpy, i, nvctrl_extension_name, val)
20 #define XNVCTRLSimpleCheckExtension(dpy,i) \
21 XextSimpleCheckExtension (dpy, i, nvctrl_extension_name)
23 static int close_display();
24 static Bool wire_to_event();
25 static /* const */ XExtensionHooks nvctrl_extension_hooks = {
30 NULL, /* create_font */
32 close_display, /* close_display */
33 wire_to_event, /* wire_to_event */
34 NULL, /* event_to_wire */
36 NULL, /* error_string */
39 static XEXT_GENERATE_FIND_DISPLAY (find_display, nvctrl_ext_info,
40 nvctrl_extension_name,
41 &nvctrl_extension_hooks,
42 NV_CONTROL_EVENTS, NULL)
44 static XEXT_GENERATE_CLOSE_DISPLAY (close_display, nvctrl_ext_info)
46 Bool XNVCTRLQueryExtension (
51 XExtDisplayInfo *info = find_display (dpy);
53 if (XextHasExtension(info)) {
54 if (event_basep) *event_basep = info->codes->first_event;
55 if (error_basep) *error_basep = info->codes->first_error;
63 Bool XNVCTRLQueryVersion (
68 XExtDisplayInfo *info = find_display (dpy);
69 xnvCtrlQueryExtensionReply rep;
70 xnvCtrlQueryExtensionReq *req;
72 if(!XextHasExtension(info))
75 XNVCTRLCheckExtension (dpy, info, False);
78 GetReq (nvCtrlQueryExtension, req);
79 req->reqType = info->codes->major_opcode;
80 req->nvReqType = X_nvCtrlQueryExtension;
81 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
86 if (major) *major = rep.major;
87 if (minor) *minor = rep.minor;
94 Bool XNVCTRLIsNvScreen (
98 XExtDisplayInfo *info = find_display (dpy);
103 if(!XextHasExtension(info))
106 XNVCTRLCheckExtension (dpy, info, False);
109 GetReq (nvCtrlIsNv, req);
110 req->reqType = info->codes->major_opcode;
111 req->nvReqType = X_nvCtrlIsNv;
112 req->screen = screen;
113 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
125 void XNVCTRLSetAttribute (
128 unsigned int display_mask,
129 unsigned int attribute,
132 XExtDisplayInfo *info = find_display (dpy);
133 xnvCtrlSetAttributeReq *req;
135 XNVCTRLSimpleCheckExtension (dpy, info);
138 GetReq (nvCtrlSetAttribute, req);
139 req->reqType = info->codes->major_opcode;
140 req->nvReqType = X_nvCtrlSetAttribute;
141 req->screen = screen;
142 req->display_mask = display_mask;
143 req->attribute = attribute;
150 Bool XNVCTRLQueryAttribute (
153 unsigned int display_mask,
154 unsigned int attribute,
157 XExtDisplayInfo *info = find_display (dpy);
158 xnvCtrlQueryAttributeReply rep;
159 xnvCtrlQueryAttributeReq *req;
162 if(!XextHasExtension(info))
165 XNVCTRLCheckExtension (dpy, info, False);
168 GetReq (nvCtrlQueryAttribute, req);
169 req->reqType = info->codes->major_opcode;
170 req->nvReqType = X_nvCtrlQueryAttribute;
171 req->screen = screen;
172 req->display_mask = display_mask;
173 req->attribute = attribute;
174 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
179 if (value) *value = rep.value;
187 Bool XNVCTRLQueryStringAttribute (
190 unsigned int display_mask,
191 unsigned int attribute,
194 XExtDisplayInfo *info = find_display (dpy);
195 xnvCtrlQueryStringAttributeReply rep;
196 xnvCtrlQueryStringAttributeReq *req;
198 int length, numbytes, slop;
200 if (!ptr) return False;
202 if(!XextHasExtension(info))
205 XNVCTRLCheckExtension (dpy, info, False);
208 GetReq (nvCtrlQueryStringAttribute, req);
209 req->reqType = info->codes->major_opcode;
210 req->nvReqType = X_nvCtrlQueryStringAttribute;
211 req->screen = screen;
212 req->display_mask = display_mask;
213 req->attribute = attribute;
214 if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
222 *ptr = (char *) Xmalloc(numbytes);
224 _XEatData(dpy, length);
229 _XRead(dpy, (char *) *ptr, numbytes);
230 if (slop) _XEatData(dpy, 4-slop);
238 Bool XNVCTRLQueryValidAttributeValues (
241 unsigned int display_mask,
242 unsigned int attribute,
243 NVCTRLAttributeValidValuesRec *values
245 XExtDisplayInfo *info = find_display (dpy);
246 xnvCtrlQueryValidAttributeValuesReply rep;
247 xnvCtrlQueryValidAttributeValuesReq *req;
250 if (!values) return False;
252 if(!XextHasExtension(info))
255 XNVCTRLCheckExtension (dpy, info, False);
258 GetReq (nvCtrlQueryValidAttributeValues, req);
259 req->reqType = info->codes->major_opcode;
260 req->nvReqType = X_nvCtrlQueryValidAttributeValues;
261 req->screen = screen;
262 req->display_mask = display_mask;
263 req->attribute = attribute;
264 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
270 values->type = rep.attr_type;
271 if (rep.attr_type == ATTRIBUTE_TYPE_RANGE) {
272 values->u.range.min = rep.min;
273 values->u.range.max = rep.max;
275 if (rep.attr_type == ATTRIBUTE_TYPE_INT_BITS) {
276 values->u.bits.ints = rep.bits;
278 values->permissions = rep.perms;
284 Bool XNVCtrlSelectNotify (
290 XExtDisplayInfo *info = find_display (dpy);
291 xnvCtrlSelectNotifyReq *req;
293 if(!XextHasExtension (info))
296 XNVCTRLCheckExtension (dpy, info, False);
299 GetReq (nvCtrlSelectNotify, req);
300 req->reqType = info->codes->major_opcode;
301 req->nvReqType = X_nvCtrlSelectNotify;
302 req->screen = screen;
303 req->notifyType = type;
311 static Bool wire_to_event (Display *dpy, XEvent *host, xEvent *wire)
313 XExtDisplayInfo *info = find_display (dpy);
314 XNVCtrlEvent *re = (XNVCtrlEvent *) host;
315 xnvctrlEvent *event = (xnvctrlEvent *) wire;
317 XNVCTRLCheckExtension (dpy, info, False);
319 switch ((event->u.u.type & 0x7F) - info->codes->first_event) {
320 case ATTRIBUTE_CHANGED_EVENT:
321 re->attribute_changed.type = event->u.u.type & 0x7F;
322 re->attribute_changed.serial =
323 _XSetLastRequestRead(dpy, (xGenericReply*) event);
324 re->attribute_changed.send_event = ((event->u.u.type & 0x80) != 0);
325 re->attribute_changed.display = dpy;
326 re->attribute_changed.time = event->u.attribute_changed.time;
327 re->attribute_changed.screen = event->u.attribute_changed.screen;
328 re->attribute_changed.display_mask =
329 event->u.attribute_changed.display_mask;
330 re->attribute_changed.attribute = event->u.attribute_changed.attribute;
331 re->attribute_changed.value = event->u.attribute_changed.value;