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