/* * 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 #include #include #include #include #include #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; }