15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2008 NVIDIA, Corporation
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a copy
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of this software and associated documentation files (the "Software"), to deal
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the Software without restriction, including without limitation the rights
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copies of the Software, and to permit persons to whom the Software is
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * furnished to do so, subject to the following conditions:
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice (including the next
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * paragraph) shall be included in all copies or substantial portions of the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Software.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOFTWARE.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make sure that XTHREADS is defined, so that the
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LockDisplay/UnlockDisplay macros are expanded properly and the
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * libXNVCtrl library properly protects the Display connection.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(XTHREADS)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XTHREADS
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* XTHREADS */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NEED_EVENTS
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NEED_REPLIES
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlibint.h>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xutil.h>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/extensions/Xext.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/extensions/extutil.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "NVCtrlLib.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nv_control.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NVCTRL_EXT_EXISTS              1
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NVCTRL_EXT_NEED_TARGET_SWAP    2
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NVCTRL_EXT_64_BIT_ATTRIBUTES   4
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NVCTRL_EXT_NEED_CHECK          (1 << (sizeof(XPointer) - 1))
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static XExtensionInfo _nvctrl_ext_info_data;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static XExtensionInfo *nvctrl_ext_info = &_nvctrl_ext_info_data;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static /* const */ char *nvctrl_extension_name = NV_CONTROL_NAME;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XNVCTRLCheckExtension(dpy,i,val) \
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XextCheckExtension (dpy, i, nvctrl_extension_name, val)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XNVCTRLSimpleCheckExtension(dpy,i) \
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XextSimpleCheckExtension (dpy, i, nvctrl_extension_name)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int close_display();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static uintptr_t version_flags(Display *dpy, XExtDisplayInfo *info);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Bool wire_to_event();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static /* const */ XExtensionHooks nvctrl_extension_hooks = {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* create_gc */
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* copy_gc */
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* flush_gc */
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* free_gc */
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* create_font */
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* free_font */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_display,                      /* close_display */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wire_to_event,                      /* wire_to_event */
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* event_to_wire */
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* error */
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,                               /* error_string */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static XEXT_GENERATE_FIND_DISPLAY (find_display, nvctrl_ext_info,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   nvctrl_extension_name,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &nvctrl_extension_hooks,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   NV_CONTROL_EVENTS,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (XPointer)NVCTRL_EXT_NEED_CHECK)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static XEXT_GENERATE_CLOSE_DISPLAY (close_display, nvctrl_ext_info)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NV-CONTROL versions 1.8 and 1.9 pack the target_type and target_id
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fields in reversed order.  In order to talk to one of these servers,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we need to swap these fields.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XNVCTRLCheckTargetData(Display *dpy, XExtDisplayInfo *info,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int *target_type, int *target_id)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uintptr_t flags = version_flags(dpy, info);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* We need to swap the target_type and target_id */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (flags & NVCTRL_EXT_NEED_TARGET_SWAP) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int tmp;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tmp = *target_type;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *target_type = *target_id;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *target_id = tmp;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryExtension (
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *event_basep,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *error_basep
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (XextHasExtension(info)) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (event_basep) *event_basep = info->codes->first_event;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (error_basep) *error_basep = info->codes->first_error;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return True;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Retrieve any cached flags that depend on the version of the NV-CONTROL
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extension.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static uintptr_t version_flags(Display *dpy, XExtDisplayInfo *info)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uintptr_t data = (uintptr_t)info->data;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If necessary, determine the NV-CONTROL version */
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data & NVCTRL_EXT_NEED_CHECK) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int major, minor;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (XNVCTRLQueryVersion(dpy, &major, &minor)) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            data |= NVCTRL_EXT_EXISTS;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (major == 1 && (minor == 8 || minor == 9)) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                data |= NVCTRL_EXT_NEED_TARGET_SWAP;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((major > 1) || ((major == 1) && (minor > 20))) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                data |= NVCTRL_EXT_64_BIT_ATTRIBUTES;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        info->data = (XPointer)data;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryVersion (
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *major,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *minor
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryExtensionReply rep;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryExtensionReq   *req;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryExtension, req);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryExtension;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (major) *major = rep.major;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (minor) *minor = rep.minor;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLIsNvScreen (
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlIsNvReply rep;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlIsNvReq   *req;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool isnv;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlIsNv, req);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlIsNv;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->screen = screen;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isnv = rep.isnv;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return isnv;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryTargetCount (
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *value
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryTargetCountReply  rep;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryTargetCountReq   *req;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryTargetCount, req);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryTargetCount;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value) *value = rep.count;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XNVCTRLSetTargetAttribute (
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSetAttributeReq *req;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLSimpleCheckExtension (dpy, info);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlSetAttribute, req);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlSetAttribute;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->value = value;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XNVCTRLSetAttribute (
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLSetTargetAttribute (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               display_mask, attribute, value);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLSetTargetAttributeAndGetStatus (
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSetAttributeAndGetStatusReq *req;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSetAttributeAndGetStatusReply rep;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool success;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlSetAttributeAndGetStatus, req);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlSetAttributeAndGetStatus;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->value = value;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = rep.flags;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return success;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLSetAttributeAndGetStatus (
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return XNVCTRLSetTargetAttributeAndGetStatus(dpy,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 NV_CTRL_TARGET_TYPE_X_SCREEN,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 screen, display_mask,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 attribute, value);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryTargetAttribute (
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *value
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryAttributeReply rep;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryAttributeReq   *req;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryAttribute, req);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryAttribute;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists && value) *value = rep.value;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryAttribute (
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *value
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       screen, display_mask, attribute, value);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryTargetAttribute64 (
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64_t *value
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display(dpy);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryAttribute64Reply rep;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryAttributeReq *req;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!XextHasExtension(info))
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension(dpy, info, False);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay(dpy);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq(nvCtrlQueryAttribute, req);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryAttribute64;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay(dpy);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists && value) *value = rep.value_64;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay(dpy);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryTargetStringAttribute (
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char **ptr
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryStringAttributeReply rep;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryStringAttributeReq   *req;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int length, numbytes, slop;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ptr) return False;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryStringAttribute, req);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryStringAttribute;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    length = rep.length;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    numbytes = rep.n;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    slop = numbytes & 3;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *ptr = (char *) Xmalloc(numbytes);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!exists || !*ptr) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _XEatData(dpy, length);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _XRead(dpy, (char *) *ptr, numbytes);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (slop) _XEatData(dpy, 4-slop);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryStringAttribute (
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char **ptr
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             screen, display_mask,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             attribute, ptr);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLSetTargetStringAttribute (
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *ptr
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSetStringAttributeReq *req;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSetStringAttributeReply rep;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool success;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size = strlen(ptr)+1;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlSetStringAttribute, req);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlSetStringAttribute;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->length += ((size + 3) & ~3) >> 2;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->num_bytes = size;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Data(dpy, ptr, size);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = rep.flags;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return success;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLSetStringAttribute (
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *ptr
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return XNVCTRLSetTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           screen, display_mask,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           attribute, ptr);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Bool XNVCTRLQueryValidTargetAttributeValues32 (
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributeValidValuesRec *values
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryValidAttributeValuesReply rep;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryValidAttributeValuesReq   *req;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryValidAttributeValues, req);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryValidAttributeValues;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        values->type = rep.attr_type;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (rep.attr_type == ATTRIBUTE_TYPE_RANGE) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            values->u.range.min = rep.min;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            values->u.range.max = rep.max;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (rep.attr_type == ATTRIBUTE_TYPE_INT_BITS) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            values->u.bits.ints = rep.bits;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        values->permissions = rep.perms;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryValidTargetStringAttributeValues (
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributeValidValuesRec *values
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display(dpy);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryValidAttributeValuesReply rep;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryValidAttributeValuesReq   *req;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!values) return False;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!XextHasExtension(info))
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension(dpy, info, False);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay(dpy);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryValidAttributeValues, req);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryValidStringAttributeValues;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay(dpy);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        values->type = rep.attr_type;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        values->permissions = rep.perms;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay(dpy);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Bool XNVCTRLQueryValidTargetAttributeValues64 (
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributeValidValuesRec *values
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryValidAttributeValues64Reply rep;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryValidAttributeValuesReq *req;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay(dpy);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq(nvCtrlQueryValidAttributeValues, req);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryValidAttributeValues64;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply(dpy, (xReply *)&rep,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 sz_xnvCtrlQueryValidAttributeValues64Reply_extra,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 xTrue)) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay(dpy);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        values->type = rep.attr_type;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (rep.attr_type == ATTRIBUTE_TYPE_RANGE) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            values->u.range.min = rep.min_64;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            values->u.range.max = rep.max_64;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (rep.attr_type == ATTRIBUTE_TYPE_INT_BITS) {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            values->u.bits.ints = rep.bits_64;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        values->permissions = rep.perms;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay(dpy);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryValidTargetAttributeValues (
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributeValidValuesRec *values
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display(dpy);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uintptr_t flags;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!values) return False;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!XextHasExtension(info))
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension(dpy, info, False);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags = version_flags(dpy,info);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(flags & NVCTRL_EXT_EXISTS))
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (flags & NVCTRL_EXT_64_BIT_ATTRIBUTES) {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        exists = XNVCTRLQueryValidTargetAttributeValues64(dpy, info,
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          target_type,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          target_id,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          display_mask,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          attribute,
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          values);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        exists = XNVCTRLQueryValidTargetAttributeValues32(dpy, info,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          target_type,
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          target_id,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          display_mask,
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          attribute,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          values);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryValidAttributeValues (
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributeValidValuesRec *values
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return XNVCTRLQueryValidTargetAttributeValues(dpy,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  NV_CTRL_TARGET_TYPE_X_SCREEN,
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  screen, display_mask,
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  attribute, values);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Bool QueryAttributePermissionsInternal (
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributePermissionsRec *permissions,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int reqType
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryAttributePermissionsReply rep;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryAttributePermissionsReq *req;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay(dpy);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq(nvCtrlQueryAttributePermissions, req);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = reqType;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists && permissions) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        permissions->type = rep.attr_type;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        permissions->permissions = rep.perms;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay(dpy);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle();
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryAttributePermissions (
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributePermissionsRec *permissions
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return QueryAttributePermissionsInternal(dpy,
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             attribute,
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             permissions,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             X_nvCtrlQueryAttributePermissions);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryStringAttributePermissions (
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributePermissionsRec *permissions
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return QueryAttributePermissionsInternal(dpy,
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             attribute,
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             permissions,
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             X_nvCtrlQueryStringAttributePermissions);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryBinaryDataAttributePermissions (
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributePermissionsRec *permissions
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return QueryAttributePermissionsInternal(dpy,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             attribute,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             permissions,
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             X_nvCtrlQueryBinaryDataAttributePermissions);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryStringOperationAttributePermissions (
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NVCTRLAttributePermissionsRec *permissions
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return QueryAttributePermissionsInternal(dpy,
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             attribute,
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             permissions,
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             X_nvCtrlQueryStringOperationAttributePermissions);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XNVCTRLSetGvoColorConversion (
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float colorMatrix[3][3],
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float colorOffset[3],
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float colorScale[3]
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSetGvoColorConversionReq *req;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLSimpleCheckExtension (dpy, info);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlSetGvoColorConversion, req);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlSetGvoColorConversion;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->screen = screen;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_y_r = colorMatrix[0][0];
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_y_g = colorMatrix[0][1];
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_y_b = colorMatrix[0][2];
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_cr_r = colorMatrix[1][0];
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_cr_g = colorMatrix[1][1];
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_cr_b = colorMatrix[1][2];
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_cb_r = colorMatrix[2][0];
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_cb_g = colorMatrix[2][1];
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscMatrix_cb_b = colorMatrix[2][2];
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscOffset_y  = colorOffset[0];
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscOffset_cr = colorOffset[1];
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscOffset_cb = colorOffset[2];
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscScale_y  = colorScale[0];
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscScale_cr = colorScale[1];
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->cscScale_cb = colorScale[2];
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryGvoColorConversion (
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float colorMatrix[3][3],
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float colorOffset[3],
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float colorScale[3]
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryGvoColorConversionReply rep;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryGvoColorConversionReq *req;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryGvoColorConversion, req);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryGvoColorConversion;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->screen = screen;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) {
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _XRead(dpy, (char *)(colorMatrix), 36);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _XRead(dpy, (char *)(colorOffset), 12);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _XRead(dpy, (char *)(colorScale), 12);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCtrlSelectTargetNotify (
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int notify_type,
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool onoff
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSelectTargetNotifyReq *req;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension (info))
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlSelectTargetNotify, req);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlSelectTargetNotify;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->notifyType = notify_type;
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->onoff = onoff;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True;
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCtrlSelectNotify (
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool onoff
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlSelectNotifyReq *req;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension (info))
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlSelectNotify, req);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlSelectNotify;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->screen = screen;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->notifyType = type;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->onoff = onoff;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryTargetBinaryData (
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char **ptr,
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *len
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryBinaryDataReply rep;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlQueryBinaryDataReq   *req;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool exists;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int length, numbytes, slop;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ptr) return False;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!XextHasExtension(info))
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay (dpy);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq (nvCtrlQueryBinaryData, req);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlQueryBinaryData;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    length = rep.length;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    numbytes = rep.n;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    slop = numbytes & 3;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = rep.flags;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exists) {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *ptr = (unsigned char *) Xmalloc(numbytes);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!exists || !*ptr) {
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _XEatData(dpy, length);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay (dpy);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle ();
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _XRead(dpy, (char *) *ptr, numbytes);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (slop) _XEatData(dpy, 4-slop);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len) *len = numbytes;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay (dpy);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle ();
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return exists;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLQueryBinaryData (
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int screen,
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char **ptr,
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *len
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN,
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        screen, display_mask,
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        attribute, ptr, len);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Bool XNVCTRLStringOperation (
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Display *dpy,
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_type,
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int target_id,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int display_mask,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int attribute,
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *pIn,
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char **ppOut
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)) {
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display(dpy);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlStringOperationReq *req;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvCtrlStringOperationReply rep;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bool ret;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int inSize, outSize, length, slop;
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!XextHasExtension(info))
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ppOut)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ppOut = NULL;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension(dpy, info, False);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pIn) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inSize = strlen(pIn) + 1;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inSize = 0;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LockDisplay(dpy);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetReq(nvCtrlStringOperation, req);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->reqType = info->codes->major_opcode;
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->nvReqType = X_nvCtrlStringOperation;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_type = target_type;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->target_id = target_id;
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->display_mask = display_mask;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->attribute = attribute;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->length += ((inSize + 3) & ~3) >> 2;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req->num_bytes = inSize;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pIn) {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Data(dpy, pIn, inSize);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UnlockDisplay(dpy);
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncHandle();
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    length = rep.length;
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outSize = rep.num_bytes;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    slop = outSize & 3;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (outSize) *ppOut = (char *) Xmalloc(outSize);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!*ppOut) {
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _XEatData(dpy, length);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _XRead(dpy, (char *) *ppOut, outSize);
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (slop) _XEatData(dpy, 4-slop);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = rep.ret;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnlockDisplay(dpy);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncHandle();
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Bool wire_to_event (Display *dpy, XEvent *host, xEvent *wire)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XExtDisplayInfo *info = find_display (dpy);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCtrlEvent *re;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvctrlEvent *event;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCtrlEventTarget *reTarget;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xnvctrlEventTarget *eventTarget;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCtrlEventTargetAvailability *reTargetAvailability;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCtrlStringEventTarget *reTargetString;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCtrlBinaryEventTarget *reTargetBinary;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XNVCTRLCheckExtension (dpy, info, False);
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch ((wire->u.u.type & 0x7F) - info->codes->first_event) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ATTRIBUTE_CHANGED_EVENT:
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re = (XNVCtrlEvent *) host;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event = (xnvctrlEvent *) wire;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.type = event->u.u.type & 0x7F;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.serial =
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            _XSetLastRequestRead(dpy, (xGenericReply*) event);
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.send_event = ((event->u.u.type & 0x80) != 0);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.display = dpy;
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.time = event->u.attribute_changed.time;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.screen = event->u.attribute_changed.screen;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.display_mask =
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            event->u.attribute_changed.display_mask;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.attribute = event->u.attribute_changed.attribute;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        re->attribute_changed.value = event->u.attribute_changed.value;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TARGET_ATTRIBUTE_CHANGED_EVENT:
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget = (XNVCtrlEventTarget *) host;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        eventTarget = (xnvctrlEventTarget *) wire;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.type = eventTarget->u.u.type & 0x7F;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.serial =
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.send_event =
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((eventTarget->u.u.type & 0x80) != 0);
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.display = dpy;
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.time =
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.time;
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.target_type =
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.target_type;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.target_id =
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.target_id;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.display_mask =
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.display_mask;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.attribute =
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.attribute;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTarget->attribute_changed.value =
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.value;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT:
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability = (XNVCtrlEventTargetAvailability *) host;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        eventTarget = (xnvctrlEventTarget *) wire;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.type =
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.u.type & 0x7F;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.serial =
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget);
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.send_event =
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((eventTarget->u.u.type & 0x80) != 0);
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.display = dpy;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.time =
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.availability_changed.time;
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.target_type =
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.availability_changed.target_type;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.target_id =
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.availability_changed.target_id;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.display_mask =
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.availability_changed.display_mask;
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.attribute =
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.availability_changed.attribute;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.availability =
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.availability_changed.availability;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetAvailability->attribute_changed.value =
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.availability_changed.value;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TARGET_STRING_ATTRIBUTE_CHANGED_EVENT:
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString = (XNVCtrlStringEventTarget *) host;
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        eventTarget = (xnvctrlEventTarget *) wire;
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.type = eventTarget->u.u.type & 0x7F;
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.serial =
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.send_event =
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((eventTarget->u.u.type & 0x80) != 0);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.display = dpy;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.time =
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.time;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.target_type =
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.target_type;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.target_id =
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.target_id;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.display_mask =
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.display_mask;
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetString->attribute_changed.attribute =
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.attribute;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT:
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary = (XNVCtrlBinaryEventTarget *) host;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        eventTarget = (xnvctrlEventTarget *) wire;
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.type = eventTarget->u.u.type & 0x7F;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.serial =
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.send_event =
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((eventTarget->u.u.type & 0x80) != 0);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.display = dpy;
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.time =
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.time;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.target_type =
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.target_type;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.target_id =
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.target_id;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.display_mask =
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.display_mask;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reTargetBinary->attribute_changed.attribute =
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            eventTarget->u.attribute_changed.attribute;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False;
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1241