1/* 2 * Copyright © 2000 Compaq Computer Corporation 3 * Copyright © 2002 Hewlett-Packard Company 4 * Copyright © 2006 Intel Corporation 5 * Copyright © 2008 Red Hat, Inc. 6 * 7 * Permission to use, copy, modify, distribute, and sell this software and its 8 * documentation for any purpose is hereby granted without fee, provided that 9 * the above copyright notice appear in all copies and that both that copyright 10 * notice and this permission notice appear in supporting documentation, and 11 * that the name of the copyright holders not be used in advertising or 12 * publicity pertaining to distribution of the software without specific, 13 * written prior permission. The copyright holders make no representations 14 * about the suitability of this software for any purpose. It is provided "as 15 * is" without express or implied warranty. 16 * 17 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 19 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 20 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 22 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 23 * OF THIS SOFTWARE. 24 * 25 * Author: Jim Gettys, Hewlett-Packard Company, Inc. 26 * Keith Packard, Intel Corporation 27 */ 28 29#ifdef HAVE_DIX_CONFIG_H 30#include <dix-config.h> 31#endif 32 33#ifndef _RANDRSTR_H_ 34#define _RANDRSTR_H_ 35 36#include <X11/X.h> 37#include <X11/Xproto.h> 38#include "misc.h" 39#include "os.h" 40#include "dixstruct.h" 41#include "resource.h" 42#include "scrnintstr.h" 43#include "windowstr.h" 44#include "pixmapstr.h" 45#include "extnsionst.h" 46#include "servermd.h" 47#include "rrtransform.h" 48#include <X11/extensions/randr.h> 49#include <X11/extensions/randrproto.h> 50#include <X11/extensions/render.h> /* we share subpixel order information */ 51#include "picturestr.h" 52#include <X11/Xfuncproto.h> 53 54/* required for ABI compatibility for now */ 55#define RANDR_10_INTERFACE 1 56#define RANDR_12_INTERFACE 1 57#define RANDR_13_INTERFACE 1 /* requires RANDR_12_INTERFACE */ 58#define RANDR_GET_CRTC_INTERFACE 1 59 60#define RANDR_INTERFACE_VERSION 0x0103 61 62typedef XID RRMode; 63typedef XID RROutput; 64typedef XID RRCrtc; 65 66extern _X_EXPORT int RREventBase, RRErrorBase; 67 68extern _X_EXPORT int (*ProcRandrVector[RRNumberRequests])(ClientPtr); 69extern _X_EXPORT int (*SProcRandrVector[RRNumberRequests])(ClientPtr); 70 71/* 72 * Modeline for a monitor. Name follows directly after this struct 73 */ 74 75#define RRModeName(pMode) ((char *) (pMode + 1)) 76typedef struct _rrMode RRModeRec, *RRModePtr; 77typedef struct _rrPropertyValue RRPropertyValueRec, *RRPropertyValuePtr; 78typedef struct _rrProperty RRPropertyRec, *RRPropertyPtr; 79typedef struct _rrCrtc RRCrtcRec, *RRCrtcPtr; 80typedef struct _rrOutput RROutputRec, *RROutputPtr; 81 82struct _rrMode { 83 int refcnt; 84 xRRModeInfo mode; 85 char *name; 86 ScreenPtr userScreen; 87}; 88 89struct _rrPropertyValue { 90 Atom type; /* ignored by server */ 91 short format; /* format of data for swapping - 8,16,32 */ 92 long size; /* size of data in (format/8) bytes */ 93 pointer data; /* private to client */ 94}; 95 96struct _rrProperty { 97 RRPropertyPtr next; 98 ATOM propertyName; 99 Bool is_pending; 100 Bool range; 101 Bool immutable; 102 int num_valid; 103 INT32 *valid_values; 104 RRPropertyValueRec current, pending; 105}; 106 107struct _rrCrtc { 108 RRCrtc id; 109 ScreenPtr pScreen; 110 RRModePtr mode; 111 int x, y; 112 Rotation rotation; 113 Rotation rotations; 114 Bool changed; 115 int numOutputs; 116 RROutputPtr *outputs; 117 int gammaSize; 118 CARD16 *gammaRed; 119 CARD16 *gammaBlue; 120 CARD16 *gammaGreen; 121 void *devPrivate; 122 Bool transforms; 123 RRTransformRec client_pending_transform; 124 RRTransformRec client_current_transform; 125 PictTransform transform; 126 struct pict_f_transform f_transform; 127 struct pict_f_transform f_inverse; 128}; 129 130struct _rrOutput { 131 RROutput id; 132 ScreenPtr pScreen; 133 char *name; 134 int nameLength; 135 CARD8 connection; 136 CARD8 subpixelOrder; 137 int mmWidth; 138 int mmHeight; 139 RRCrtcPtr crtc; 140 int numCrtcs; 141 RRCrtcPtr *crtcs; 142 int numClones; 143 RROutputPtr *clones; 144 int numModes; 145 int numPreferred; 146 RRModePtr *modes; 147 int numUserModes; 148 RRModePtr *userModes; 149 Bool changed; 150 RRPropertyPtr properties; 151 Bool pendingProperties; 152 void *devPrivate; 153}; 154 155#if RANDR_12_INTERFACE 156typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen, 157 CARD16 width, 158 CARD16 height, 159 CARD32 mmWidth, 160 CARD32 mmHeight); 161 162typedef Bool (*RRCrtcSetProcPtr) (ScreenPtr pScreen, 163 RRCrtcPtr crtc, 164 RRModePtr mode, 165 int x, 166 int y, 167 Rotation rotation, 168 int numOutputs, 169 RROutputPtr *outputs); 170 171typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr pScreen, 172 RRCrtcPtr crtc); 173 174typedef Bool (*RRCrtcGetGammaProcPtr) (ScreenPtr pScreen, 175 RRCrtcPtr crtc); 176 177typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr pScreen, 178 RROutputPtr output, 179 Atom property, 180 RRPropertyValuePtr value); 181 182typedef Bool (*RROutputValidateModeProcPtr) (ScreenPtr pScreen, 183 RROutputPtr output, 184 RRModePtr mode); 185 186typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, 187 RRModePtr mode); 188 189#endif 190 191#if RANDR_13_INTERFACE 192typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen, 193 RROutputPtr output, 194 Atom property); 195typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn, 196 RRCrtcPtr crtc, 197 BoxPtr totalArea, 198 BoxPtr trackingArea, 199 INT16 *border); 200typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn, 201 RRCrtcPtr crtc, 202 BoxPtr totalArea, 203 BoxPtr trackingArea, 204 INT16 *border); 205 206#endif /* RANDR_13_INTERFACE */ 207 208typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations); 209typedef Bool (*RRCloseScreenProcPtr) ( int i, ScreenPtr pscreen); 210 211/* These are for 1.0 compatibility */ 212 213typedef struct _rrRefresh { 214 CARD16 rate; 215 RRModePtr mode; 216} RRScreenRate, *RRScreenRatePtr; 217 218typedef struct _rrScreenSize { 219 int id; 220 short width, height; 221 short mmWidth, mmHeight; 222 int nRates; 223 RRScreenRatePtr pRates; 224} RRScreenSize, *RRScreenSizePtr; 225 226#ifdef RANDR_10_INTERFACE 227 228typedef Bool (*RRSetConfigProcPtr) (ScreenPtr pScreen, 229 Rotation rotation, 230 int rate, 231 RRScreenSizePtr pSize); 232 233#endif 234 235 236typedef struct _rrScrPriv { 237 /* 238 * 'public' part of the structure; DDXen fill this in 239 * as they initialize 240 */ 241#if RANDR_10_INTERFACE 242 RRSetConfigProcPtr rrSetConfig; 243#endif 244 RRGetInfoProcPtr rrGetInfo; 245#if RANDR_12_INTERFACE 246 RRScreenSetSizeProcPtr rrScreenSetSize; 247 RRCrtcSetProcPtr rrCrtcSet; 248 RRCrtcSetGammaProcPtr rrCrtcSetGamma; 249 RRCrtcGetGammaProcPtr rrCrtcGetGamma; 250 RROutputSetPropertyProcPtr rrOutputSetProperty; 251 RROutputValidateModeProcPtr rrOutputValidateMode; 252 RRModeDestroyProcPtr rrModeDestroy; 253#endif 254#if RANDR_13_INTERFACE 255 RROutputGetPropertyProcPtr rrOutputGetProperty; 256 RRGetPanningProcPtr rrGetPanning; 257 RRSetPanningProcPtr rrSetPanning; 258#endif 259 260 /* 261 * Private part of the structure; not considered part of the ABI 262 */ 263 TimeStamp lastSetTime; /* last changed by client */ 264 TimeStamp lastConfigTime; /* possible configs changed */ 265 RRCloseScreenProcPtr CloseScreen; 266 267 Bool changed; /* some config changed */ 268 Bool configChanged; /* configuration changed */ 269 Bool layoutChanged; /* screen layout changed */ 270 271 CARD16 minWidth, minHeight; 272 CARD16 maxWidth, maxHeight; 273 CARD16 width, height; /* last known screen size */ 274 CARD16 mmWidth, mmHeight; /* last known screen size */ 275 276 int numOutputs; 277 RROutputPtr *outputs; 278 RROutputPtr primaryOutput; 279 280 int numCrtcs; 281 RRCrtcPtr *crtcs; 282 283 /* Last known pointer position */ 284 RRCrtcPtr pointerCrtc; 285 286#ifdef RANDR_10_INTERFACE 287 /* 288 * Configuration information 289 */ 290 Rotation rotations; 291 CARD16 reqWidth, reqHeight; 292 293 int nSizes; 294 RRScreenSizePtr pSizes; 295 296 Rotation rotation; 297 int rate; 298 int size; 299#endif 300} rrScrPrivRec, *rrScrPrivPtr; 301 302extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec; 303#define rrPrivKey (&rrPrivKeyRec) 304 305#define rrGetScrPriv(pScr) ((rrScrPrivPtr)dixLookupPrivate(&(pScr)->devPrivates, rrPrivKey)) 306#define rrScrPriv(pScr) rrScrPrivPtr pScrPriv = rrGetScrPriv(pScr) 307#define SetRRScreen(s,p) dixSetPrivate(&(s)->devPrivates, rrPrivKey, p) 308 309/* 310 * each window has a list of clients requesting 311 * RRNotify events. Each client has a resource 312 * for each window it selects RRNotify input for, 313 * this resource is used to delete the RRNotifyRec 314 * entry from the per-window queue. 315 */ 316 317typedef struct _RREvent *RREventPtr; 318 319typedef struct _RREvent { 320 RREventPtr next; 321 ClientPtr client; 322 WindowPtr window; 323 XID clientResource; 324 int mask; 325} RREventRec; 326 327typedef struct _RRTimes { 328 TimeStamp setTime; 329 TimeStamp configTime; 330} RRTimesRec, *RRTimesPtr; 331 332typedef struct _RRClient { 333 int major_version; 334 int minor_version; 335/* RRTimesRec times[0]; */ 336} RRClientRec, *RRClientPtr; 337 338extern _X_EXPORT RESTYPE RRClientType, RREventType; /* resource types for event masks */ 339extern _X_EXPORT DevPrivateKeyRec RRClientPrivateKeyRec; 340#define RRClientPrivateKey (&RRClientPrivateKeyRec) 341extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType; 342 343#define VERIFY_RR_OUTPUT(id, ptr, a)\ 344 {\ 345 int rc = dixLookupResourceByType((pointer *)&(ptr), id,\ 346 RROutputType, client, a);\ 347 if (rc != Success) {\ 348 client->errorValue = id;\ 349 return rc;\ 350 }\ 351 } 352 353#define VERIFY_RR_CRTC(id, ptr, a)\ 354 {\ 355 int rc = dixLookupResourceByType((pointer *)&(ptr), id,\ 356 RRCrtcType, client, a);\ 357 if (rc != Success) {\ 358 client->errorValue = id;\ 359 return rc;\ 360 }\ 361 } 362 363#define VERIFY_RR_MODE(id, ptr, a)\ 364 {\ 365 int rc = dixLookupResourceByType((pointer *)&(ptr), id,\ 366 RRModeType, client, a);\ 367 if (rc != Success) {\ 368 client->errorValue = id;\ 369 return rc;\ 370 }\ 371 } 372 373#define GetRRClient(pClient) ((RRClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RRClientPrivateKey)) 374#define rrClientPriv(pClient) RRClientPtr pRRClient = GetRRClient(pClient) 375 376/* Initialize the extension */ 377extern _X_EXPORT void 378RRExtensionInit (void); 379 380#ifdef RANDR_12_INTERFACE 381/* 382 * Set the range of sizes for the screen 383 */ 384extern _X_EXPORT void 385RRScreenSetSizeRange (ScreenPtr pScreen, 386 CARD16 minWidth, 387 CARD16 minHeight, 388 CARD16 maxWidth, 389 CARD16 maxHeight); 390#endif 391 392/* rrscreen.c */ 393/* 394 * Notify the extension that the screen size has been changed. 395 * The driver is responsible for calling this whenever it has changed 396 * the size of the screen 397 */ 398extern _X_EXPORT void 399RRScreenSizeNotify (ScreenPtr pScreen); 400 401/* 402 * Request that the screen be resized 403 */ 404extern _X_EXPORT Bool 405RRScreenSizeSet (ScreenPtr pScreen, 406 CARD16 width, 407 CARD16 height, 408 CARD32 mmWidth, 409 CARD32 mmHeight); 410 411/* 412 * Send ConfigureNotify event to root window when 'something' happens 413 */ 414extern _X_EXPORT void 415RRSendConfigNotify (ScreenPtr pScreen); 416 417/* 418 * screen dispatch 419 */ 420extern _X_EXPORT int 421ProcRRGetScreenSizeRange (ClientPtr client); 422 423extern _X_EXPORT int 424ProcRRSetScreenSize (ClientPtr client); 425 426extern _X_EXPORT int 427ProcRRGetScreenResources (ClientPtr client); 428 429extern _X_EXPORT int 430ProcRRGetScreenResourcesCurrent (ClientPtr client); 431 432extern _X_EXPORT int 433ProcRRSetScreenConfig (ClientPtr client); 434 435extern _X_EXPORT int 436ProcRRGetScreenInfo (ClientPtr client); 437 438/* 439 * Deliver a ScreenNotify event 440 */ 441extern _X_EXPORT void 442RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen); 443 444/* randr.c */ 445/* 446 * Send all pending events 447 */ 448extern _X_EXPORT void 449RRTellChanged (ScreenPtr pScreen); 450 451extern _X_EXPORT void 452RRSetChanged (ScreenPtr pScreen); 453 454/* 455 * Poll the driver for changed information 456 */ 457extern _X_EXPORT Bool 458RRGetInfo (ScreenPtr pScreen, Bool force_query); 459 460extern _X_EXPORT Bool RRInit (void); 461 462extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen); 463 464extern _X_EXPORT RROutputPtr 465RRFirstOutput (ScreenPtr pScreen); 466 467extern _X_EXPORT CARD16 468RRVerticalRefresh (xRRModeInfo *mode); 469 470#ifdef RANDR_10_INTERFACE 471/* 472 * This is the old interface, deprecated but left 473 * around for compatibility 474 */ 475 476/* 477 * Then, register the specific size with the screen 478 */ 479 480extern _X_EXPORT RRScreenSizePtr 481RRRegisterSize (ScreenPtr pScreen, 482 short width, 483 short height, 484 short mmWidth, 485 short mmHeight); 486 487extern _X_EXPORT Bool 488RRRegisterRate (ScreenPtr pScreen, 489 RRScreenSizePtr pSize, 490 int rate); 491 492/* 493 * Finally, set the current configuration of the screen 494 */ 495 496extern _X_EXPORT void 497RRSetCurrentConfig (ScreenPtr pScreen, 498 Rotation rotation, 499 int rate, 500 RRScreenSizePtr pSize); 501 502extern _X_EXPORT Rotation 503RRGetRotation (ScreenPtr pScreen); 504 505#endif 506 507/* rrcrtc.c */ 508 509/* 510 * Notify the CRTC of some change; layoutChanged indicates that 511 * some position or size element changed 512 */ 513extern _X_EXPORT void 514RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged); 515 516/* 517 * Create a CRTC 518 */ 519extern _X_EXPORT RRCrtcPtr 520RRCrtcCreate (ScreenPtr pScreen, void *devPrivate); 521 522/* 523 * Set the allowed rotations on a CRTC 524 */ 525extern _X_EXPORT void 526RRCrtcSetRotations (RRCrtcPtr crtc, Rotation rotations); 527 528/* 529 * Set whether transforms are allowed on a CRTC 530 */ 531extern _X_EXPORT void 532RRCrtcSetTransformSupport (RRCrtcPtr crtc, Bool transforms); 533 534/* 535 * Notify the extension that the Crtc has been reconfigured, 536 * the driver calls this whenever it has updated the mode 537 */ 538extern _X_EXPORT Bool 539RRCrtcNotify (RRCrtcPtr crtc, 540 RRModePtr mode, 541 int x, 542 int y, 543 Rotation rotation, 544 RRTransformPtr transform, 545 int numOutputs, 546 RROutputPtr *outputs); 547 548extern _X_EXPORT void 549RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc); 550 551/* 552 * Request that the Crtc be reconfigured 553 */ 554extern _X_EXPORT Bool 555RRCrtcSet (RRCrtcPtr crtc, 556 RRModePtr mode, 557 int x, 558 int y, 559 Rotation rotation, 560 int numOutput, 561 RROutputPtr *outputs); 562 563/* 564 * Request that the Crtc gamma be changed 565 */ 566 567extern _X_EXPORT Bool 568RRCrtcGammaSet (RRCrtcPtr crtc, 569 CARD16 *red, 570 CARD16 *green, 571 CARD16 *blue); 572 573/* 574 * Request current gamma back from the DDX (if possible). 575 * This includes gamma size. 576 */ 577 578extern _X_EXPORT Bool 579RRCrtcGammaGet(RRCrtcPtr crtc); 580 581/* 582 * Notify the extension that the Crtc gamma has been changed 583 * The driver calls this whenever it has changed the gamma values 584 * in the RRCrtcRec 585 */ 586 587extern _X_EXPORT Bool 588RRCrtcGammaNotify (RRCrtcPtr crtc); 589 590/* 591 * Set the size of the gamma table at server startup time 592 */ 593 594extern _X_EXPORT Bool 595RRCrtcGammaSetSize (RRCrtcPtr crtc, 596 int size); 597 598/* 599 * Return the area of the frame buffer scanned out by the crtc, 600 * taking into account the current mode and rotation 601 */ 602 603extern _X_EXPORT void 604RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height); 605 606/* 607 * Return crtc transform 608 */ 609extern _X_EXPORT RRTransformPtr 610RRCrtcGetTransform (RRCrtcPtr crtc); 611 612/* 613 * Check whether the pending and current transforms are the same 614 */ 615extern _X_EXPORT Bool 616RRCrtcPendingTransform (RRCrtcPtr crtc); 617 618/* 619 * Destroy a Crtc at shutdown 620 */ 621extern _X_EXPORT void 622RRCrtcDestroy (RRCrtcPtr crtc); 623 624 625/* 626 * Set the pending CRTC transformation 627 */ 628 629extern _X_EXPORT int 630RRCrtcTransformSet (RRCrtcPtr crtc, 631 PictTransformPtr transform, 632 struct pict_f_transform *f_transform, 633 struct pict_f_transform *f_inverse, 634 char *filter, 635 int filter_len, 636 xFixed *params, 637 int nparams); 638 639/* 640 * Initialize crtc type 641 */ 642extern _X_EXPORT Bool 643RRCrtcInit (void); 644 645/* 646 * Initialize crtc type error value 647 */ 648extern _X_EXPORT void 649RRCrtcInitErrorValue (void); 650 651/* 652 * Crtc dispatch 653 */ 654 655extern _X_EXPORT int 656ProcRRGetCrtcInfo (ClientPtr client); 657 658extern _X_EXPORT int 659ProcRRSetCrtcConfig (ClientPtr client); 660 661extern _X_EXPORT int 662ProcRRGetCrtcGammaSize (ClientPtr client); 663 664extern _X_EXPORT int 665ProcRRGetCrtcGamma (ClientPtr client); 666 667extern _X_EXPORT int 668ProcRRSetCrtcGamma (ClientPtr client); 669 670extern _X_EXPORT int 671ProcRRSetCrtcTransform (ClientPtr client); 672 673extern _X_EXPORT int 674ProcRRGetCrtcTransform (ClientPtr client); 675 676int 677ProcRRGetPanning (ClientPtr client); 678 679int 680ProcRRSetPanning (ClientPtr client); 681 682/* rrdispatch.c */ 683extern _X_EXPORT Bool 684RRClientKnowsRates (ClientPtr pClient); 685 686/* rrmode.c */ 687/* 688 * Find, and if necessary, create a mode 689 */ 690 691extern _X_EXPORT RRModePtr 692RRModeGet (xRRModeInfo *modeInfo, 693 const char *name); 694 695/* 696 * Destroy a mode. 697 */ 698 699extern _X_EXPORT void 700RRModeDestroy (RRModePtr mode); 701 702/* 703 * Return a list of modes that are valid for some output in pScreen 704 */ 705extern _X_EXPORT RRModePtr * 706RRModesForScreen (ScreenPtr pScreen, int *num_ret); 707 708/* 709 * Initialize mode type 710 */ 711extern _X_EXPORT Bool 712RRModeInit (void); 713 714/* 715 * Initialize mode type error value 716 */ 717extern _X_EXPORT void 718RRModeInitErrorValue (void); 719 720extern _X_EXPORT int 721ProcRRCreateMode (ClientPtr client); 722 723extern _X_EXPORT int 724ProcRRDestroyMode (ClientPtr client); 725 726extern _X_EXPORT int 727ProcRRAddOutputMode (ClientPtr client); 728 729extern _X_EXPORT int 730ProcRRDeleteOutputMode (ClientPtr client); 731 732/* rroutput.c */ 733 734/* 735 * Notify the output of some change. configChanged indicates whether 736 * any external configuration (mode list, clones, connected status) 737 * has changed, or whether the change was strictly internal 738 * (which crtc is in use) 739 */ 740extern _X_EXPORT void 741RROutputChanged (RROutputPtr output, Bool configChanged); 742 743/* 744 * Create an output 745 */ 746 747extern _X_EXPORT RROutputPtr 748RROutputCreate (ScreenPtr pScreen, 749 const char *name, 750 int nameLength, 751 void *devPrivate); 752 753/* 754 * Notify extension that output parameters have been changed 755 */ 756extern _X_EXPORT Bool 757RROutputSetClones (RROutputPtr output, 758 RROutputPtr *clones, 759 int numClones); 760 761extern _X_EXPORT Bool 762RROutputSetModes (RROutputPtr output, 763 RRModePtr *modes, 764 int numModes, 765 int numPreferred); 766 767extern _X_EXPORT int 768RROutputAddUserMode (RROutputPtr output, 769 RRModePtr mode); 770 771extern _X_EXPORT int 772RROutputDeleteUserMode (RROutputPtr output, 773 RRModePtr mode); 774 775extern _X_EXPORT Bool 776RROutputSetCrtcs (RROutputPtr output, 777 RRCrtcPtr *crtcs, 778 int numCrtcs); 779 780extern _X_EXPORT Bool 781RROutputSetConnection (RROutputPtr output, 782 CARD8 connection); 783 784extern _X_EXPORT Bool 785RROutputSetSubpixelOrder (RROutputPtr output, 786 int subpixelOrder); 787 788extern _X_EXPORT Bool 789RROutputSetPhysicalSize (RROutputPtr output, 790 int mmWidth, 791 int mmHeight); 792 793extern _X_EXPORT void 794RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output); 795 796extern _X_EXPORT void 797RROutputDestroy (RROutputPtr output); 798 799extern _X_EXPORT int 800ProcRRGetOutputInfo (ClientPtr client); 801 802extern _X_EXPORT int 803ProcRRSetOutputPrimary (ClientPtr client); 804 805extern _X_EXPORT int 806ProcRRGetOutputPrimary (ClientPtr client); 807 808/* 809 * Initialize output type 810 */ 811extern _X_EXPORT Bool 812RROutputInit (void); 813 814/* 815 * Initialize output type error value 816 */ 817extern _X_EXPORT void 818RROutputInitErrorValue (void); 819 820/* rrpointer.c */ 821extern _X_EXPORT void 822RRPointerMoved (ScreenPtr pScreen, int x, int y); 823 824extern _X_EXPORT void 825RRPointerScreenConfigured (ScreenPtr pScreen); 826 827/* rrproperty.c */ 828 829extern _X_EXPORT void 830RRDeleteAllOutputProperties (RROutputPtr output); 831 832extern _X_EXPORT RRPropertyValuePtr 833RRGetOutputProperty (RROutputPtr output, Atom property, Bool pending); 834 835extern _X_EXPORT RRPropertyPtr 836RRQueryOutputProperty (RROutputPtr output, Atom property); 837 838extern _X_EXPORT void 839RRDeleteOutputProperty (RROutputPtr output, Atom property); 840 841extern _X_EXPORT Bool 842RRPostPendingProperties (RROutputPtr output); 843 844extern _X_EXPORT int 845RRChangeOutputProperty (RROutputPtr output, Atom property, Atom type, 846 int format, int mode, unsigned long len, 847 pointer value, Bool sendevent, Bool pending); 848 849extern _X_EXPORT int 850RRConfigureOutputProperty (RROutputPtr output, Atom property, 851 Bool pending, Bool range, Bool immutable, 852 int num_values, INT32 *values); 853extern _X_EXPORT int 854ProcRRChangeOutputProperty (ClientPtr client); 855 856extern _X_EXPORT int 857ProcRRGetOutputProperty (ClientPtr client); 858 859extern _X_EXPORT int 860ProcRRListOutputProperties (ClientPtr client); 861 862extern _X_EXPORT int 863ProcRRQueryOutputProperty (ClientPtr client); 864 865extern _X_EXPORT int 866ProcRRConfigureOutputProperty (ClientPtr client); 867 868extern _X_EXPORT int 869ProcRRDeleteOutputProperty (ClientPtr client); 870 871/* rrxinerama.c */ 872#ifdef XINERAMA 873extern _X_EXPORT void 874RRXineramaExtensionInit(void); 875#endif 876 877#endif /* _RANDRSTR_H_ */ 878 879/* 880 881randr extension implementation structure 882 883Query state: 884 ProcRRGetScreenInfo/ProcRRGetScreenResources 885 RRGetInfo 886 887 • Request configuration from driver, either 1.0 or 1.2 style 888 • These functions only record state changes, all 889 other actions are pended until RRTellChanged is called 890 891 ->rrGetInfo 892 1.0: 893 RRRegisterSize 894 RRRegisterRate 895 RRSetCurrentConfig 896 1.2: 897 RRScreenSetSizeRange 898 RROutputSetCrtcs 899 RRModeGet 900 RROutputSetModes 901 RROutputSetConnection 902 RROutputSetSubpixelOrder 903 RROutputSetClones 904 RRCrtcNotify 905 906 • Must delay scanning configuration until after ->rrGetInfo returns 907 because some drivers will call SetCurrentConfig in the middle 908 of the ->rrGetInfo operation. 909 910 1.0: 911 912 • Scan old configuration, mirror to new structures 913 914 RRScanOldConfig 915 RRCrtcCreate 916 RROutputCreate 917 RROutputSetCrtcs 918 RROutputSetConnection 919 RROutputSetSubpixelOrder 920 RROldModeAdd • This adds modes one-at-a-time 921 RRModeGet 922 RRCrtcNotify 923 924 • send events, reset pointer if necessary 925 926 RRTellChanged 927 WalkTree (sending events) 928 929 • when layout has changed: 930 RRPointerScreenConfigured 931 RRSendConfigNotify 932 933Asynchronous state setting (1.2 only) 934 When setting state asynchronously, the driver invokes the 935 ->rrGetInfo function and then calls RRTellChanged to flush 936 the changes to the clients and reset pointer if necessary 937 938Set state 939 940 ProcRRSetScreenConfig 941 RRCrtcSet 942 1.2: 943 ->rrCrtcSet 944 RRCrtcNotify 945 1.0: 946 ->rrSetConfig 947 RRCrtcNotify 948 RRTellChanged 949 */ 950