Index: third_party/libXNVCtrl/NVCtrl.c |
=================================================================== |
--- third_party/libXNVCtrl/NVCtrl.c (revision 0) |
+++ third_party/libXNVCtrl/NVCtrl.c (revision 0) |
@@ -0,0 +1,1240 @@ |
+/* |
+ * Copyright (c) 2008 NVIDIA, Corporation |
+ * |
+ * Permission is hereby granted, free of charge, to any person obtaining a copy |
+ * of this software and associated documentation files (the "Software"), to deal |
+ * in the Software without restriction, including without limitation the rights |
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
+ * copies of the Software, and to permit persons to whom the Software is |
+ * furnished to do so, subject to the following conditions: |
+ * |
+ * The above copyright notice and this permission notice (including the next |
+ * paragraph) shall be included in all copies or substantial portions of the |
+ * Software. |
+ * |
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
+ * SOFTWARE. |
+ */ |
+ |
+/* |
+ * Make sure that XTHREADS is defined, so that the |
+ * LockDisplay/UnlockDisplay macros are expanded properly and the |
+ * libXNVCtrl library properly protects the Display connection. |
+ */ |
+ |
+#if !defined(XTHREADS) |
+#define XTHREADS |
+#endif /* XTHREADS */ |
+ |
+#define NEED_EVENTS |
+#define NEED_REPLIES |
+#include <stdint.h> |
+#include <stdlib.h> |
+#include <X11/Xlibint.h> |
+#include <X11/Xutil.h> |
+#include <X11/extensions/Xext.h> |
+#include <X11/extensions/extutil.h> |
+#include "NVCtrlLib.h" |
+#include "nv_control.h" |
+ |
+#define NVCTRL_EXT_EXISTS 1 |
+#define NVCTRL_EXT_NEED_TARGET_SWAP 2 |
+#define NVCTRL_EXT_64_BIT_ATTRIBUTES 4 |
+#define NVCTRL_EXT_NEED_CHECK (1 << (sizeof(XPointer) - 1)) |
+ |
+static XExtensionInfo _nvctrl_ext_info_data; |
+static XExtensionInfo *nvctrl_ext_info = &_nvctrl_ext_info_data; |
+static /* const */ char *nvctrl_extension_name = NV_CONTROL_NAME; |
+ |
+#define XNVCTRLCheckExtension(dpy,i,val) \ |
+ XextCheckExtension (dpy, i, nvctrl_extension_name, val) |
+#define XNVCTRLSimpleCheckExtension(dpy,i) \ |
+ XextSimpleCheckExtension (dpy, i, nvctrl_extension_name) |
+ |
+static int close_display(); |
+static uintptr_t version_flags(Display *dpy, XExtDisplayInfo *info); |
+static Bool wire_to_event(); |
+static /* const */ XExtensionHooks nvctrl_extension_hooks = { |
+ NULL, /* create_gc */ |
+ NULL, /* copy_gc */ |
+ NULL, /* flush_gc */ |
+ NULL, /* free_gc */ |
+ NULL, /* create_font */ |
+ NULL, /* free_font */ |
+ close_display, /* close_display */ |
+ wire_to_event, /* wire_to_event */ |
+ NULL, /* event_to_wire */ |
+ NULL, /* error */ |
+ NULL, /* error_string */ |
+}; |
+ |
+static XEXT_GENERATE_FIND_DISPLAY (find_display, nvctrl_ext_info, |
+ nvctrl_extension_name, |
+ &nvctrl_extension_hooks, |
+ NV_CONTROL_EVENTS, |
+ (XPointer)NVCTRL_EXT_NEED_CHECK) |
+ |
+static XEXT_GENERATE_CLOSE_DISPLAY (close_display, nvctrl_ext_info) |
+ |
+/* |
+ * NV-CONTROL versions 1.8 and 1.9 pack the target_type and target_id |
+ * fields in reversed order. In order to talk to one of these servers, |
+ * we need to swap these fields. |
+ */ |
+ |
+static void XNVCTRLCheckTargetData(Display *dpy, XExtDisplayInfo *info, |
+ int *target_type, int *target_id) |
+{ |
+ uintptr_t flags = version_flags(dpy, info); |
+ |
+ /* We need to swap the target_type and target_id */ |
+ if (flags & NVCTRL_EXT_NEED_TARGET_SWAP) { |
+ int tmp; |
+ tmp = *target_type; |
+ *target_type = *target_id; |
+ *target_id = tmp; |
+ } |
+} |
+ |
+ |
+Bool XNVCTRLQueryExtension ( |
+ Display *dpy, |
+ int *event_basep, |
+ int *error_basep |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ |
+ if (XextHasExtension(info)) { |
+ if (event_basep) *event_basep = info->codes->first_event; |
+ if (error_basep) *error_basep = info->codes->first_error; |
+ return True; |
+ } else { |
+ return False; |
+ } |
+} |
+ |
+/* |
+ * Retrieve any cached flags that depend on the version of the NV-CONTROL |
+ * extension. |
+ */ |
+ |
+static uintptr_t version_flags(Display *dpy, XExtDisplayInfo *info) |
+{ |
+ uintptr_t data = (uintptr_t)info->data; |
+ |
+ /* If necessary, determine the NV-CONTROL version */ |
+ if (data & NVCTRL_EXT_NEED_CHECK) { |
+ int major, minor; |
+ data = 0; |
+ if (XNVCTRLQueryVersion(dpy, &major, &minor)) { |
+ data |= NVCTRL_EXT_EXISTS; |
+ if (major == 1 && (minor == 8 || minor == 9)) { |
+ data |= NVCTRL_EXT_NEED_TARGET_SWAP; |
+ } |
+ if ((major > 1) || ((major == 1) && (minor > 20))) { |
+ data |= NVCTRL_EXT_64_BIT_ATTRIBUTES; |
+ } |
+ } |
+ |
+ info->data = (XPointer)data; |
+ } |
+ |
+ return data; |
+} |
+ |
+Bool XNVCTRLQueryVersion ( |
+ Display *dpy, |
+ int *major, |
+ int *minor |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryExtensionReply rep; |
+ xnvCtrlQueryExtensionReq *req; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryExtension, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryExtension; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ if (major) *major = rep.major; |
+ if (minor) *minor = rep.minor; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return True; |
+} |
+ |
+ |
+Bool XNVCTRLIsNvScreen ( |
+ Display *dpy, |
+ int screen |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlIsNvReply rep; |
+ xnvCtrlIsNvReq *req; |
+ Bool isnv; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlIsNv, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlIsNv; |
+ req->screen = screen; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ isnv = rep.isnv; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return isnv; |
+} |
+ |
+ |
+Bool XNVCTRLQueryTargetCount ( |
+ Display *dpy, |
+ int target_type, |
+ int *value |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryTargetCountReply rep; |
+ xnvCtrlQueryTargetCountReq *req; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryTargetCount, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryTargetCount; |
+ req->target_type = target_type; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ if (value) *value = rep.count; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return True; |
+} |
+ |
+ |
+void XNVCTRLSetTargetAttribute ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ int value |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlSetAttributeReq *req; |
+ |
+ XNVCTRLSimpleCheckExtension (dpy, info); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlSetAttribute, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlSetAttribute; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ req->value = value; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+} |
+ |
+void XNVCTRLSetAttribute ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ int value |
+){ |
+ XNVCTRLSetTargetAttribute (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, |
+ display_mask, attribute, value); |
+} |
+ |
+ |
+Bool XNVCTRLSetTargetAttributeAndGetStatus ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ int value |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlSetAttributeAndGetStatusReq *req; |
+ xnvCtrlSetAttributeAndGetStatusReply rep; |
+ Bool success; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlSetAttributeAndGetStatus, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlSetAttributeAndGetStatus; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ req->value = value; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ |
+ success = rep.flags; |
+ return success; |
+} |
+ |
+Bool XNVCTRLSetAttributeAndGetStatus ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ int value |
+){ |
+ return XNVCTRLSetTargetAttributeAndGetStatus(dpy, |
+ NV_CTRL_TARGET_TYPE_X_SCREEN, |
+ screen, display_mask, |
+ attribute, value); |
+} |
+ |
+ |
+Bool XNVCTRLQueryTargetAttribute ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ int *value |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryAttributeReply rep; |
+ xnvCtrlQueryAttributeReq *req; |
+ Bool exists; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryAttribute, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryAttribute; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ exists = rep.flags; |
+ if (exists && value) *value = rep.value; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return exists; |
+} |
+ |
+Bool XNVCTRLQueryAttribute ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ int *value |
+){ |
+ return XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, |
+ screen, display_mask, attribute, value); |
+} |
+ |
+ |
+Bool XNVCTRLQueryTargetAttribute64 ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ int64_t *value |
+){ |
+ XExtDisplayInfo *info = find_display(dpy); |
+ xnvCtrlQueryAttribute64Reply rep; |
+ xnvCtrlQueryAttributeReq *req; |
+ Bool exists; |
+ |
+ if (!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension(dpy, info, False); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ LockDisplay(dpy); |
+ GetReq(nvCtrlQueryAttribute, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryAttribute64; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) { |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return False; |
+ } |
+ exists = rep.flags; |
+ if (exists && value) *value = rep.value_64; |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return exists; |
+} |
+ |
+ |
+Bool XNVCTRLQueryTargetStringAttribute ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ char **ptr |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryStringAttributeReply rep; |
+ xnvCtrlQueryStringAttributeReq *req; |
+ Bool exists; |
+ int length, numbytes, slop; |
+ |
+ if (!ptr) return False; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryStringAttribute, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryStringAttribute; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ length = rep.length; |
+ numbytes = rep.n; |
+ slop = numbytes & 3; |
+ exists = rep.flags; |
+ if (exists) { |
+ *ptr = (char *) Xmalloc(numbytes); |
+ } |
+ if (!exists || !*ptr) { |
+ _XEatData(dpy, length); |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } else { |
+ _XRead(dpy, (char *) *ptr, numbytes); |
+ if (slop) _XEatData(dpy, 4-slop); |
+ } |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return exists; |
+} |
+ |
+Bool XNVCTRLQueryStringAttribute ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ char **ptr |
+){ |
+ return XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, |
+ screen, display_mask, |
+ attribute, ptr); |
+} |
+ |
+ |
+Bool XNVCTRLSetTargetStringAttribute ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ char *ptr |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlSetStringAttributeReq *req; |
+ xnvCtrlSetStringAttributeReply rep; |
+ int size; |
+ Bool success; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ size = strlen(ptr)+1; |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlSetStringAttribute, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlSetStringAttribute; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ req->length += ((size + 3) & ~3) >> 2; |
+ req->num_bytes = size; |
+ Data(dpy, ptr, size); |
+ |
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ |
+ success = rep.flags; |
+ return success; |
+} |
+ |
+Bool XNVCTRLSetStringAttribute ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ char *ptr |
+){ |
+ return XNVCTRLSetTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, |
+ screen, display_mask, |
+ attribute, ptr); |
+} |
+ |
+ |
+static Bool XNVCTRLQueryValidTargetAttributeValues32 ( |
+ Display *dpy, |
+ XExtDisplayInfo *info, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ NVCTRLAttributeValidValuesRec *values |
+){ |
+ xnvCtrlQueryValidAttributeValuesReply rep; |
+ xnvCtrlQueryValidAttributeValuesReq *req; |
+ Bool exists; |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryValidAttributeValues, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryValidAttributeValues; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ exists = rep.flags; |
+ if (exists) { |
+ values->type = rep.attr_type; |
+ if (rep.attr_type == ATTRIBUTE_TYPE_RANGE) { |
+ values->u.range.min = rep.min; |
+ values->u.range.max = rep.max; |
+ } |
+ if (rep.attr_type == ATTRIBUTE_TYPE_INT_BITS) { |
+ values->u.bits.ints = rep.bits; |
+ } |
+ values->permissions = rep.perms; |
+ } |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return exists; |
+} |
+ |
+ |
+Bool XNVCTRLQueryValidTargetStringAttributeValues ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ NVCTRLAttributeValidValuesRec *values |
+){ |
+ XExtDisplayInfo *info = find_display(dpy); |
+ Bool exists; |
+ xnvCtrlQueryValidAttributeValuesReply rep; |
+ xnvCtrlQueryValidAttributeValuesReq *req; |
+ |
+ if (!values) return False; |
+ |
+ if (!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension(dpy, info, False); |
+ |
+ LockDisplay(dpy); |
+ GetReq (nvCtrlQueryValidAttributeValues, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryValidStringAttributeValues; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) { |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return False; |
+ } |
+ exists = rep.flags; |
+ if (exists) { |
+ values->type = rep.attr_type; |
+ values->permissions = rep.perms; |
+ } |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return exists; |
+} |
+ |
+ |
+static Bool XNVCTRLQueryValidTargetAttributeValues64 ( |
+ Display *dpy, |
+ XExtDisplayInfo *info, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ NVCTRLAttributeValidValuesRec *values |
+){ |
+ xnvCtrlQueryValidAttributeValues64Reply rep; |
+ xnvCtrlQueryValidAttributeValuesReq *req; |
+ Bool exists; |
+ |
+ LockDisplay(dpy); |
+ GetReq(nvCtrlQueryValidAttributeValues, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryValidAttributeValues64; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply(dpy, (xReply *)&rep, |
+ sz_xnvCtrlQueryValidAttributeValues64Reply_extra, |
+ xTrue)) { |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return False; |
+ } |
+ exists = rep.flags; |
+ if (exists) { |
+ values->type = rep.attr_type; |
+ if (rep.attr_type == ATTRIBUTE_TYPE_RANGE) { |
+ values->u.range.min = rep.min_64; |
+ values->u.range.max = rep.max_64; |
+ } |
+ if (rep.attr_type == ATTRIBUTE_TYPE_INT_BITS) { |
+ values->u.bits.ints = rep.bits_64; |
+ } |
+ values->permissions = rep.perms; |
+ } |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return exists; |
+} |
+ |
+Bool XNVCTRLQueryValidTargetAttributeValues ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ NVCTRLAttributeValidValuesRec *values |
+){ |
+ XExtDisplayInfo *info = find_display(dpy); |
+ Bool exists; |
+ uintptr_t flags; |
+ |
+ if (!values) return False; |
+ |
+ if (!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension(dpy, info, False); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ flags = version_flags(dpy,info); |
+ |
+ if (!(flags & NVCTRL_EXT_EXISTS)) |
+ return False; |
+ |
+ if (flags & NVCTRL_EXT_64_BIT_ATTRIBUTES) { |
+ exists = XNVCTRLQueryValidTargetAttributeValues64(dpy, info, |
+ target_type, |
+ target_id, |
+ display_mask, |
+ attribute, |
+ values); |
+ } else { |
+ exists = XNVCTRLQueryValidTargetAttributeValues32(dpy, info, |
+ target_type, |
+ target_id, |
+ display_mask, |
+ attribute, |
+ values); |
+ } |
+ return exists; |
+} |
+ |
+ |
+Bool XNVCTRLQueryValidAttributeValues ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ NVCTRLAttributeValidValuesRec *values |
+){ |
+ return XNVCTRLQueryValidTargetAttributeValues(dpy, |
+ NV_CTRL_TARGET_TYPE_X_SCREEN, |
+ screen, display_mask, |
+ attribute, values); |
+} |
+ |
+ |
+static Bool QueryAttributePermissionsInternal ( |
+ Display *dpy, |
+ unsigned int attribute, |
+ NVCTRLAttributePermissionsRec *permissions, |
+ unsigned int reqType |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryAttributePermissionsReply rep; |
+ xnvCtrlQueryAttributePermissionsReq *req; |
+ Bool exists; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay(dpy); |
+ GetReq(nvCtrlQueryAttributePermissions, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = reqType; |
+ req->attribute = attribute; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle(); |
+ return False; |
+ } |
+ exists = rep.flags; |
+ if (exists && permissions) { |
+ permissions->type = rep.attr_type; |
+ permissions->permissions = rep.perms; |
+ } |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return exists; |
+} |
+ |
+ |
+Bool XNVCTRLQueryAttributePermissions ( |
+ Display *dpy, |
+ unsigned int attribute, |
+ NVCTRLAttributePermissionsRec *permissions |
+){ |
+ return QueryAttributePermissionsInternal(dpy, |
+ attribute, |
+ permissions, |
+ X_nvCtrlQueryAttributePermissions); |
+} |
+ |
+ |
+Bool XNVCTRLQueryStringAttributePermissions ( |
+ Display *dpy, |
+ unsigned int attribute, |
+ NVCTRLAttributePermissionsRec *permissions |
+){ |
+ return QueryAttributePermissionsInternal(dpy, |
+ attribute, |
+ permissions, |
+ X_nvCtrlQueryStringAttributePermissions); |
+} |
+ |
+ |
+Bool XNVCTRLQueryBinaryDataAttributePermissions ( |
+ Display *dpy, |
+ unsigned int attribute, |
+ NVCTRLAttributePermissionsRec *permissions |
+){ |
+ return QueryAttributePermissionsInternal(dpy, |
+ attribute, |
+ permissions, |
+ X_nvCtrlQueryBinaryDataAttributePermissions); |
+} |
+ |
+ |
+Bool XNVCTRLQueryStringOperationAttributePermissions ( |
+ Display *dpy, |
+ unsigned int attribute, |
+ NVCTRLAttributePermissionsRec *permissions |
+){ |
+ return QueryAttributePermissionsInternal(dpy, |
+ attribute, |
+ permissions, |
+ X_nvCtrlQueryStringOperationAttributePermissions); |
+} |
+ |
+ |
+void XNVCTRLSetGvoColorConversion ( |
+ Display *dpy, |
+ int screen, |
+ float colorMatrix[3][3], |
+ float colorOffset[3], |
+ float colorScale[3] |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlSetGvoColorConversionReq *req; |
+ |
+ XNVCTRLSimpleCheckExtension (dpy, info); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlSetGvoColorConversion, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlSetGvoColorConversion; |
+ req->screen = screen; |
+ |
+ req->cscMatrix_y_r = colorMatrix[0][0]; |
+ req->cscMatrix_y_g = colorMatrix[0][1]; |
+ req->cscMatrix_y_b = colorMatrix[0][2]; |
+ |
+ req->cscMatrix_cr_r = colorMatrix[1][0]; |
+ req->cscMatrix_cr_g = colorMatrix[1][1]; |
+ req->cscMatrix_cr_b = colorMatrix[1][2]; |
+ |
+ req->cscMatrix_cb_r = colorMatrix[2][0]; |
+ req->cscMatrix_cb_g = colorMatrix[2][1]; |
+ req->cscMatrix_cb_b = colorMatrix[2][2]; |
+ |
+ req->cscOffset_y = colorOffset[0]; |
+ req->cscOffset_cr = colorOffset[1]; |
+ req->cscOffset_cb = colorOffset[2]; |
+ |
+ req->cscScale_y = colorScale[0]; |
+ req->cscScale_cr = colorScale[1]; |
+ req->cscScale_cb = colorScale[2]; |
+ |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+} |
+ |
+ |
+Bool XNVCTRLQueryGvoColorConversion ( |
+ Display *dpy, |
+ int screen, |
+ float colorMatrix[3][3], |
+ float colorOffset[3], |
+ float colorScale[3] |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryGvoColorConversionReply rep; |
+ xnvCtrlQueryGvoColorConversionReq *req; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ |
+ GetReq (nvCtrlQueryGvoColorConversion, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryGvoColorConversion; |
+ req->screen = screen; |
+ |
+ if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ |
+ _XRead(dpy, (char *)(colorMatrix), 36); |
+ _XRead(dpy, (char *)(colorOffset), 12); |
+ _XRead(dpy, (char *)(colorScale), 12); |
+ |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ |
+ return True; |
+} |
+ |
+ |
+Bool XNVCtrlSelectTargetNotify ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ int notify_type, |
+ Bool onoff |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlSelectTargetNotifyReq *req; |
+ |
+ if(!XextHasExtension (info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlSelectTargetNotify, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlSelectTargetNotify; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->notifyType = notify_type; |
+ req->onoff = onoff; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ |
+ return True; |
+} |
+ |
+ |
+Bool XNVCtrlSelectNotify ( |
+ Display *dpy, |
+ int screen, |
+ int type, |
+ Bool onoff |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlSelectNotifyReq *req; |
+ |
+ if(!XextHasExtension (info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlSelectNotify, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlSelectNotify; |
+ req->screen = screen; |
+ req->notifyType = type; |
+ req->onoff = onoff; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ |
+ return True; |
+} |
+ |
+Bool XNVCTRLQueryTargetBinaryData ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ unsigned char **ptr, |
+ int *len |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryBinaryDataReply rep; |
+ xnvCtrlQueryBinaryDataReq *req; |
+ Bool exists; |
+ int length, numbytes, slop; |
+ |
+ if (!ptr) return False; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryBinaryData, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryBinaryData; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ length = rep.length; |
+ numbytes = rep.n; |
+ slop = numbytes & 3; |
+ exists = rep.flags; |
+ if (exists) { |
+ *ptr = (unsigned char *) Xmalloc(numbytes); |
+ } |
+ if (!exists || !*ptr) { |
+ _XEatData(dpy, length); |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } else { |
+ _XRead(dpy, (char *) *ptr, numbytes); |
+ if (slop) _XEatData(dpy, 4-slop); |
+ } |
+ if (len) *len = numbytes; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return exists; |
+} |
+ |
+Bool XNVCTRLQueryBinaryData ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ unsigned char **ptr, |
+ int *len |
+){ |
+ return XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, |
+ screen, display_mask, |
+ attribute, ptr, len); |
+} |
+ |
+Bool XNVCTRLStringOperation ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ char *pIn, |
+ char **ppOut |
+) { |
+ XExtDisplayInfo *info = find_display(dpy); |
+ xnvCtrlStringOperationReq *req; |
+ xnvCtrlStringOperationReply rep; |
+ Bool ret; |
+ int inSize, outSize, length, slop; |
+ |
+ if (!XextHasExtension(info)) |
+ return False; |
+ |
+ if (!ppOut) |
+ return False; |
+ |
+ *ppOut = NULL; |
+ |
+ XNVCTRLCheckExtension(dpy, info, False); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ if (pIn) { |
+ inSize = strlen(pIn) + 1; |
+ } else { |
+ inSize = 0; |
+ } |
+ |
+ LockDisplay(dpy); |
+ GetReq(nvCtrlStringOperation, req); |
+ |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlStringOperation; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ |
+ req->length += ((inSize + 3) & ~3) >> 2; |
+ req->num_bytes = inSize; |
+ |
+ if (pIn) { |
+ Data(dpy, pIn, inSize); |
+ } |
+ |
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) { |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ return False; |
+ } |
+ |
+ length = rep.length; |
+ outSize = rep.num_bytes; |
+ slop = outSize & 3; |
+ |
+ if (outSize) *ppOut = (char *) Xmalloc(outSize); |
+ |
+ if (!*ppOut) { |
+ _XEatData(dpy, length); |
+ } else { |
+ _XRead(dpy, (char *) *ppOut, outSize); |
+ if (slop) _XEatData(dpy, 4-slop); |
+ } |
+ |
+ ret = rep.ret; |
+ |
+ UnlockDisplay(dpy); |
+ SyncHandle(); |
+ |
+ return ret; |
+} |
+ |
+ |
+static Bool wire_to_event (Display *dpy, XEvent *host, xEvent *wire) |
+{ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ XNVCtrlEvent *re; |
+ xnvctrlEvent *event; |
+ XNVCtrlEventTarget *reTarget; |
+ xnvctrlEventTarget *eventTarget; |
+ XNVCtrlEventTargetAvailability *reTargetAvailability; |
+ XNVCtrlStringEventTarget *reTargetString; |
+ XNVCtrlBinaryEventTarget *reTargetBinary; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ switch ((wire->u.u.type & 0x7F) - info->codes->first_event) { |
+ case ATTRIBUTE_CHANGED_EVENT: |
+ re = (XNVCtrlEvent *) host; |
+ event = (xnvctrlEvent *) wire; |
+ re->attribute_changed.type = event->u.u.type & 0x7F; |
+ re->attribute_changed.serial = |
+ _XSetLastRequestRead(dpy, (xGenericReply*) event); |
+ re->attribute_changed.send_event = ((event->u.u.type & 0x80) != 0); |
+ re->attribute_changed.display = dpy; |
+ re->attribute_changed.time = event->u.attribute_changed.time; |
+ re->attribute_changed.screen = event->u.attribute_changed.screen; |
+ re->attribute_changed.display_mask = |
+ event->u.attribute_changed.display_mask; |
+ re->attribute_changed.attribute = event->u.attribute_changed.attribute; |
+ re->attribute_changed.value = event->u.attribute_changed.value; |
+ break; |
+ case TARGET_ATTRIBUTE_CHANGED_EVENT: |
+ reTarget = (XNVCtrlEventTarget *) host; |
+ eventTarget = (xnvctrlEventTarget *) wire; |
+ reTarget->attribute_changed.type = eventTarget->u.u.type & 0x7F; |
+ reTarget->attribute_changed.serial = |
+ _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); |
+ reTarget->attribute_changed.send_event = |
+ ((eventTarget->u.u.type & 0x80) != 0); |
+ reTarget->attribute_changed.display = dpy; |
+ reTarget->attribute_changed.time = |
+ eventTarget->u.attribute_changed.time; |
+ reTarget->attribute_changed.target_type = |
+ eventTarget->u.attribute_changed.target_type; |
+ reTarget->attribute_changed.target_id = |
+ eventTarget->u.attribute_changed.target_id; |
+ reTarget->attribute_changed.display_mask = |
+ eventTarget->u.attribute_changed.display_mask; |
+ reTarget->attribute_changed.attribute = |
+ eventTarget->u.attribute_changed.attribute; |
+ reTarget->attribute_changed.value = |
+ eventTarget->u.attribute_changed.value; |
+ break; |
+ case TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT: |
+ reTargetAvailability = (XNVCtrlEventTargetAvailability *) host; |
+ eventTarget = (xnvctrlEventTarget *) wire; |
+ reTargetAvailability->attribute_changed.type = |
+ eventTarget->u.u.type & 0x7F; |
+ reTargetAvailability->attribute_changed.serial = |
+ _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); |
+ reTargetAvailability->attribute_changed.send_event = |
+ ((eventTarget->u.u.type & 0x80) != 0); |
+ reTargetAvailability->attribute_changed.display = dpy; |
+ reTargetAvailability->attribute_changed.time = |
+ eventTarget->u.availability_changed.time; |
+ reTargetAvailability->attribute_changed.target_type = |
+ eventTarget->u.availability_changed.target_type; |
+ reTargetAvailability->attribute_changed.target_id = |
+ eventTarget->u.availability_changed.target_id; |
+ reTargetAvailability->attribute_changed.display_mask = |
+ eventTarget->u.availability_changed.display_mask; |
+ reTargetAvailability->attribute_changed.attribute = |
+ eventTarget->u.availability_changed.attribute; |
+ reTargetAvailability->attribute_changed.availability = |
+ eventTarget->u.availability_changed.availability; |
+ reTargetAvailability->attribute_changed.value = |
+ eventTarget->u.availability_changed.value; |
+ break; |
+ case TARGET_STRING_ATTRIBUTE_CHANGED_EVENT: |
+ reTargetString = (XNVCtrlStringEventTarget *) host; |
+ eventTarget = (xnvctrlEventTarget *) wire; |
+ reTargetString->attribute_changed.type = eventTarget->u.u.type & 0x7F; |
+ reTargetString->attribute_changed.serial = |
+ _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); |
+ reTargetString->attribute_changed.send_event = |
+ ((eventTarget->u.u.type & 0x80) != 0); |
+ reTargetString->attribute_changed.display = dpy; |
+ reTargetString->attribute_changed.time = |
+ eventTarget->u.attribute_changed.time; |
+ reTargetString->attribute_changed.target_type = |
+ eventTarget->u.attribute_changed.target_type; |
+ reTargetString->attribute_changed.target_id = |
+ eventTarget->u.attribute_changed.target_id; |
+ reTargetString->attribute_changed.display_mask = |
+ eventTarget->u.attribute_changed.display_mask; |
+ reTargetString->attribute_changed.attribute = |
+ eventTarget->u.attribute_changed.attribute; |
+ break; |
+ case TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT: |
+ reTargetBinary = (XNVCtrlBinaryEventTarget *) host; |
+ eventTarget = (xnvctrlEventTarget *) wire; |
+ reTargetBinary->attribute_changed.type = eventTarget->u.u.type & 0x7F; |
+ reTargetBinary->attribute_changed.serial = |
+ _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); |
+ reTargetBinary->attribute_changed.send_event = |
+ ((eventTarget->u.u.type & 0x80) != 0); |
+ reTargetBinary->attribute_changed.display = dpy; |
+ reTargetBinary->attribute_changed.time = |
+ eventTarget->u.attribute_changed.time; |
+ reTargetBinary->attribute_changed.target_type = |
+ eventTarget->u.attribute_changed.target_type; |
+ reTargetBinary->attribute_changed.target_id = |
+ eventTarget->u.attribute_changed.target_id; |
+ reTargetBinary->attribute_changed.display_mask = |
+ eventTarget->u.attribute_changed.display_mask; |
+ reTargetBinary->attribute_changed.attribute = |
+ eventTarget->u.attribute_changed.attribute; |
+ break; |
+ |
+ default: |
+ return False; |
+ } |
+ |
+ return True; |
+} |
+ |
Property changes on: third_party/libXNVCtrl/NVCtrl.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |