| File: | XrrCrtc.c |
| Location: | line 432, column 5 |
| Description: | Null pointer passed as an argument to a 'nonnull' parameter |
| 1 | /* | ||
| 2 | * Copyright © 2006 Keith Packard | ||
| 3 | * | ||
| 4 | * Permission to use, copy, modify, distribute, and sell this software and its | ||
| 5 | * documentation for any purpose is hereby granted without fee, provided that | ||
| 6 | * the above copyright notice appear in all copies and that both that copyright | ||
| 7 | * notice and this permission notice appear in supporting documentation, and | ||
| 8 | * that the name of the copyright holders not be used in advertising or | ||
| 9 | * publicity pertaining to distribution of the software without specific, | ||
| 10 | * written prior permission. The copyright holders make no representations | ||
| 11 | * about the suitability of this software for any purpose. It is provided "as | ||
| 12 | * is" without express or implied warranty. | ||
| 13 | * | ||
| 14 | * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | ||
| 15 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO | ||
| 16 | * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR | ||
| 17 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, | ||
| 18 | * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | ||
| 19 | * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||
| 20 | * OF THIS SOFTWARE. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #ifdef HAVE_CONFIG_H1 | ||
| 24 | #include <config.h> | ||
| 25 | #endif | ||
| 26 | |||
| 27 | #include <stdio.h> | ||
| 28 | #include <X11/Xlib.h> | ||
| 29 | /* we need to be able to manipulate the Display structure on events */ | ||
| 30 | #include <X11/Xlibint.h> | ||
| 31 | #include <X11/extensions/render.h> | ||
| 32 | #include <X11/extensions/Xrender.h> | ||
| 33 | #include "Xrandrint.h" | ||
| 34 | |||
| 35 | XRRCrtcInfo * | ||
| 36 | XRRGetCrtcInfo (Display *dpy, XRRScreenResources *resources, RRCrtc crtc) | ||
| 37 | { | ||
| 38 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 39 | xRRGetCrtcInfoReply rep; | ||
| 40 | xRRGetCrtcInfoReq *req; | ||
| 41 | int nbytes, nbytesRead, rbytes; | ||
| 42 | XRRCrtcInfo *xci; | ||
| 43 | |||
| 44 | RRCheckExtension (dpy, info, NULL)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return ((void*)0); }; | ||
| 45 | |||
| 46 | LockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 47 | GetReq (RRGetCrtcInfo, req)req = (xRRGetCrtcInfoReq *) _XGetRequest(dpy, 20, 12); | ||
| 48 | req->reqType = info->codes->major_opcode; | ||
| 49 | req->randrReqType = X_RRGetCrtcInfo20; | ||
| 50 | req->crtc = crtc; | ||
| 51 | req->configTimestamp = resources->configTimestamp; | ||
| 52 | |||
| 53 | if (!_XReply (dpy, (xReply *) &rep, 0, xFalse0)) | ||
| 54 | { | ||
| 55 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 56 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 57 | return NULL((void*)0); | ||
| 58 | } | ||
| 59 | |||
| 60 | nbytes = (long) rep.length << 2; | ||
| 61 | |||
| 62 | nbytesRead = (long) (rep.nOutput * 4 + | ||
| 63 | rep.nPossibleOutput * 4); | ||
| 64 | |||
| 65 | /* | ||
| 66 | * first we must compute how much space to allocate for | ||
| 67 | * randr library's use; we'll allocate the structures in a single | ||
| 68 | * allocation, on cleanlyness grounds. | ||
| 69 | */ | ||
| 70 | |||
| 71 | rbytes = (sizeof (XRRCrtcInfo) + | ||
| 72 | rep.nOutput * sizeof (RROutput) + | ||
| 73 | rep.nPossibleOutput * sizeof (RROutput)); | ||
| 74 | |||
| 75 | xci = (XRRCrtcInfo *) Xmalloc(rbytes)malloc(((rbytes) == 0 ? 1 : (rbytes))); | ||
| 76 | if (xci == NULL((void*)0)) { | ||
| 77 | _XEatData (dpy, (unsigned long) nbytes); | ||
| 78 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 79 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 80 | return NULL((void*)0); | ||
| 81 | } | ||
| 82 | |||
| 83 | xci->timestamp = rep.timestamp; | ||
| 84 | xci->x = rep.x; | ||
| 85 | xci->y = rep.y; | ||
| 86 | xci->width = rep.width; | ||
| 87 | xci->height = rep.height; | ||
| 88 | xci->mode = rep.mode; | ||
| 89 | xci->rotation = rep.rotation; | ||
| 90 | xci->noutput = rep.nOutput; | ||
| 91 | xci->outputs = (RROutput *) (xci + 1); | ||
| 92 | xci->rotations = rep.rotations; | ||
| 93 | xci->npossible = rep.nPossibleOutput; | ||
| 94 | xci->possible = (RROutput *) (xci->outputs + rep.nOutput); | ||
| 95 | |||
| 96 | _XRead32 (dpy, xci->outputs, rep.nOutput << 2)_XRead((dpy), (char *)(xci->outputs), (rep.nOutput << 2)); | ||
| 97 | _XRead32 (dpy, xci->possible, rep.nPossibleOutput << 2)_XRead((dpy), (char *)(xci->possible), (rep.nPossibleOutput << 2)); | ||
| 98 | |||
| 99 | /* | ||
| 100 | * Skip any extra data | ||
| 101 | */ | ||
| 102 | if (nbytes > nbytesRead) | ||
| 103 | _XEatData (dpy, (unsigned long) (nbytes - nbytesRead)); | ||
| 104 | |||
| 105 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 106 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 107 | return (XRRCrtcInfo *) xci; | ||
| 108 | } | ||
| 109 | |||
| 110 | void | ||
| 111 | XRRFreeCrtcInfo (XRRCrtcInfo *crtcInfo) | ||
| 112 | { | ||
| 113 | Xfree (crtcInfo)free((crtcInfo)); | ||
| 114 | } | ||
| 115 | |||
| 116 | Statusint | ||
| 117 | XRRSetCrtcConfig (Display *dpy, | ||
| 118 | XRRScreenResources *resources, | ||
| 119 | RRCrtc crtc, | ||
| 120 | Time timestamp, | ||
| 121 | int x, int y, | ||
| 122 | RRMode mode, | ||
| 123 | Rotation rotation, | ||
| 124 | RROutput *outputs, | ||
| 125 | int noutputs) | ||
| 126 | { | ||
| 127 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 128 | xRRSetCrtcConfigReply rep; | ||
| 129 | xRRSetCrtcConfigReq *req; | ||
| 130 | |||
| 131 | RRCheckExtension (dpy, info, 0)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return 0; }; | ||
| 132 | |||
| 133 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 134 | GetReq (RRSetCrtcConfig, req)req = (xRRSetCrtcConfigReq *) _XGetRequest(dpy, 21, 28); | ||
| 135 | req->reqType = info->codes->major_opcode; | ||
| 136 | req->randrReqType = X_RRSetCrtcConfig21; | ||
| 137 | req->length += noutputs; | ||
| 138 | req->crtc = crtc; | ||
| 139 | req->timestamp = timestamp; | ||
| 140 | req->configTimestamp = resources->configTimestamp; | ||
| 141 | req->x = x; | ||
| 142 | req->y = y; | ||
| 143 | req->mode = mode; | ||
| 144 | req->rotation = rotation; | ||
| 145 | Data32 (dpy, outputs, noutputs << 2){ if ((dpy)->bufptr + ((noutputs << 2)) <= (dpy)-> bufmax) { memcpy((dpy)->bufptr, (char *)(outputs), (int)(noutputs << 2)); (dpy)->bufptr += (((noutputs << 2)) + 3) & ~3; } else _XSend((dpy), (char *)(outputs), (noutputs << 2)); }; | ||
| 146 | |||
| 147 | if (!_XReply (dpy, (xReply *) &rep, 0, xFalse0)) | ||
| 148 | rep.status = RRSetConfigFailed3; | ||
| 149 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 150 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 151 | return rep.status; | ||
| 152 | } | ||
| 153 | |||
| 154 | int | ||
| 155 | XRRGetCrtcGammaSize (Display *dpy, RRCrtc crtc) | ||
| 156 | { | ||
| 157 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 158 | xRRGetCrtcGammaSizeReply rep; | ||
| 159 | xRRGetCrtcGammaSizeReq *req; | ||
| 160 | |||
| 161 | RRCheckExtension (dpy, info, 0)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return 0; }; | ||
| 162 | |||
| 163 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 164 | GetReq (RRGetCrtcGammaSize, req)req = (xRRGetCrtcGammaSizeReq *) _XGetRequest(dpy, 22, 8); | ||
| 165 | req->reqType = info->codes->major_opcode; | ||
| 166 | req->randrReqType = X_RRGetCrtcGammaSize22; | ||
| 167 | req->crtc = crtc; | ||
| 168 | |||
| 169 | if (!_XReply (dpy, (xReply *) &rep, 0, xFalse0)) | ||
| 170 | rep.size = 0; | ||
| 171 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 172 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 173 | return rep.size; | ||
| 174 | } | ||
| 175 | |||
| 176 | XRRCrtcGamma * | ||
| 177 | XRRGetCrtcGamma (Display *dpy, RRCrtc crtc) | ||
| 178 | { | ||
| 179 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 180 | xRRGetCrtcGammaReply rep; | ||
| 181 | xRRGetCrtcGammaReq *req; | ||
| 182 | XRRCrtcGamma *crtc_gamma = NULL((void*)0); | ||
| 183 | long nbytes; | ||
| 184 | long nbytesRead; | ||
| 185 | |||
| 186 | RRCheckExtension (dpy, info, NULL)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return ((void*)0); }; | ||
| 187 | |||
| 188 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 189 | GetReq (RRGetCrtcGamma, req)req = (xRRGetCrtcGammaReq *) _XGetRequest(dpy, 23, 8); | ||
| 190 | req->reqType = info->codes->major_opcode; | ||
| 191 | req->randrReqType = X_RRGetCrtcGamma23; | ||
| 192 | req->crtc = crtc; | ||
| 193 | |||
| 194 | if (!_XReply (dpy, (xReply *) &rep, 0, xFalse0)) | ||
| 195 | goto out; | ||
| 196 | |||
| 197 | nbytes = (long) rep.length << 2; | ||
| 198 | |||
| 199 | /* three channels of CARD16 data */ | ||
| 200 | nbytesRead = (rep.size * 2 * 3); | ||
| 201 | |||
| 202 | crtc_gamma = XRRAllocGamma (rep.size); | ||
| 203 | |||
| 204 | if (!crtc_gamma) | ||
| 205 | { | ||
| 206 | _XEatData (dpy, (unsigned long) nbytes); | ||
| 207 | goto out; | ||
| 208 | } | ||
| 209 | _XRead16 (dpy, crtc_gamma->red, rep.size * 2)_XRead((dpy), (char *)(crtc_gamma->red), (rep.size * 2)); | ||
| 210 | _XRead16 (dpy, crtc_gamma->green, rep.size * 2)_XRead((dpy), (char *)(crtc_gamma->green), (rep.size * 2)); | ||
| 211 | _XRead16 (dpy, crtc_gamma->blue, rep.size * 2)_XRead((dpy), (char *)(crtc_gamma->blue), (rep.size * 2)); | ||
| 212 | |||
| 213 | if (nbytes > nbytesRead) | ||
| 214 | _XEatData (dpy, (unsigned long) (nbytes - nbytesRead)); | ||
| 215 | |||
| 216 | out: | ||
| 217 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 218 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 219 | return crtc_gamma; | ||
| 220 | } | ||
| 221 | |||
| 222 | XRRCrtcGamma * | ||
| 223 | XRRAllocGamma (int size) | ||
| 224 | { | ||
| 225 | XRRCrtcGamma *crtc_gamma; | ||
| 226 | |||
| 227 | crtc_gamma = Xmalloc (sizeof (XRRCrtcGamma) +malloc(((sizeof (XRRCrtcGamma) + sizeof (crtc_gamma->red[0 ]) * size * 3) == 0 ? 1 : (sizeof (XRRCrtcGamma) + sizeof (crtc_gamma ->red[0]) * size * 3))) | ||
| 228 | sizeof (crtc_gamma->red[0]) * size * 3)malloc(((sizeof (XRRCrtcGamma) + sizeof (crtc_gamma->red[0 ]) * size * 3) == 0 ? 1 : (sizeof (XRRCrtcGamma) + sizeof (crtc_gamma ->red[0]) * size * 3))); | ||
| 229 | if (!crtc_gamma) | ||
| 230 | return NULL((void*)0); | ||
| 231 | crtc_gamma->size = size; | ||
| 232 | crtc_gamma->red = (unsigned short *) (crtc_gamma + 1); | ||
| 233 | crtc_gamma->green = crtc_gamma->red + size; | ||
| 234 | crtc_gamma->blue = crtc_gamma->green + size; | ||
| 235 | return crtc_gamma; | ||
| 236 | } | ||
| 237 | |||
| 238 | void | ||
| 239 | XRRSetCrtcGamma (Display *dpy, RRCrtc crtc, XRRCrtcGamma *crtc_gamma) | ||
| 240 | { | ||
| 241 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 242 | xRRSetCrtcGammaReq *req; | ||
| 243 | |||
| 244 | RRSimpleCheckExtension (dpy, info)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return; }; | ||
| 245 | |||
| 246 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 247 | GetReq (RRSetCrtcGamma, req)req = (xRRSetCrtcGammaReq *) _XGetRequest(dpy, 24, 12); | ||
| 248 | req->reqType = info->codes->major_opcode; | ||
| 249 | req->randrReqType = X_RRSetCrtcGamma24; | ||
| 250 | req->crtc = crtc; | ||
| 251 | req->size = crtc_gamma->size; | ||
| 252 | req->length += (crtc_gamma->size * 2 * 3 + 3) >> 2; | ||
| 253 | /* | ||
| 254 | * Note this assumes the structure was allocated with XRRAllocGamma, | ||
| 255 | * otherwise the channels might not be contiguous | ||
| 256 | */ | ||
| 257 | Data16 (dpy, crtc_gamma->red, crtc_gamma->size * 2 * 3){ if ((dpy)->bufptr + ((crtc_gamma->size * 2 * 3)) <= (dpy)->bufmax) { memcpy((dpy)->bufptr, (char *)(crtc_gamma ->red), (int)(crtc_gamma->size * 2 * 3)); (dpy)->bufptr += (((crtc_gamma->size * 2 * 3)) + 3) & ~3; } else _XSend ((dpy), (char *)(crtc_gamma->red), (crtc_gamma->size * 2 * 3)); }; | ||
| 258 | |||
| 259 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 260 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 261 | } | ||
| 262 | |||
| 263 | void | ||
| 264 | XRRFreeGamma (XRRCrtcGamma *crtc_gamma) | ||
| 265 | { | ||
| 266 | Xfree (crtc_gamma)free((crtc_gamma)); | ||
| 267 | } | ||
| 268 | |||
| 269 | /* Version 1.3 additions */ | ||
| 270 | |||
| 271 | static void | ||
| 272 | XTransform_from_xRenderTransform (XTransform *x, | ||
| 273 | xRenderTransform *render) | ||
| 274 | { | ||
| 275 | x->matrix[0][0] = render->matrix11; | ||
| 276 | x->matrix[0][1] = render->matrix12; | ||
| 277 | x->matrix[0][2] = render->matrix13; | ||
| 278 | |||
| 279 | x->matrix[1][0] = render->matrix21; | ||
| 280 | x->matrix[1][1] = render->matrix22; | ||
| 281 | x->matrix[1][2] = render->matrix23; | ||
| 282 | |||
| 283 | x->matrix[2][0] = render->matrix31; | ||
| 284 | x->matrix[2][1] = render->matrix32; | ||
| 285 | x->matrix[2][2] = render->matrix33; | ||
| 286 | } | ||
| 287 | |||
| 288 | static void | ||
| 289 | xRenderTransform_from_XTransform (xRenderTransform *render, | ||
| 290 | XTransform *x) | ||
| 291 | { | ||
| 292 | render->matrix11 = x->matrix[0][0]; | ||
| 293 | render->matrix12 = x->matrix[0][1]; | ||
| 294 | render->matrix13 = x->matrix[0][2]; | ||
| 295 | |||
| 296 | render->matrix21 = x->matrix[1][0]; | ||
| 297 | render->matrix22 = x->matrix[1][1]; | ||
| 298 | render->matrix23 = x->matrix[1][2]; | ||
| 299 | |||
| 300 | render->matrix31 = x->matrix[2][0]; | ||
| 301 | render->matrix32 = x->matrix[2][1]; | ||
| 302 | render->matrix33 = x->matrix[2][2]; | ||
| 303 | } | ||
| 304 | |||
| 305 | void | ||
| 306 | XRRSetCrtcTransform (Display *dpy, | ||
| 307 | RRCrtc crtc, | ||
| 308 | XTransform *transform, | ||
| 309 | char *filter, | ||
| 310 | XFixed *params, | ||
| 311 | int nparams) | ||
| 312 | { | ||
| 313 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 314 | xRRSetCrtcTransformReq *req; | ||
| 315 | int nbytes = strlen (filter); | ||
| 316 | |||
| 317 | RRSimpleCheckExtension (dpy, info)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return; }; | ||
| 318 | |||
| 319 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 320 | GetReq (RRSetCrtcTransform, req)req = (xRRSetCrtcTransformReq *) _XGetRequest(dpy, 26, 48); | ||
| 321 | req->reqType = info->codes->major_opcode; | ||
| 322 | req->randrReqType = X_RRSetCrtcTransform26; | ||
| 323 | req->crtc = crtc; | ||
| 324 | |||
| 325 | xRenderTransform_from_XTransform (&req->transform, transform); | ||
| 326 | |||
| 327 | req->nbytesFilter = nbytes; | ||
| 328 | req->length += ((nbytes + 3) >> 2) + nparams; | ||
| 329 | Data (dpy, filter, nbytes){ if (dpy->bufptr + (nbytes) <= dpy->bufmax) { memcpy (dpy->bufptr, filter, (int)nbytes); dpy->bufptr += ((nbytes ) + 3) & ~3; } else _XSend(dpy, filter, nbytes); }; | ||
| 330 | Data32 (dpy, params, nparams << 2){ if ((dpy)->bufptr + ((nparams << 2)) <= (dpy)-> bufmax) { memcpy((dpy)->bufptr, (char *)(params), (int)(nparams << 2)); (dpy)->bufptr += (((nparams << 2)) + 3 ) & ~3; } else _XSend((dpy), (char *)(params), (nparams << 2)); }; | ||
| 331 | |||
| 332 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 333 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 334 | } | ||
| 335 | |||
| 336 | #define CrtcTransformExtra(96 - 32) (SIZEOF(xRRGetCrtcTransformReply)96 - 32) | ||
| 337 | |||
| 338 | static const xRenderTransform identity = { | ||
| 339 | 0x10000, 0, 0, | ||
| 340 | 0, 0x10000, 0, | ||
| 341 | 0, 0, 0x10000, | ||
| 342 | }; | ||
| 343 | |||
| 344 | static Boolint | ||
| 345 | _XRRHasTransform (int major, int minor) | ||
| 346 | { | ||
| 347 | return major > 1 || (major == 1 && minor >= 3); | ||
| 348 | } | ||
| 349 | |||
| 350 | Statusint | ||
| 351 | XRRGetCrtcTransform (Display *dpy, | ||
| 352 | RRCrtc crtc, | ||
| 353 | XRRCrtcTransformAttributes **attributes) | ||
| 354 | { | ||
| 355 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 356 | xRRGetCrtcTransformReply rep; | ||
| 357 | xRRGetCrtcTransformReq *req; | ||
| 358 | int major_version, minor_version; | ||
| 359 | XRRCrtcTransformAttributes *attr; | ||
| 360 | char *extra = NULL((void*)0), *e; | ||
| 361 | int p; | ||
| 362 | |||
| 363 | *attributes = NULL((void*)0); | ||
| 364 | |||
| 365 | RRCheckExtension (dpy, info, False)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return 0; }; | ||
| 366 | |||
| 367 | if (!XRRQueryVersion (dpy, &major_version, &minor_version) || | ||
| |||
| 368 | !_XRRHasTransform (major_version, minor_version)) | ||
| 369 | { | ||
| 370 | /* For pre-1.3 servers, just report identity matrices everywhere */ | ||
| 371 | rep.pendingTransform = identity; | ||
| 372 | rep.pendingNbytesFilter = 0; | ||
| 373 | rep.pendingNparamsFilter = 0; | ||
| 374 | rep.currentTransform = identity; | ||
| 375 | rep.currentNbytesFilter = 0; | ||
| 376 | rep.currentNparamsFilter = 0; | ||
| 377 | } | ||
| 378 | else | ||
| 379 | { | ||
| 380 | LockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 381 | GetReq (RRGetCrtcTransform, req)req = (xRRGetCrtcTransformReq *) _XGetRequest(dpy, 27, 8); | ||
| 382 | req->reqType = info->codes->major_opcode; | ||
| 383 | req->randrReqType = X_RRGetCrtcTransform27; | ||
| 384 | req->crtc = crtc; | ||
| 385 | |||
| 386 | if (!_XReply (dpy, (xReply *) &rep, CrtcTransformExtra(96 - 32) >> 2, xFalse0)) | ||
| |||
| 387 | { | ||
| 388 | rep.pendingTransform = identity; | ||
| 389 | rep.pendingNbytesFilter = 0; | ||
| 390 | rep.pendingNparamsFilter = 0; | ||
| 391 | rep.currentTransform = identity; | ||
| 392 | rep.currentNbytesFilter = 0; | ||
| 393 | rep.currentNparamsFilter = 0; | ||
| 394 | } | ||
| 395 | else | ||
| 396 | { | ||
| 397 | int extraBytes = rep.length * 4 - CrtcTransformExtra(96 - 32); | ||
| 398 | extra = Xmalloc (extraBytes)malloc(((extraBytes) == 0 ? 1 : (extraBytes))); | ||
| 399 | if (!extra) { | ||
| 400 | _XEatData (dpy, extraBytes); | ||
| 401 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 402 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 403 | return False0; | ||
| 404 | } | ||
| 405 | _XRead (dpy, extra, extraBytes); | ||
| 406 | } | ||
| 407 | |||
| 408 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 409 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 410 | } | ||
| 411 | |||
| 412 | attr = Xmalloc (sizeof (XRRCrtcTransformAttributes) +malloc(((sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ) == 0 ? 1 : (sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ))) | ||
| 413 | rep.pendingNparamsFilter * sizeof (XFixed) +malloc(((sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ) == 0 ? 1 : (sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ))) | ||
| 414 | rep.currentNparamsFilter * sizeof (XFixed) +malloc(((sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ) == 0 ? 1 : (sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ))) | ||
| 415 | rep.pendingNbytesFilter + 1 +malloc(((sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ) == 0 ? 1 : (sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ))) | ||
| 416 | rep.currentNbytesFilter + 1)malloc(((sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ) == 0 ? 1 : (sizeof (XRRCrtcTransformAttributes) + rep.pendingNparamsFilter * sizeof (XFixed) + rep.currentNparamsFilter * sizeof (XFixed ) + rep.pendingNbytesFilter + 1 + rep.currentNbytesFilter + 1 ))); | ||
| 417 | |||
| 418 | if (!attr) { | ||
| |||
| |||
| 419 | XFree (extra); | ||
| 420 | return False0; | ||
| 421 | } | ||
| 422 | XTransform_from_xRenderTransform (&attr->pendingTransform, &rep.pendingTransform); | ||
| 423 | XTransform_from_xRenderTransform (&attr->currentTransform, &rep.currentTransform); | ||
| 424 | |||
| 425 | attr->pendingParams = (XFixed *) (attr + 1); | ||
| 426 | attr->currentParams = attr->pendingParams + rep.pendingNparamsFilter; | ||
| 427 | attr->pendingFilter = (char *) (attr->currentParams + rep.currentNparamsFilter); | ||
| 428 | attr->currentFilter = attr->pendingFilter + rep.pendingNbytesFilter + 1; | ||
| 429 | |||
| 430 | e = extra; | ||
| 431 | |||
| 432 | memcpy (attr->pendingFilter, e, rep.pendingNbytesFilter); | ||
| |||
| 433 | attr->pendingFilter[rep.pendingNbytesFilter] = '\0'; | ||
| 434 | e += (rep.pendingNbytesFilter + 3) & ~3; | ||
| 435 | for (p = 0; p < rep.pendingNparamsFilter; p++) { | ||
| 436 | INT32 f; | ||
| 437 | memcpy (&f, e, 4); | ||
| 438 | e += 4; | ||
| 439 | attr->pendingParams[p] = (XFixed) f; | ||
| 440 | } | ||
| 441 | attr->pendingNparams = rep.pendingNparamsFilter; | ||
| 442 | |||
| 443 | memcpy (attr->currentFilter, e, rep.currentNbytesFilter); | ||
| 444 | attr->currentFilter[rep.currentNbytesFilter] = '\0'; | ||
| 445 | e += (rep.currentNbytesFilter + 3) & ~3; | ||
| 446 | for (p = 0; p < rep.currentNparamsFilter; p++) { | ||
| 447 | INT32 f; | ||
| 448 | memcpy (&f, e, 4); | ||
| 449 | e += 4; | ||
| 450 | attr->currentParams[p] = (XFixed) f; | ||
| 451 | } | ||
| 452 | attr->currentNparams = rep.currentNparamsFilter; | ||
| 453 | |||
| 454 | if (extra) | ||
| 455 | XFree (extra); | ||
| 456 | *attributes = attr; | ||
| 457 | |||
| 458 | return True1; | ||
| 459 | } | ||
| 460 | |||
| 461 | XRRPanning * | ||
| 462 | XRRGetPanning (Display *dpy, XRRScreenResources *resources, RRCrtc crtc) | ||
| 463 | { | ||
| 464 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 465 | xRRGetPanningReply rep; | ||
| 466 | xRRGetPanningReq *req; | ||
| 467 | XRRPanning *xp; | ||
| 468 | |||
| 469 | RRCheckExtension (dpy, info, NULL)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return ((void*)0); }; | ||
| 470 | |||
| 471 | LockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 472 | GetReq (RRGetPanning, req)req = (xRRGetPanningReq *) _XGetRequest(dpy, 28, 8); | ||
| 473 | req->reqType = info->codes->major_opcode; | ||
| 474 | req->randrReqType = X_RRGetPanning28; | ||
| 475 | req->crtc = crtc; | ||
| 476 | |||
| 477 | if (!_XReply (dpy, (xReply *) &rep, 1, xFalse0)) | ||
| 478 | { | ||
| 479 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 480 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 481 | return NULL((void*)0); | ||
| 482 | } | ||
| 483 | |||
| 484 | if (! (xp = (XRRPanning *) Xmalloc(sizeof(XRRPanning))malloc(((sizeof(XRRPanning)) == 0 ? 1 : (sizeof(XRRPanning))) )) ) { | ||
| 485 | _XEatData (dpy, sizeof(XRRPanning)); | ||
| 486 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 487 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 488 | return NULL((void*)0); | ||
| 489 | } | ||
| 490 | |||
| 491 | xp->timestamp = rep.timestamp; | ||
| 492 | xp->left = rep.left; | ||
| 493 | xp->top = rep.top; | ||
| 494 | xp->width = rep.width; | ||
| 495 | xp->height = rep.height; | ||
| 496 | xp->track_left = rep.track_left; | ||
| 497 | xp->track_top = rep.track_top; | ||
| 498 | xp->track_width = rep.track_width; | ||
| 499 | xp->track_height = rep.track_height; | ||
| 500 | xp->border_left = rep.border_left; | ||
| 501 | xp->border_top = rep.border_top; | ||
| 502 | xp->border_right = rep.border_right; | ||
| 503 | xp->border_bottom = rep.border_bottom; | ||
| 504 | |||
| 505 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 506 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 507 | return (XRRPanning *) xp; | ||
| 508 | } | ||
| 509 | |||
| 510 | void | ||
| 511 | XRRFreePanning (XRRPanning *panning) | ||
| 512 | { | ||
| 513 | Xfree (panning)free((panning)); | ||
| 514 | } | ||
| 515 | |||
| 516 | Statusint | ||
| 517 | XRRSetPanning (Display *dpy, | ||
| 518 | XRRScreenResources *resources, | ||
| 519 | RRCrtc crtc, | ||
| 520 | XRRPanning *panning) | ||
| 521 | { | ||
| 522 | XExtDisplayInfo *info = XRRFindDisplay(dpy); | ||
| 523 | xRRSetPanningReply rep; | ||
| 524 | xRRSetPanningReq *req; | ||
| 525 | |||
| 526 | RRCheckExtension (dpy, info, 0)if (!((info) && ((info)->codes))) { XMissingExtension (dpy, XRRExtensionName); return 0; }; | ||
| 527 | |||
| 528 | LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display )(dpy); | ||
| 529 | GetReq (RRSetPanning, req)req = (xRRSetPanningReq *) _XGetRequest(dpy, 29, 36); | ||
| 530 | req->reqType = info->codes->major_opcode; | ||
| 531 | req->randrReqType = X_RRSetPanning29; | ||
| 532 | req->crtc = crtc; | ||
| 533 | req->timestamp = panning->timestamp; | ||
| 534 | req->left = panning->left; | ||
| 535 | req->top = panning->top; | ||
| 536 | req->width = panning->width; | ||
| 537 | req->height = panning->height; | ||
| 538 | req->track_left = panning->track_left; | ||
| 539 | req->track_top = panning->track_top; | ||
| 540 | req->track_width = panning->track_width; | ||
| 541 | req->track_height = panning->track_height; | ||
| 542 | req->border_left = panning->border_left; | ||
| 543 | req->border_top = panning->border_top; | ||
| 544 | req->border_right = panning->border_right; | ||
| 545 | req->border_bottom = panning->border_bottom; | ||
| 546 | |||
| 547 | if (!_XReply (dpy, (xReply *) &rep, 0, xFalse0)) | ||
| 548 | rep.status = RRSetConfigFailed3; | ||
| 549 | UnlockDisplay (dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display )(dpy); | ||
| 550 | SyncHandle ()if (dpy->synchandler) (*dpy->synchandler)(dpy); | ||
| 551 | return rep.status; | ||
| 552 | } | ||
| 553 |