XrrCrtc.c revision 8c4a8e55
1b042e37fSmrg/* 2b042e37fSmrg * Copyright © 2006 Keith Packard 3b042e37fSmrg * 4b042e37fSmrg * Permission to use, copy, modify, distribute, and sell this software and its 5b042e37fSmrg * documentation for any purpose is hereby granted without fee, provided that 6b042e37fSmrg * the above copyright notice appear in all copies and that both that copyright 7b042e37fSmrg * notice and this permission notice appear in supporting documentation, and 8b042e37fSmrg * that the name of the copyright holders not be used in advertising or 9b042e37fSmrg * publicity pertaining to distribution of the software without specific, 10b042e37fSmrg * written prior permission. The copyright holders make no representations 11b042e37fSmrg * about the suitability of this software for any purpose. It is provided "as 12b042e37fSmrg * is" without express or implied warranty. 13b042e37fSmrg * 14b042e37fSmrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15b042e37fSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16b042e37fSmrg * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17b042e37fSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18b042e37fSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19b042e37fSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20b042e37fSmrg * OF THIS SOFTWARE. 21b042e37fSmrg */ 22b042e37fSmrg 23b042e37fSmrg#ifdef HAVE_CONFIG_H 24b042e37fSmrg#include <config.h> 25b042e37fSmrg#endif 26b042e37fSmrg 27b042e37fSmrg#include <stdio.h> 28b042e37fSmrg#include <X11/Xlib.h> 29b042e37fSmrg/* we need to be able to manipulate the Display structure on events */ 30b042e37fSmrg#include <X11/Xlibint.h> 31b042e37fSmrg#include <X11/extensions/render.h> 32b042e37fSmrg#include <X11/extensions/Xrender.h> 33b042e37fSmrg#include "Xrandrint.h" 34b042e37fSmrg 35b042e37fSmrgXRRCrtcInfo * 36b042e37fSmrgXRRGetCrtcInfo (Display *dpy, XRRScreenResources *resources, RRCrtc crtc) 37b042e37fSmrg{ 38b042e37fSmrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 39b042e37fSmrg xRRGetCrtcInfoReply rep; 40b042e37fSmrg xRRGetCrtcInfoReq *req; 41b042e37fSmrg int nbytes, nbytesRead, rbytes; 42b042e37fSmrg XRRCrtcInfo *xci; 43b042e37fSmrg 448c4a8e55Smrg RRCheckExtension (dpy, info, NULL); 45b042e37fSmrg 46b042e37fSmrg LockDisplay (dpy); 47b042e37fSmrg GetReq (RRGetCrtcInfo, req); 48b042e37fSmrg req->reqType = info->codes->major_opcode; 49b042e37fSmrg req->randrReqType = X_RRGetCrtcInfo; 50b042e37fSmrg req->crtc = crtc; 51b042e37fSmrg req->configTimestamp = resources->configTimestamp; 52b042e37fSmrg 53b042e37fSmrg if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) 54b042e37fSmrg { 55b042e37fSmrg UnlockDisplay (dpy); 56b042e37fSmrg SyncHandle (); 57b042e37fSmrg return NULL; 58b042e37fSmrg } 59b042e37fSmrg 60b042e37fSmrg nbytes = (long) rep.length << 2; 61b042e37fSmrg 62b042e37fSmrg nbytesRead = (long) (rep.nOutput * 4 + 63b042e37fSmrg rep.nPossibleOutput * 4); 64b042e37fSmrg 65b042e37fSmrg /* 66b042e37fSmrg * first we must compute how much space to allocate for 67b042e37fSmrg * randr library's use; we'll allocate the structures in a single 68b042e37fSmrg * allocation, on cleanlyness grounds. 69b042e37fSmrg */ 70b042e37fSmrg 71b042e37fSmrg rbytes = (sizeof (XRRCrtcInfo) + 72b042e37fSmrg rep.nOutput * sizeof (RROutput) + 73b042e37fSmrg rep.nPossibleOutput * sizeof (RROutput)); 74b042e37fSmrg 75b042e37fSmrg xci = (XRRCrtcInfo *) Xmalloc(rbytes); 76b042e37fSmrg if (xci == NULL) { 77b042e37fSmrg _XEatData (dpy, (unsigned long) nbytes); 78b042e37fSmrg UnlockDisplay (dpy); 79b042e37fSmrg SyncHandle (); 80b042e37fSmrg return NULL; 81b042e37fSmrg } 82b042e37fSmrg 83b042e37fSmrg xci->timestamp = rep.timestamp; 84b042e37fSmrg xci->x = rep.x; 85b042e37fSmrg xci->y = rep.y; 86b042e37fSmrg xci->width = rep.width; 87b042e37fSmrg xci->height = rep.height; 88b042e37fSmrg xci->mode = rep.mode; 89b042e37fSmrg xci->rotation = rep.rotation; 90b042e37fSmrg xci->noutput = rep.nOutput; 91b042e37fSmrg xci->outputs = (RROutput *) (xci + 1); 92b042e37fSmrg xci->rotations = rep.rotations; 93b042e37fSmrg xci->npossible = rep.nPossibleOutput; 94b042e37fSmrg xci->possible = (RROutput *) (xci->outputs + rep.nOutput); 95b042e37fSmrg 96b042e37fSmrg _XRead32 (dpy, xci->outputs, rep.nOutput << 2); 97b042e37fSmrg _XRead32 (dpy, xci->possible, rep.nPossibleOutput << 2); 98b042e37fSmrg 99b042e37fSmrg /* 100b042e37fSmrg * Skip any extra data 101b042e37fSmrg */ 102b042e37fSmrg if (nbytes > nbytesRead) 103b042e37fSmrg _XEatData (dpy, (unsigned long) (nbytes - nbytesRead)); 104b042e37fSmrg 105b042e37fSmrg UnlockDisplay (dpy); 106b042e37fSmrg SyncHandle (); 107b042e37fSmrg return (XRRCrtcInfo *) xci; 108b042e37fSmrg} 109b042e37fSmrg 110b042e37fSmrgvoid 111b042e37fSmrgXRRFreeCrtcInfo (XRRCrtcInfo *crtcInfo) 112b042e37fSmrg{ 113b042e37fSmrg Xfree (crtcInfo); 114b042e37fSmrg} 115b042e37fSmrg 116b042e37fSmrgStatus 117b042e37fSmrgXRRSetCrtcConfig (Display *dpy, 118b042e37fSmrg XRRScreenResources *resources, 119b042e37fSmrg RRCrtc crtc, 120b042e37fSmrg Time timestamp, 121b042e37fSmrg int x, int y, 122b042e37fSmrg RRMode mode, 123b042e37fSmrg Rotation rotation, 124b042e37fSmrg RROutput *outputs, 125b042e37fSmrg int noutputs) 126b042e37fSmrg{ 127b042e37fSmrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 128b042e37fSmrg xRRSetCrtcConfigReply rep; 129b042e37fSmrg xRRSetCrtcConfigReq *req; 130b042e37fSmrg 131b042e37fSmrg RRCheckExtension (dpy, info, 0); 132b042e37fSmrg 133b042e37fSmrg LockDisplay(dpy); 134b042e37fSmrg GetReq (RRSetCrtcConfig, req); 135b042e37fSmrg req->reqType = info->codes->major_opcode; 136b042e37fSmrg req->randrReqType = X_RRSetCrtcConfig; 137b042e37fSmrg req->length += noutputs; 138b042e37fSmrg req->crtc = crtc; 139b042e37fSmrg req->timestamp = timestamp; 140b042e37fSmrg req->configTimestamp = resources->configTimestamp; 141b042e37fSmrg req->x = x; 142b042e37fSmrg req->y = y; 143b042e37fSmrg req->mode = mode; 144b042e37fSmrg req->rotation = rotation; 145b042e37fSmrg Data32 (dpy, outputs, noutputs << 2); 146b042e37fSmrg 147b042e37fSmrg if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) 148b042e37fSmrg rep.status = RRSetConfigFailed; 149b042e37fSmrg UnlockDisplay (dpy); 150b042e37fSmrg SyncHandle (); 151b042e37fSmrg return rep.status; 152b042e37fSmrg} 153b042e37fSmrg 154b042e37fSmrgint 155b042e37fSmrgXRRGetCrtcGammaSize (Display *dpy, RRCrtc crtc) 156b042e37fSmrg{ 157b042e37fSmrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 158b042e37fSmrg xRRGetCrtcGammaSizeReply rep; 159b042e37fSmrg xRRGetCrtcGammaSizeReq *req; 160b042e37fSmrg 161b042e37fSmrg RRCheckExtension (dpy, info, 0); 162b042e37fSmrg 163b042e37fSmrg LockDisplay(dpy); 164b042e37fSmrg GetReq (RRGetCrtcGammaSize, req); 165b042e37fSmrg req->reqType = info->codes->major_opcode; 166b042e37fSmrg req->randrReqType = X_RRGetCrtcGammaSize; 167b042e37fSmrg req->crtc = crtc; 168b042e37fSmrg 169b042e37fSmrg if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) 170b042e37fSmrg rep.status = RRSetConfigFailed; 171b042e37fSmrg UnlockDisplay (dpy); 172b042e37fSmrg SyncHandle (); 173b042e37fSmrg return rep.size; 174b042e37fSmrg} 175b042e37fSmrg 176b042e37fSmrgXRRCrtcGamma * 177b042e37fSmrgXRRGetCrtcGamma (Display *dpy, RRCrtc crtc) 178b042e37fSmrg{ 179b042e37fSmrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 180b042e37fSmrg xRRGetCrtcGammaReply rep; 181b042e37fSmrg xRRGetCrtcGammaReq *req; 182b042e37fSmrg XRRCrtcGamma *crtc_gamma; 183b042e37fSmrg long nbytes; 184b042e37fSmrg long nbytesRead; 185b042e37fSmrg 1868c4a8e55Smrg RRCheckExtension (dpy, info, NULL); 187b042e37fSmrg 188b042e37fSmrg LockDisplay(dpy); 189b042e37fSmrg GetReq (RRGetCrtcGamma, req); 190b042e37fSmrg req->reqType = info->codes->major_opcode; 191b042e37fSmrg req->randrReqType = X_RRGetCrtcGamma; 192b042e37fSmrg req->crtc = crtc; 193b042e37fSmrg 194b042e37fSmrg if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) 195b042e37fSmrg rep.status = RRSetConfigFailed; 196b042e37fSmrg 197b042e37fSmrg nbytes = (long) rep.length << 2; 198b042e37fSmrg 199b042e37fSmrg /* three channels of CARD16 data */ 200b042e37fSmrg nbytesRead = (rep.size * 2 * 3); 201b042e37fSmrg 202b042e37fSmrg crtc_gamma = XRRAllocGamma (rep.size); 203b042e37fSmrg 204b042e37fSmrg if (!crtc_gamma) 205b042e37fSmrg { 206b042e37fSmrg _XEatData (dpy, (unsigned long) nbytes); 207b042e37fSmrg UnlockDisplay (dpy); 208b042e37fSmrg SyncHandle (); 209b042e37fSmrg return NULL; 210b042e37fSmrg } 211b042e37fSmrg _XRead16 (dpy, crtc_gamma->red, rep.size * 2); 212b042e37fSmrg _XRead16 (dpy, crtc_gamma->green, rep.size * 2); 213b042e37fSmrg _XRead16 (dpy, crtc_gamma->blue, rep.size * 2); 214b042e37fSmrg 215b042e37fSmrg if (nbytes > nbytesRead) 216b042e37fSmrg _XEatData (dpy, (unsigned long) (nbytes - nbytesRead)); 217b042e37fSmrg 218b042e37fSmrg UnlockDisplay (dpy); 219b042e37fSmrg SyncHandle (); 220b042e37fSmrg return crtc_gamma; 221b042e37fSmrg} 222b042e37fSmrg 223b042e37fSmrgXRRCrtcGamma * 224b042e37fSmrgXRRAllocGamma (int size) 225b042e37fSmrg{ 226b042e37fSmrg XRRCrtcGamma *crtc_gamma; 227b042e37fSmrg 228b042e37fSmrg crtc_gamma = Xmalloc (sizeof (XRRCrtcGamma) + 229b042e37fSmrg sizeof (crtc_gamma->red[0]) * size * 3); 230b042e37fSmrg if (!crtc_gamma) 231b042e37fSmrg return NULL; 232b042e37fSmrg crtc_gamma->size = size; 233b042e37fSmrg crtc_gamma->red = (unsigned short *) (crtc_gamma + 1); 234b042e37fSmrg crtc_gamma->green = crtc_gamma->red + size; 235b042e37fSmrg crtc_gamma->blue = crtc_gamma->green + size; 236b042e37fSmrg return crtc_gamma; 237b042e37fSmrg} 238b042e37fSmrg 239b042e37fSmrgvoid 240b042e37fSmrgXRRSetCrtcGamma (Display *dpy, RRCrtc crtc, XRRCrtcGamma *crtc_gamma) 241b042e37fSmrg{ 242b042e37fSmrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 243b042e37fSmrg xRRSetCrtcGammaReq *req; 244b042e37fSmrg 245b042e37fSmrg RRSimpleCheckExtension (dpy, info); 246b042e37fSmrg 247b042e37fSmrg LockDisplay(dpy); 248b042e37fSmrg GetReq (RRSetCrtcGamma, req); 249b042e37fSmrg req->reqType = info->codes->major_opcode; 250b042e37fSmrg req->randrReqType = X_RRSetCrtcGamma; 251b042e37fSmrg req->crtc = crtc; 252b042e37fSmrg req->size = crtc_gamma->size; 253b042e37fSmrg req->length += (crtc_gamma->size * 2 * 3 + 3) >> 2; 254b042e37fSmrg /* 255b042e37fSmrg * Note this assumes the structure was allocated with XRRAllocGamma, 256b042e37fSmrg * otherwise the channels might not be contiguous 257b042e37fSmrg */ 258b042e37fSmrg Data16 (dpy, crtc_gamma->red, crtc_gamma->size * 2 * 3); 259b042e37fSmrg 260b042e37fSmrg UnlockDisplay (dpy); 261b042e37fSmrg SyncHandle (); 262b042e37fSmrg} 263b042e37fSmrg 264b042e37fSmrgvoid 265b042e37fSmrgXRRFreeGamma (XRRCrtcGamma *crtc_gamma) 266b042e37fSmrg{ 267b042e37fSmrg Xfree (crtc_gamma); 268b042e37fSmrg} 2698c4a8e55Smrg 2708c4a8e55Smrg/* Version 1.3 additions */ 2718c4a8e55Smrg 2728c4a8e55Smrgstatic void 2738c4a8e55SmrgXTransform_from_xRenderTransform (XTransform *x, 2748c4a8e55Smrg xRenderTransform *render) 2758c4a8e55Smrg{ 2768c4a8e55Smrg x->matrix[0][0] = render->matrix11; 2778c4a8e55Smrg x->matrix[0][1] = render->matrix12; 2788c4a8e55Smrg x->matrix[0][2] = render->matrix13; 2798c4a8e55Smrg 2808c4a8e55Smrg x->matrix[1][0] = render->matrix21; 2818c4a8e55Smrg x->matrix[1][1] = render->matrix22; 2828c4a8e55Smrg x->matrix[1][2] = render->matrix23; 2838c4a8e55Smrg 2848c4a8e55Smrg x->matrix[2][0] = render->matrix31; 2858c4a8e55Smrg x->matrix[2][1] = render->matrix32; 2868c4a8e55Smrg x->matrix[2][2] = render->matrix33; 2878c4a8e55Smrg} 2888c4a8e55Smrg 2898c4a8e55Smrgstatic void 2908c4a8e55SmrgxRenderTransform_from_XTransform (xRenderTransform *render, 2918c4a8e55Smrg XTransform *x) 2928c4a8e55Smrg{ 2938c4a8e55Smrg render->matrix11 = x->matrix[0][0]; 2948c4a8e55Smrg render->matrix12 = x->matrix[0][1]; 2958c4a8e55Smrg render->matrix13 = x->matrix[0][2]; 2968c4a8e55Smrg 2978c4a8e55Smrg render->matrix21 = x->matrix[1][0]; 2988c4a8e55Smrg render->matrix22 = x->matrix[1][1]; 2998c4a8e55Smrg render->matrix23 = x->matrix[1][2]; 3008c4a8e55Smrg 3018c4a8e55Smrg render->matrix31 = x->matrix[2][0]; 3028c4a8e55Smrg render->matrix32 = x->matrix[2][1]; 3038c4a8e55Smrg render->matrix33 = x->matrix[2][2]; 3048c4a8e55Smrg} 3058c4a8e55Smrg 3068c4a8e55Smrgvoid 3078c4a8e55SmrgXRRSetCrtcTransform (Display *dpy, 3088c4a8e55Smrg RRCrtc crtc, 3098c4a8e55Smrg XTransform *transform, 3108c4a8e55Smrg char *filter, 3118c4a8e55Smrg XFixed *params, 3128c4a8e55Smrg int nparams) 3138c4a8e55Smrg{ 3148c4a8e55Smrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 3158c4a8e55Smrg xRRSetCrtcTransformReq *req; 3168c4a8e55Smrg int nbytes = strlen (filter); 3178c4a8e55Smrg 3188c4a8e55Smrg RRSimpleCheckExtension (dpy, info); 3198c4a8e55Smrg 3208c4a8e55Smrg LockDisplay(dpy); 3218c4a8e55Smrg GetReq (RRSetCrtcTransform, req); 3228c4a8e55Smrg req->reqType = info->codes->major_opcode; 3238c4a8e55Smrg req->randrReqType = X_RRSetCrtcTransform; 3248c4a8e55Smrg req->crtc = crtc; 3258c4a8e55Smrg 3268c4a8e55Smrg xRenderTransform_from_XTransform (&req->transform, transform); 3278c4a8e55Smrg 3288c4a8e55Smrg req->nbytesFilter = nbytes; 3298c4a8e55Smrg req->length += ((nbytes + 3) >> 2) + nparams; 3308c4a8e55Smrg Data (dpy, filter, nbytes); 3318c4a8e55Smrg Data32 (dpy, params, nparams << 2); 3328c4a8e55Smrg 3338c4a8e55Smrg UnlockDisplay (dpy); 3348c4a8e55Smrg SyncHandle (); 3358c4a8e55Smrg} 3368c4a8e55Smrg 3378c4a8e55Smrg#define CrtcTransformExtra (SIZEOF(xRRGetCrtcTransformReply) - 32) 3388c4a8e55Smrg 3398c4a8e55Smrgstatic const xRenderTransform identity = { 3408c4a8e55Smrg 0x10000, 0, 0, 3418c4a8e55Smrg 0, 0x10000, 0, 3428c4a8e55Smrg 0, 0, 0x10000, 3438c4a8e55Smrg}; 3448c4a8e55Smrg 3458c4a8e55Smrgstatic Bool 3468c4a8e55Smrg_XRRHasTransform (int major, int minor) 3478c4a8e55Smrg{ 3488c4a8e55Smrg return major > 1 || (major == 1 && minor >= 3); 3498c4a8e55Smrg} 3508c4a8e55Smrg 3518c4a8e55SmrgStatus 3528c4a8e55SmrgXRRGetCrtcTransform (Display *dpy, 3538c4a8e55Smrg RRCrtc crtc, 3548c4a8e55Smrg XRRCrtcTransformAttributes **attributes) 3558c4a8e55Smrg{ 3568c4a8e55Smrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 3578c4a8e55Smrg xRRGetCrtcTransformReply rep; 3588c4a8e55Smrg xRRGetCrtcTransformReq *req; 3598c4a8e55Smrg int major_version, minor_version; 3608c4a8e55Smrg XRRCrtcTransformAttributes *attr; 3618c4a8e55Smrg char *extra = NULL, *e; 3628c4a8e55Smrg int p; 3638c4a8e55Smrg 3648c4a8e55Smrg *attributes = NULL; 3658c4a8e55Smrg 3668c4a8e55Smrg RRCheckExtension (dpy, info, False); 3678c4a8e55Smrg 3688c4a8e55Smrg if (!XRRQueryVersion (dpy, &major_version, &minor_version) || 3698c4a8e55Smrg !_XRRHasTransform (major_version, minor_version)) 3708c4a8e55Smrg { 3718c4a8e55Smrg /* For pre-1.3 servers, just report identity matrices everywhere */ 3728c4a8e55Smrg rep.pendingTransform = identity; 3738c4a8e55Smrg rep.pendingNbytesFilter = 0; 3748c4a8e55Smrg rep.pendingNparamsFilter = 0; 3758c4a8e55Smrg rep.currentTransform = identity; 3768c4a8e55Smrg rep.currentNbytesFilter = 0; 3778c4a8e55Smrg rep.currentNparamsFilter = 0; 3788c4a8e55Smrg } 3798c4a8e55Smrg else 3808c4a8e55Smrg { 3818c4a8e55Smrg LockDisplay (dpy); 3828c4a8e55Smrg GetReq (RRGetCrtcTransform, req); 3838c4a8e55Smrg req->reqType = info->codes->major_opcode; 3848c4a8e55Smrg req->randrReqType = X_RRGetCrtcTransform; 3858c4a8e55Smrg req->crtc = crtc; 3868c4a8e55Smrg 3878c4a8e55Smrg if (!_XReply (dpy, (xReply *) &rep, CrtcTransformExtra >> 2, xFalse)) 3888c4a8e55Smrg { 3898c4a8e55Smrg rep.pendingTransform = identity; 3908c4a8e55Smrg rep.pendingNbytesFilter = 0; 3918c4a8e55Smrg rep.pendingNparamsFilter = 0; 3928c4a8e55Smrg rep.currentTransform = identity; 3938c4a8e55Smrg rep.currentNbytesFilter = 0; 3948c4a8e55Smrg rep.currentNparamsFilter = 0; 3958c4a8e55Smrg } 3968c4a8e55Smrg else 3978c4a8e55Smrg { 3988c4a8e55Smrg int extraBytes = rep.length * 4 - CrtcTransformExtra; 3998c4a8e55Smrg extra = Xmalloc (extraBytes); 4008c4a8e55Smrg if (!extra) { 4018c4a8e55Smrg _XEatData (dpy, extraBytes); 4028c4a8e55Smrg UnlockDisplay (dpy); 4038c4a8e55Smrg SyncHandle (); 4048c4a8e55Smrg return False; 4058c4a8e55Smrg } 4068c4a8e55Smrg _XRead (dpy, extra, extraBytes); 4078c4a8e55Smrg } 4088c4a8e55Smrg 4098c4a8e55Smrg UnlockDisplay (dpy); 4108c4a8e55Smrg SyncHandle (); 4118c4a8e55Smrg } 4128c4a8e55Smrg 4138c4a8e55Smrg attr = Xmalloc (sizeof (XRRCrtcTransformAttributes) + 4148c4a8e55Smrg rep.pendingNparamsFilter * sizeof (XFixed) + 4158c4a8e55Smrg rep.currentNparamsFilter * sizeof (XFixed) + 4168c4a8e55Smrg rep.pendingNbytesFilter + 1 + 4178c4a8e55Smrg rep.currentNbytesFilter + 1); 4188c4a8e55Smrg 4198c4a8e55Smrg if (!attr) { 4208c4a8e55Smrg XFree (extra); 4218c4a8e55Smrg return False; 4228c4a8e55Smrg } 4238c4a8e55Smrg XTransform_from_xRenderTransform (&attr->pendingTransform, &rep.pendingTransform); 4248c4a8e55Smrg XTransform_from_xRenderTransform (&attr->currentTransform, &rep.currentTransform); 4258c4a8e55Smrg 4268c4a8e55Smrg attr->pendingParams = (XFixed *) (attr + 1); 4278c4a8e55Smrg attr->currentParams = attr->pendingParams + rep.pendingNparamsFilter; 4288c4a8e55Smrg attr->pendingFilter = (char *) (attr->currentParams + rep.currentNparamsFilter); 4298c4a8e55Smrg attr->currentFilter = attr->pendingFilter + rep.pendingNbytesFilter + 1; 4308c4a8e55Smrg 4318c4a8e55Smrg e = extra; 4328c4a8e55Smrg 4338c4a8e55Smrg memcpy (attr->pendingFilter, e, rep.pendingNbytesFilter); 4348c4a8e55Smrg attr->pendingFilter[rep.pendingNbytesFilter] = '\0'; 4358c4a8e55Smrg e += (rep.pendingNbytesFilter + 3) & ~3; 4368c4a8e55Smrg for (p = 0; p < rep.pendingNparamsFilter; p++) { 4378c4a8e55Smrg INT32 f; 4388c4a8e55Smrg memcpy (&f, e, 4); 4398c4a8e55Smrg e += 4; 4408c4a8e55Smrg attr->pendingParams[p] = (XFixed) f; 4418c4a8e55Smrg } 4428c4a8e55Smrg attr->pendingNparams = rep.pendingNparamsFilter; 4438c4a8e55Smrg 4448c4a8e55Smrg memcpy (attr->currentFilter, e, rep.currentNbytesFilter); 4458c4a8e55Smrg attr->currentFilter[rep.currentNbytesFilter] = '\0'; 4468c4a8e55Smrg e += (rep.currentNbytesFilter + 3) & ~3; 4478c4a8e55Smrg for (p = 0; p < rep.currentNparamsFilter; p++) { 4488c4a8e55Smrg INT32 f; 4498c4a8e55Smrg memcpy (&f, e, 4); 4508c4a8e55Smrg e += 4; 4518c4a8e55Smrg attr->currentParams[p] = (XFixed) f; 4528c4a8e55Smrg } 4538c4a8e55Smrg attr->currentNparams = rep.currentNparamsFilter; 4548c4a8e55Smrg 4558c4a8e55Smrg if (extra) 4568c4a8e55Smrg XFree (extra); 4578c4a8e55Smrg *attributes = attr; 4588c4a8e55Smrg 4598c4a8e55Smrg return True; 4608c4a8e55Smrg} 4618c4a8e55Smrg 4628c4a8e55SmrgXRRPanning * 4638c4a8e55SmrgXRRGetPanning (Display *dpy, XRRScreenResources *resources, RRCrtc crtc) 4648c4a8e55Smrg{ 4658c4a8e55Smrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 4668c4a8e55Smrg xRRGetPanningReply rep; 4678c4a8e55Smrg xRRGetPanningReq *req; 4688c4a8e55Smrg XRRPanning *xp; 4698c4a8e55Smrg 4708c4a8e55Smrg RRCheckExtension (dpy, info, NULL); 4718c4a8e55Smrg 4728c4a8e55Smrg LockDisplay (dpy); 4738c4a8e55Smrg GetReq (RRGetPanning, req); 4748c4a8e55Smrg req->reqType = info->codes->major_opcode; 4758c4a8e55Smrg req->randrReqType = X_RRGetPanning; 4768c4a8e55Smrg req->crtc = crtc; 4778c4a8e55Smrg 4788c4a8e55Smrg if (!_XReply (dpy, (xReply *) &rep, 1, xFalse)) 4798c4a8e55Smrg { 4808c4a8e55Smrg UnlockDisplay (dpy); 4818c4a8e55Smrg SyncHandle (); 4828c4a8e55Smrg return NULL; 4838c4a8e55Smrg } 4848c4a8e55Smrg 4858c4a8e55Smrg if (! (xp = (XRRPanning *) Xmalloc(sizeof(XRRPanning))) ) { 4868c4a8e55Smrg _XEatData (dpy, sizeof(XRRPanning)); 4878c4a8e55Smrg UnlockDisplay (dpy); 4888c4a8e55Smrg SyncHandle (); 4898c4a8e55Smrg return NULL; 4908c4a8e55Smrg } 4918c4a8e55Smrg 4928c4a8e55Smrg xp->timestamp = rep.timestamp; 4938c4a8e55Smrg xp->left = rep.left; 4948c4a8e55Smrg xp->top = rep.top; 4958c4a8e55Smrg xp->width = rep.width; 4968c4a8e55Smrg xp->height = rep.height; 4978c4a8e55Smrg xp->track_left = rep.track_left; 4988c4a8e55Smrg xp->track_top = rep.track_top; 4998c4a8e55Smrg xp->track_width = rep.track_width; 5008c4a8e55Smrg xp->track_height = rep.track_height; 5018c4a8e55Smrg xp->border_left = rep.border_left; 5028c4a8e55Smrg xp->border_top = rep.border_top; 5038c4a8e55Smrg xp->border_right = rep.border_right; 5048c4a8e55Smrg xp->border_bottom = rep.border_bottom; 5058c4a8e55Smrg 5068c4a8e55Smrg UnlockDisplay (dpy); 5078c4a8e55Smrg SyncHandle (); 5088c4a8e55Smrg return (XRRPanning *) xp; 5098c4a8e55Smrg} 5108c4a8e55Smrg 5118c4a8e55Smrgvoid 5128c4a8e55SmrgXRRFreePanning (XRRPanning *panning) 5138c4a8e55Smrg{ 5148c4a8e55Smrg Xfree (panning); 5158c4a8e55Smrg} 5168c4a8e55Smrg 5178c4a8e55SmrgStatus 5188c4a8e55SmrgXRRSetPanning (Display *dpy, 5198c4a8e55Smrg XRRScreenResources *resources, 5208c4a8e55Smrg RRCrtc crtc, 5218c4a8e55Smrg XRRPanning *panning) 5228c4a8e55Smrg{ 5238c4a8e55Smrg XExtDisplayInfo *info = XRRFindDisplay(dpy); 5248c4a8e55Smrg xRRSetPanningReply rep; 5258c4a8e55Smrg xRRSetPanningReq *req; 5268c4a8e55Smrg 5278c4a8e55Smrg RRCheckExtension (dpy, info, 0); 5288c4a8e55Smrg 5298c4a8e55Smrg LockDisplay(dpy); 5308c4a8e55Smrg GetReq (RRSetPanning, req); 5318c4a8e55Smrg req->reqType = info->codes->major_opcode; 5328c4a8e55Smrg req->randrReqType = X_RRSetPanning; 5338c4a8e55Smrg req->crtc = crtc; 5348c4a8e55Smrg req->timestamp = panning->timestamp; 5358c4a8e55Smrg req->left = panning->left; 5368c4a8e55Smrg req->top = panning->top; 5378c4a8e55Smrg req->width = panning->width; 5388c4a8e55Smrg req->height = panning->height; 5398c4a8e55Smrg req->track_left = panning->track_left; 5408c4a8e55Smrg req->track_top = panning->track_top; 5418c4a8e55Smrg req->track_width = panning->track_width; 5428c4a8e55Smrg req->track_height = panning->track_height; 5438c4a8e55Smrg req->border_left = panning->border_left; 5448c4a8e55Smrg req->border_top = panning->border_top; 5458c4a8e55Smrg req->border_right = panning->border_right; 5468c4a8e55Smrg req->border_bottom = panning->border_bottom; 5478c4a8e55Smrg 5488c4a8e55Smrg if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) 5498c4a8e55Smrg rep.status = RRSetConfigFailed; 5508c4a8e55Smrg UnlockDisplay (dpy); 5518c4a8e55Smrg SyncHandle (); 5528c4a8e55Smrg return rep.status; 5538c4a8e55Smrg} 5548c4a8e55Smrg 555