randrstr.h revision f7df2e56
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 0x0104
61
62typedef XID RRMode;
63typedef XID RROutput;
64typedef XID RRCrtc;
65typedef XID RRProvider;
66
67extern int RREventBase, RRErrorBase;
68
69extern int (*ProcRandrVector[RRNumberRequests]) (ClientPtr);
70extern int (*SProcRandrVector[RRNumberRequests]) (ClientPtr);
71
72/*
73 * Modeline for a monitor. Name follows directly after this struct
74 */
75
76#define RRModeName(pMode) ((char *) (pMode + 1))
77typedef struct _rrMode RRModeRec, *RRModePtr;
78typedef struct _rrPropertyValue RRPropertyValueRec, *RRPropertyValuePtr;
79typedef struct _rrProperty RRPropertyRec, *RRPropertyPtr;
80typedef struct _rrCrtc RRCrtcRec, *RRCrtcPtr;
81typedef struct _rrOutput RROutputRec, *RROutputPtr;
82typedef struct _rrProvider RRProviderRec, *RRProviderPtr;
83typedef struct _rrMonitor RRMonitorRec, *RRMonitorPtr;
84
85struct _rrMode {
86    int refcnt;
87    xRRModeInfo mode;
88    char *name;
89    ScreenPtr userScreen;
90};
91
92struct _rrPropertyValue {
93    Atom type;                  /* ignored by server */
94    short format;               /* format of data for swapping - 8,16,32 */
95    long size;                  /* size of data in (format/8) bytes */
96    void *data;                 /* private to client */
97};
98
99struct _rrProperty {
100    RRPropertyPtr next;
101    ATOM propertyName;
102    Bool is_pending;
103    Bool range;
104    Bool immutable;
105    int num_valid;
106    INT32 *valid_values;
107    RRPropertyValueRec current, pending;
108};
109
110struct _rrCrtc {
111    RRCrtc id;
112    ScreenPtr pScreen;
113    RRModePtr mode;
114    int x, y;
115    Rotation rotation;
116    Rotation rotations;
117    Bool changed;
118    int numOutputs;
119    RROutputPtr *outputs;
120    int gammaSize;
121    CARD16 *gammaRed;
122    CARD16 *gammaBlue;
123    CARD16 *gammaGreen;
124    void *devPrivate;
125    Bool transforms;
126    RRTransformRec client_pending_transform;
127    RRTransformRec client_current_transform;
128    PictTransform transform;
129    struct pict_f_transform f_transform;
130    struct pict_f_transform f_inverse;
131
132    PixmapPtr scanout_pixmap;
133};
134
135struct _rrOutput {
136    RROutput id;
137    ScreenPtr pScreen;
138    char *name;
139    int nameLength;
140    CARD8 connection;
141    CARD8 subpixelOrder;
142    int mmWidth;
143    int mmHeight;
144    RRCrtcPtr crtc;
145    int numCrtcs;
146    RRCrtcPtr *crtcs;
147    int numClones;
148    RROutputPtr *clones;
149    int numModes;
150    int numPreferred;
151    RRModePtr *modes;
152    int numUserModes;
153    RRModePtr *userModes;
154    Bool changed;
155    RRPropertyPtr properties;
156    Bool pendingProperties;
157    void *devPrivate;
158};
159
160struct _rrProvider {
161    RRProvider id;
162    ScreenPtr pScreen;
163    uint32_t capabilities;
164    char *name;
165    int nameLength;
166    RRPropertyPtr properties;
167    Bool pendingProperties;
168    Bool changed;
169    struct _rrProvider *offload_sink;
170    struct _rrProvider *output_source;
171};
172
173typedef struct _rrMonitorGeometry {
174    BoxRec box;
175    CARD32 mmWidth;
176    CARD32 mmHeight;
177} RRMonitorGeometryRec, *RRMonitorGeometryPtr;
178
179struct _rrMonitor {
180    Atom name;
181    ScreenPtr pScreen;
182    int numOutputs;
183    RROutput *outputs;
184    Bool primary;
185    Bool automatic;
186    RRMonitorGeometryRec geometry;
187};
188
189#if RANDR_12_INTERFACE
190typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen,
191                                        CARD16 width,
192                                        CARD16 height,
193                                        CARD32 mmWidth, CARD32 mmHeight);
194
195typedef Bool (*RRCrtcSetProcPtr) (ScreenPtr pScreen,
196                                  RRCrtcPtr crtc,
197                                  RRModePtr mode,
198                                  int x,
199                                  int y,
200                                  Rotation rotation,
201                                  int numOutputs, RROutputPtr * outputs);
202
203typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc);
204
205typedef Bool (*RRCrtcGetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc);
206
207typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr pScreen,
208                                            RROutputPtr output,
209                                            Atom property,
210                                            RRPropertyValuePtr value);
211
212typedef Bool (*RROutputValidateModeProcPtr) (ScreenPtr pScreen,
213                                             RROutputPtr output,
214                                             RRModePtr mode);
215
216typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, RRModePtr mode);
217
218#endif
219
220#if RANDR_13_INTERFACE
221typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen,
222                                            RROutputPtr output, Atom property);
223typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn,
224                                     RRCrtcPtr crtc,
225                                     BoxPtr totalArea,
226                                     BoxPtr trackingArea, INT16 *border);
227typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn,
228                                     RRCrtcPtr crtc,
229                                     BoxPtr totalArea,
230                                     BoxPtr trackingArea, INT16 *border);
231
232#endif                          /* RANDR_13_INTERFACE */
233
234typedef Bool (*RRProviderGetPropertyProcPtr) (ScreenPtr pScreen,
235                                            RRProviderPtr provider, Atom property);
236typedef Bool (*RRProviderSetPropertyProcPtr) (ScreenPtr pScreen,
237                                              RRProviderPtr provider,
238                                              Atom property,
239                                              RRPropertyValuePtr value);
240
241typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation * rotations);
242typedef Bool (*RRCloseScreenProcPtr) (ScreenPtr pscreen);
243
244typedef Bool (*RRProviderSetOutputSourceProcPtr)(ScreenPtr pScreen,
245                                          RRProviderPtr provider,
246                                          RRProviderPtr output_source);
247
248typedef Bool (*RRProviderSetOffloadSinkProcPtr)(ScreenPtr pScreen,
249                                         RRProviderPtr provider,
250                                         RRProviderPtr offload_sink);
251
252
253typedef void (*RRProviderDestroyProcPtr)(ScreenPtr pScreen,
254                                         RRProviderPtr provider);
255
256/* These are for 1.0 compatibility */
257
258typedef struct _rrRefresh {
259    CARD16 rate;
260    RRModePtr mode;
261} RRScreenRate, *RRScreenRatePtr;
262
263typedef struct _rrScreenSize {
264    int id;
265    short width, height;
266    short mmWidth, mmHeight;
267    int nRates;
268    RRScreenRatePtr pRates;
269} RRScreenSize, *RRScreenSizePtr;
270
271#ifdef RANDR_10_INTERFACE
272
273typedef Bool (*RRSetConfigProcPtr) (ScreenPtr pScreen,
274                                    Rotation rotation,
275                                    int rate, RRScreenSizePtr pSize);
276
277#endif
278
279typedef Bool (*RRCrtcSetScanoutPixmapProcPtr)(RRCrtcPtr crtc, PixmapPtr pixmap);
280
281typedef struct _rrScrPriv {
282    /*
283     * 'public' part of the structure; DDXen fill this in
284     * as they initialize
285     */
286#if RANDR_10_INTERFACE
287    RRSetConfigProcPtr rrSetConfig;
288#endif
289    RRGetInfoProcPtr rrGetInfo;
290#if RANDR_12_INTERFACE
291    RRScreenSetSizeProcPtr rrScreenSetSize;
292    RRCrtcSetProcPtr rrCrtcSet;
293    RRCrtcSetGammaProcPtr rrCrtcSetGamma;
294    RRCrtcGetGammaProcPtr rrCrtcGetGamma;
295    RROutputSetPropertyProcPtr rrOutputSetProperty;
296    RROutputValidateModeProcPtr rrOutputValidateMode;
297    RRModeDestroyProcPtr rrModeDestroy;
298#endif
299#if RANDR_13_INTERFACE
300    RROutputGetPropertyProcPtr rrOutputGetProperty;
301    RRGetPanningProcPtr rrGetPanning;
302    RRSetPanningProcPtr rrSetPanning;
303#endif
304    /* TODO #if RANDR_15_INTERFACE */
305    RRCrtcSetScanoutPixmapProcPtr rrCrtcSetScanoutPixmap;
306
307    RRProviderSetOutputSourceProcPtr rrProviderSetOutputSource;
308    RRProviderSetOffloadSinkProcPtr rrProviderSetOffloadSink;
309    RRProviderGetPropertyProcPtr rrProviderGetProperty;
310    RRProviderSetPropertyProcPtr rrProviderSetProperty;
311    /*
312     * Private part of the structure; not considered part of the ABI
313     */
314    TimeStamp lastSetTime;      /* last changed by client */
315    TimeStamp lastConfigTime;   /* possible configs changed */
316    RRCloseScreenProcPtr CloseScreen;
317
318    Bool changed;               /* some config changed */
319    Bool configChanged;         /* configuration changed */
320    Bool layoutChanged;         /* screen layout changed */
321    Bool resourcesChanged;      /* screen resources change */
322
323    CARD16 minWidth, minHeight;
324    CARD16 maxWidth, maxHeight;
325    CARD16 width, height;       /* last known screen size */
326    CARD16 mmWidth, mmHeight;   /* last known screen size */
327
328    int numOutputs;
329    RROutputPtr *outputs;
330    RROutputPtr primaryOutput;
331
332    int numCrtcs;
333    RRCrtcPtr *crtcs;
334
335    /* Last known pointer position */
336    RRCrtcPtr pointerCrtc;
337
338#ifdef RANDR_10_INTERFACE
339    /*
340     * Configuration information
341     */
342    Rotation rotations;
343    CARD16 reqWidth, reqHeight;
344
345    int nSizes;
346    RRScreenSizePtr pSizes;
347
348    Rotation rotation;
349    int rate;
350    int size;
351#endif
352    Bool discontiguous;
353
354    RRProviderPtr provider;
355
356    RRProviderDestroyProcPtr rrProviderDestroy;
357
358    int numMonitors;
359    RRMonitorPtr *monitors;
360
361} rrScrPrivRec, *rrScrPrivPtr;
362
363extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec;
364
365#define rrPrivKey (&rrPrivKeyRec)
366
367#define rrGetScrPriv(pScr)  ((rrScrPrivPtr)dixLookupPrivate(&(pScr)->devPrivates, rrPrivKey))
368#define rrScrPriv(pScr)	rrScrPrivPtr    pScrPriv = rrGetScrPriv(pScr)
369#define SetRRScreen(s,p) dixSetPrivate(&(s)->devPrivates, rrPrivKey, p)
370
371/*
372 * each window has a list of clients requesting
373 * RRNotify events.  Each client has a resource
374 * for each window it selects RRNotify input for,
375 * this resource is used to delete the RRNotifyRec
376 * entry from the per-window queue.
377 */
378
379typedef struct _RREvent *RREventPtr;
380
381typedef struct _RREvent {
382    RREventPtr next;
383    ClientPtr client;
384    WindowPtr window;
385    XID clientResource;
386    int mask;
387} RREventRec;
388
389typedef struct _RRTimes {
390    TimeStamp setTime;
391    TimeStamp configTime;
392} RRTimesRec, *RRTimesPtr;
393
394typedef struct _RRClient {
395    int major_version;
396    int minor_version;
397/*  RRTimesRec	times[0]; */
398} RRClientRec, *RRClientPtr;
399
400extern RESTYPE RRClientType, RREventType;     /* resource types for event masks */
401extern DevPrivateKeyRec RRClientPrivateKeyRec;
402
403#define RRClientPrivateKey (&RRClientPrivateKeyRec)
404extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType, RRProviderType;
405
406#define VERIFY_RR_OUTPUT(id, ptr, a)\
407    {\
408	int rc = dixLookupResourceByType((void **)&(ptr), id,\
409	                                 RROutputType, client, a);\
410	if (rc != Success) {\
411	    client->errorValue = id;\
412	    return rc;\
413	}\
414    }
415
416#define VERIFY_RR_CRTC(id, ptr, a)\
417    {\
418	int rc = dixLookupResourceByType((void **)&(ptr), id,\
419	                                 RRCrtcType, client, a);\
420	if (rc != Success) {\
421	    client->errorValue = id;\
422	    return rc;\
423	}\
424    }
425
426#define VERIFY_RR_MODE(id, ptr, a)\
427    {\
428	int rc = dixLookupResourceByType((void **)&(ptr), id,\
429	                                 RRModeType, client, a);\
430	if (rc != Success) {\
431	    client->errorValue = id;\
432	    return rc;\
433	}\
434    }
435
436#define VERIFY_RR_PROVIDER(id, ptr, a)\
437    {\
438        int rc = dixLookupResourceByType((void **)&(ptr), id,\
439                                         RRProviderType, client, a);\
440        if (rc != Success) {\
441            client->errorValue = id;\
442            return rc;\
443        }\
444    }
445
446#define GetRRClient(pClient)    ((RRClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RRClientPrivateKey))
447#define rrClientPriv(pClient)	RRClientPtr pRRClient = GetRRClient(pClient)
448
449#ifdef RANDR_12_INTERFACE
450/*
451 * Set the range of sizes for the screen
452 */
453extern _X_EXPORT void
454
455RRScreenSetSizeRange(ScreenPtr pScreen,
456                     CARD16 minWidth,
457                     CARD16 minHeight, CARD16 maxWidth, CARD16 maxHeight);
458#endif
459
460/* rrscreen.c */
461/*
462 * Notify the extension that the screen size has been changed.
463 * The driver is responsible for calling this whenever it has changed
464 * the size of the screen
465 */
466extern _X_EXPORT void
467 RRScreenSizeNotify(ScreenPtr pScreen);
468
469/*
470 * Request that the screen be resized
471 */
472extern _X_EXPORT Bool
473
474RRScreenSizeSet(ScreenPtr pScreen,
475                CARD16 width, CARD16 height, CARD32 mmWidth, CARD32 mmHeight);
476
477/*
478 * Send ConfigureNotify event to root window when 'something' happens
479 */
480extern _X_EXPORT void
481 RRSendConfigNotify(ScreenPtr pScreen);
482
483/*
484 * screen dispatch
485 */
486extern _X_EXPORT int
487 ProcRRGetScreenSizeRange(ClientPtr client);
488
489extern _X_EXPORT int
490 ProcRRSetScreenSize(ClientPtr client);
491
492extern _X_EXPORT int
493 ProcRRGetScreenResources(ClientPtr client);
494
495extern _X_EXPORT int
496 ProcRRGetScreenResourcesCurrent(ClientPtr client);
497
498extern _X_EXPORT int
499 ProcRRSetScreenConfig(ClientPtr client);
500
501extern _X_EXPORT int
502 ProcRRGetScreenInfo(ClientPtr client);
503
504/*
505 * Deliver a ScreenNotify event
506 */
507extern _X_EXPORT void
508 RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen);
509
510extern _X_EXPORT void
511 RRResourcesChanged(ScreenPtr pScreen);
512
513/* randr.c */
514/* set a screen change on the primary screen */
515extern _X_EXPORT void
516RRSetChanged(ScreenPtr pScreen);
517
518/*
519 * Send all pending events
520 */
521extern _X_EXPORT void
522 RRTellChanged(ScreenPtr pScreen);
523
524extern _X_EXPORT void
525RRSetChanged (ScreenPtr pScreen);
526
527/*
528 * Poll the driver for changed information
529 */
530extern _X_EXPORT Bool
531 RRGetInfo(ScreenPtr pScreen, Bool force_query);
532
533extern _X_EXPORT Bool RRInit(void);
534
535extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen);
536
537extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen);
538
539extern _X_EXPORT CARD16
540 RRVerticalRefresh(xRRModeInfo * mode);
541
542#ifdef RANDR_10_INTERFACE
543/*
544 * This is the old interface, deprecated but left
545 * around for compatibility
546 */
547
548/*
549 * Then, register the specific size with the screen
550 */
551
552extern _X_EXPORT RRScreenSizePtr
553RRRegisterSize(ScreenPtr pScreen,
554               short width, short height, short mmWidth, short mmHeight);
555
556extern _X_EXPORT Bool
557 RRRegisterRate(ScreenPtr pScreen, RRScreenSizePtr pSize, int rate);
558
559/*
560 * Finally, set the current configuration of the screen
561 */
562
563extern _X_EXPORT void
564
565RRSetCurrentConfig(ScreenPtr pScreen,
566                   Rotation rotation, int rate, RRScreenSizePtr pSize);
567
568extern _X_EXPORT Rotation RRGetRotation(ScreenPtr pScreen);
569
570#endif
571
572/* rrcrtc.c */
573
574/*
575 * Notify the CRTC of some change; layoutChanged indicates that
576 * some position or size element changed
577 */
578extern _X_EXPORT void
579 RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged);
580
581/*
582 * Create a CRTC
583 */
584extern _X_EXPORT RRCrtcPtr RRCrtcCreate(ScreenPtr pScreen, void *devPrivate);
585
586/*
587 * Set the allowed rotations on a CRTC
588 */
589extern _X_EXPORT void
590 RRCrtcSetRotations(RRCrtcPtr crtc, Rotation rotations);
591
592/*
593 * Set whether transforms are allowed on a CRTC
594 */
595extern _X_EXPORT void
596 RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms);
597
598/*
599 * Notify the extension that the Crtc has been reconfigured,
600 * the driver calls this whenever it has updated the mode
601 */
602extern _X_EXPORT Bool
603
604RRCrtcNotify(RRCrtcPtr crtc,
605             RRModePtr mode,
606             int x,
607             int y,
608             Rotation rotation,
609             RRTransformPtr transform, int numOutputs, RROutputPtr * outputs);
610
611extern _X_EXPORT void
612 RRDeliverCrtcEvent(ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc);
613
614/*
615 * Request that the Crtc be reconfigured
616 */
617extern _X_EXPORT Bool
618
619RRCrtcSet(RRCrtcPtr crtc,
620          RRModePtr mode,
621          int x,
622          int y, Rotation rotation, int numOutput, RROutputPtr * outputs);
623
624/*
625 * Request that the Crtc gamma be changed
626 */
627
628extern _X_EXPORT Bool
629 RRCrtcGammaSet(RRCrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue);
630
631/*
632 * Request current gamma back from the DDX (if possible).
633 * This includes gamma size.
634 */
635
636extern _X_EXPORT Bool
637 RRCrtcGammaGet(RRCrtcPtr crtc);
638
639/*
640 * Notify the extension that the Crtc gamma has been changed
641 * The driver calls this whenever it has changed the gamma values
642 * in the RRCrtcRec
643 */
644
645extern _X_EXPORT Bool
646 RRCrtcGammaNotify(RRCrtcPtr crtc);
647
648/*
649 * Set the size of the gamma table at server startup time
650 */
651
652extern _X_EXPORT Bool
653 RRCrtcGammaSetSize(RRCrtcPtr crtc, int size);
654
655/*
656 * Return the area of the frame buffer scanned out by the crtc,
657 * taking into account the current mode and rotation
658 */
659
660extern _X_EXPORT void
661 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
662
663/*
664 * Return crtc transform
665 */
666extern _X_EXPORT RRTransformPtr RRCrtcGetTransform(RRCrtcPtr crtc);
667
668/*
669 * Check whether the pending and current transforms are the same
670 */
671extern _X_EXPORT Bool
672 RRCrtcPendingTransform(RRCrtcPtr crtc);
673
674/*
675 * Destroy a Crtc at shutdown
676 */
677extern _X_EXPORT void
678 RRCrtcDestroy(RRCrtcPtr crtc);
679
680/*
681 * Set the pending CRTC transformation
682 */
683
684extern _X_EXPORT int
685
686RRCrtcTransformSet(RRCrtcPtr crtc,
687                   PictTransformPtr transform,
688                   struct pict_f_transform *f_transform,
689                   struct pict_f_transform *f_inverse,
690                   char *filter, int filter_len, xFixed * params, int nparams);
691
692/*
693 * Initialize crtc type
694 */
695extern _X_EXPORT Bool
696 RRCrtcInit(void);
697
698/*
699 * Initialize crtc type error value
700 */
701extern _X_EXPORT void
702 RRCrtcInitErrorValue(void);
703
704/*
705 * Detach and free a scanout pixmap
706 */
707extern _X_EXPORT void
708 RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc);
709
710extern _X_EXPORT Bool
711 RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable);
712
713/*
714 * Crtc dispatch
715 */
716
717extern _X_EXPORT int
718 ProcRRGetCrtcInfo(ClientPtr client);
719
720extern _X_EXPORT int
721 ProcRRSetCrtcConfig(ClientPtr client);
722
723extern _X_EXPORT int
724 ProcRRGetCrtcGammaSize(ClientPtr client);
725
726extern _X_EXPORT int
727 ProcRRGetCrtcGamma(ClientPtr client);
728
729extern _X_EXPORT int
730 ProcRRSetCrtcGamma(ClientPtr client);
731
732extern _X_EXPORT int
733 ProcRRSetCrtcTransform(ClientPtr client);
734
735extern _X_EXPORT int
736 ProcRRGetCrtcTransform(ClientPtr client);
737
738int
739 ProcRRGetPanning(ClientPtr client);
740
741int
742 ProcRRSetPanning(ClientPtr client);
743
744void
745 RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *);
746
747/* rrdispatch.c */
748extern _X_EXPORT Bool
749 RRClientKnowsRates(ClientPtr pClient);
750
751/* rrmode.c */
752/*
753 * Find, and if necessary, create a mode
754 */
755
756extern _X_EXPORT RRModePtr RRModeGet(xRRModeInfo * modeInfo, const char *name);
757
758/*
759 * Destroy a mode.
760 */
761
762extern _X_EXPORT void
763 RRModeDestroy(RRModePtr mode);
764
765/*
766 * Return a list of modes that are valid for some output in pScreen
767 */
768extern _X_EXPORT RRModePtr *RRModesForScreen(ScreenPtr pScreen, int *num_ret);
769
770/*
771 * Initialize mode type
772 */
773extern _X_EXPORT Bool
774 RRModeInit(void);
775
776/*
777 * Initialize mode type error value
778 */
779extern _X_EXPORT void
780 RRModeInitErrorValue(void);
781
782extern _X_EXPORT int
783 ProcRRCreateMode(ClientPtr client);
784
785extern _X_EXPORT int
786 ProcRRDestroyMode(ClientPtr client);
787
788extern _X_EXPORT int
789 ProcRRAddOutputMode(ClientPtr client);
790
791extern _X_EXPORT int
792 ProcRRDeleteOutputMode(ClientPtr client);
793
794/* rroutput.c */
795
796/*
797 * Notify the output of some change. configChanged indicates whether
798 * any external configuration (mode list, clones, connected status)
799 * has changed, or whether the change was strictly internal
800 * (which crtc is in use)
801 */
802extern _X_EXPORT void
803 RROutputChanged(RROutputPtr output, Bool configChanged);
804
805/*
806 * Create an output
807 */
808
809extern _X_EXPORT RROutputPtr
810RROutputCreate(ScreenPtr pScreen,
811               const char *name, int nameLength, void *devPrivate);
812
813/*
814 * Notify extension that output parameters have been changed
815 */
816extern _X_EXPORT Bool
817 RROutputSetClones(RROutputPtr output, RROutputPtr * clones, int numClones);
818
819extern _X_EXPORT Bool
820
821RROutputSetModes(RROutputPtr output,
822                 RRModePtr * modes, int numModes, int numPreferred);
823
824extern _X_EXPORT int
825 RROutputAddUserMode(RROutputPtr output, RRModePtr mode);
826
827extern _X_EXPORT int
828 RROutputDeleteUserMode(RROutputPtr output, RRModePtr mode);
829
830extern _X_EXPORT Bool
831 RROutputSetCrtcs(RROutputPtr output, RRCrtcPtr * crtcs, int numCrtcs);
832
833extern _X_EXPORT Bool
834 RROutputSetConnection(RROutputPtr output, CARD8 connection);
835
836extern _X_EXPORT Bool
837 RROutputSetSubpixelOrder(RROutputPtr output, int subpixelOrder);
838
839extern _X_EXPORT Bool
840 RROutputSetPhysicalSize(RROutputPtr output, int mmWidth, int mmHeight);
841
842extern _X_EXPORT void
843 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
844
845extern _X_EXPORT void
846 RROutputDestroy(RROutputPtr output);
847
848extern _X_EXPORT int
849 ProcRRGetOutputInfo(ClientPtr client);
850
851extern _X_EXPORT int
852 ProcRRSetOutputPrimary(ClientPtr client);
853
854extern _X_EXPORT int
855 ProcRRGetOutputPrimary(ClientPtr client);
856
857/*
858 * Initialize output type
859 */
860extern _X_EXPORT Bool
861 RROutputInit(void);
862
863/*
864 * Initialize output type error value
865 */
866extern _X_EXPORT void
867 RROutputInitErrorValue(void);
868
869/* rrpointer.c */
870extern _X_EXPORT void
871 RRPointerMoved(ScreenPtr pScreen, int x, int y);
872
873extern _X_EXPORT void
874 RRPointerScreenConfigured(ScreenPtr pScreen);
875
876/* rrproperty.c */
877
878extern _X_EXPORT void
879 RRDeleteAllOutputProperties(RROutputPtr output);
880
881extern _X_EXPORT RRPropertyValuePtr
882RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending);
883
884extern _X_EXPORT RRPropertyPtr
885RRQueryOutputProperty(RROutputPtr output, Atom property);
886
887extern _X_EXPORT void
888 RRDeleteOutputProperty(RROutputPtr output, Atom property);
889
890extern _X_EXPORT Bool
891 RRPostPendingProperties(RROutputPtr output);
892
893extern _X_EXPORT int
894
895RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
896                       int format, int mode, unsigned long len,
897                       void *value, Bool sendevent, Bool pending);
898
899extern _X_EXPORT int
900
901RRConfigureOutputProperty(RROutputPtr output, Atom property,
902                          Bool pending, Bool range, Bool immutable,
903                          int num_values, INT32 *values);
904extern _X_EXPORT int
905 ProcRRChangeOutputProperty(ClientPtr client);
906
907extern _X_EXPORT int
908 ProcRRGetOutputProperty(ClientPtr client);
909
910extern _X_EXPORT int
911 ProcRRListOutputProperties(ClientPtr client);
912
913extern _X_EXPORT int
914 ProcRRQueryOutputProperty(ClientPtr client);
915
916extern _X_EXPORT int
917 ProcRRConfigureOutputProperty(ClientPtr client);
918
919extern _X_EXPORT int
920 ProcRRDeleteOutputProperty(ClientPtr client);
921
922/* rrprovider.c */
923extern _X_EXPORT void
924RRProviderInitErrorValue(void);
925
926extern _X_EXPORT int
927ProcRRGetProviders(ClientPtr client);
928
929extern _X_EXPORT int
930ProcRRGetProviderInfo(ClientPtr client);
931
932extern _X_EXPORT int
933ProcRRSetProviderOutputSource(ClientPtr client);
934
935extern _X_EXPORT int
936ProcRRSetProviderOffloadSink(ClientPtr client);
937
938extern _X_EXPORT Bool
939RRProviderInit(void);
940
941extern _X_EXPORT RRProviderPtr
942RRProviderCreate(ScreenPtr pScreen, const char *name,
943                 int nameLength);
944
945extern _X_EXPORT void
946RRProviderDestroy (RRProviderPtr provider);
947
948extern _X_EXPORT void
949RRProviderSetCapabilities(RRProviderPtr provider, uint32_t capabilities);
950
951extern _X_EXPORT Bool
952RRProviderLookup(XID id, RRProviderPtr *provider_p);
953
954extern _X_EXPORT void
955RRDeliverProviderEvent(ClientPtr client, WindowPtr pWin, RRProviderPtr provider);
956
957/* rrproviderproperty.c */
958
959extern _X_EXPORT void
960 RRDeleteAllProviderProperties(RRProviderPtr provider);
961
962extern _X_EXPORT RRPropertyValuePtr
963 RRGetProviderProperty(RRProviderPtr provider, Atom property, Bool pending);
964
965extern _X_EXPORT RRPropertyPtr
966 RRQueryProviderProperty(RRProviderPtr provider, Atom property);
967
968extern _X_EXPORT void
969 RRDeleteProviderProperty(RRProviderPtr provider, Atom property);
970
971extern _X_EXPORT int
972RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type,
973                       int format, int mode, unsigned long len,
974                       void *value, Bool sendevent, Bool pending);
975
976extern _X_EXPORT int
977 RRConfigureProviderProperty(RRProviderPtr provider, Atom property,
978                             Bool pending, Bool range, Bool immutable,
979                             int num_values, INT32 *values);
980
981extern _X_EXPORT Bool
982 RRPostProviderPendingProperties(RRProviderPtr provider);
983
984extern _X_EXPORT int
985 ProcRRGetProviderProperty(ClientPtr client);
986
987extern _X_EXPORT int
988 ProcRRListProviderProperties(ClientPtr client);
989
990extern _X_EXPORT int
991 ProcRRQueryProviderProperty(ClientPtr client);
992
993extern _X_EXPORT int
994ProcRRConfigureProviderProperty(ClientPtr client);
995
996extern _X_EXPORT int
997ProcRRChangeProviderProperty(ClientPtr client);
998
999extern _X_EXPORT int
1000 ProcRRDeleteProviderProperty(ClientPtr client);
1001/* rrxinerama.c */
1002#ifdef XINERAMA
1003extern _X_EXPORT void
1004 RRXineramaExtensionInit(void);
1005#endif
1006
1007void
1008RRMonitorInit(ScreenPtr screen);
1009
1010Bool
1011RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, int *nmon_ret);
1012
1013int
1014RRMonitorCountList(ScreenPtr screen);
1015
1016void
1017RRMonitorFreeList(RRMonitorPtr monitors, int nmon);
1018
1019void
1020RRMonitorClose(ScreenPtr screen);
1021
1022RRMonitorPtr
1023RRMonitorAlloc(int noutput);
1024
1025int
1026RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor);
1027
1028void
1029RRMonitorFree(RRMonitorPtr monitor);
1030
1031int
1032ProcRRGetMonitors(ClientPtr client);
1033
1034int
1035ProcRRSetMonitor(ClientPtr client);
1036
1037int
1038ProcRRDeleteMonitor(ClientPtr client);
1039
1040#endif                          /* _RANDRSTR_H_ */
1041
1042/*
1043
1044randr extension implementation structure
1045
1046Query state:
1047    ProcRRGetScreenInfo/ProcRRGetScreenResources
1048	RRGetInfo
1049
1050	    • Request configuration from driver, either 1.0 or 1.2 style
1051	    • These functions only record state changes, all
1052	      other actions are pended until RRTellChanged is called
1053
1054	    ->rrGetInfo
1055	    1.0:
1056		RRRegisterSize
1057		RRRegisterRate
1058		RRSetCurrentConfig
1059	    1.2:
1060		RRScreenSetSizeRange
1061		RROutputSetCrtcs
1062		RRModeGet
1063		RROutputSetModes
1064		RROutputSetConnection
1065		RROutputSetSubpixelOrder
1066		RROutputSetClones
1067		RRCrtcNotify
1068
1069	• Must delay scanning configuration until after ->rrGetInfo returns
1070	  because some drivers will call SetCurrentConfig in the middle
1071	  of the ->rrGetInfo operation.
1072
1073	1.0:
1074
1075	    • Scan old configuration, mirror to new structures
1076
1077	    RRScanOldConfig
1078		RRCrtcCreate
1079		RROutputCreate
1080		RROutputSetCrtcs
1081		RROutputSetConnection
1082		RROutputSetSubpixelOrder
1083		RROldModeAdd	• This adds modes one-at-a-time
1084		    RRModeGet
1085		RRCrtcNotify
1086
1087	• send events, reset pointer if necessary
1088
1089	RRTellChanged
1090	    WalkTree (sending events)
1091
1092	    • when layout has changed:
1093		RRPointerScreenConfigured
1094		RRSendConfigNotify
1095
1096Asynchronous state setting (1.2 only)
1097    When setting state asynchronously, the driver invokes the
1098    ->rrGetInfo function and then calls RRTellChanged to flush
1099    the changes to the clients and reset pointer if necessary
1100
1101Set state
1102
1103    ProcRRSetScreenConfig
1104	RRCrtcSet
1105	    1.2:
1106		->rrCrtcSet
1107		    RRCrtcNotify
1108	    1.0:
1109		->rrSetConfig
1110		RRCrtcNotify
1111	    RRTellChanged
1112 */
1113