randrstr.h revision 6747b715
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/* mirandr.c */
445extern _X_EXPORT Bool
446miRandRInit (ScreenPtr pScreen);
447
448extern _X_EXPORT Bool
449miRRGetInfo (ScreenPtr pScreen, Rotation *rotations);
450
451extern _X_EXPORT Bool
452miRRCrtcSet (ScreenPtr	pScreen,
453	     RRCrtcPtr	crtc,
454	     RRModePtr	mode,
455	     int	x,
456	     int	y,
457	     Rotation	rotation,
458	     int	numOutput,
459	     RROutputPtr *outputs);
460
461extern _X_EXPORT Bool
462miRROutputSetProperty (ScreenPtr	    pScreen,
463		       RROutputPtr	    output,
464		       Atom		    property,
465		       RRPropertyValuePtr   value);
466
467extern _X_EXPORT Bool
468miRROutputGetProperty (ScreenPtr	    pScreen,
469		       RROutputPtr	    output,
470		       Atom		    property);
471
472extern _X_EXPORT Bool
473miRROutputValidateMode (ScreenPtr	    pScreen,
474			RROutputPtr	    output,
475			RRModePtr	    mode);
476
477extern _X_EXPORT void
478miRRModeDestroy (ScreenPtr  pScreen,
479		 RRModePtr  mode);
480
481/* randr.c */
482/*
483 * Send all pending events
484 */
485extern _X_EXPORT void
486RRTellChanged (ScreenPtr pScreen);
487
488/*
489 * Poll the driver for changed information
490 */
491extern _X_EXPORT Bool
492RRGetInfo (ScreenPtr pScreen, Bool force_query);
493
494extern _X_EXPORT Bool RRInit (void);
495
496extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen);
497
498extern _X_EXPORT RROutputPtr
499RRFirstOutput (ScreenPtr pScreen);
500
501extern _X_EXPORT Rotation
502RRGetRotation (ScreenPtr pScreen);
503
504extern _X_EXPORT CARD16
505RRVerticalRefresh (xRRModeInfo *mode);
506
507#ifdef RANDR_10_INTERFACE
508/*
509 * This is the old interface, deprecated but left
510 * around for compatibility
511 */
512
513/*
514 * Then, register the specific size with the screen
515 */
516
517extern _X_EXPORT RRScreenSizePtr
518RRRegisterSize (ScreenPtr		pScreen,
519		short			width,
520		short			height,
521		short			mmWidth,
522		short			mmHeight);
523
524extern _X_EXPORT Bool
525RRRegisterRate (ScreenPtr		pScreen,
526		     RRScreenSizePtr	pSize,
527		     int		rate);
528
529/*
530 * Finally, set the current configuration of the screen
531 */
532
533extern _X_EXPORT void
534RRSetCurrentConfig (ScreenPtr		pScreen,
535		    Rotation		rotation,
536		    int			rate,
537		    RRScreenSizePtr	pSize);
538
539extern _X_EXPORT Bool RRScreenInit (ScreenPtr pScreen);
540
541extern _X_EXPORT Rotation
542RRGetRotation (ScreenPtr pScreen);
543
544#endif
545
546/* rrcrtc.c */
547
548/*
549 * Notify the CRTC of some change; layoutChanged indicates that
550 * some position or size element changed
551 */
552extern _X_EXPORT void
553RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged);
554
555/*
556 * Create a CRTC
557 */
558extern _X_EXPORT RRCrtcPtr
559RRCrtcCreate (ScreenPtr pScreen, void	*devPrivate);
560
561/*
562 * Set the allowed rotations on a CRTC
563 */
564extern _X_EXPORT void
565RRCrtcSetRotations (RRCrtcPtr crtc, Rotation rotations);
566
567/*
568 * Set whether transforms are allowed on a CRTC
569 */
570extern _X_EXPORT void
571RRCrtcSetTransformSupport (RRCrtcPtr crtc, Bool transforms);
572
573/*
574 * Notify the extension that the Crtc has been reconfigured,
575 * the driver calls this whenever it has updated the mode
576 */
577extern _X_EXPORT Bool
578RRCrtcNotify (RRCrtcPtr	    crtc,
579	      RRModePtr	    mode,
580	      int	    x,
581	      int	    y,
582	      Rotation	    rotation,
583	      RRTransformPtr transform,
584	      int	    numOutputs,
585	      RROutputPtr   *outputs);
586
587extern _X_EXPORT void
588RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc);
589
590/*
591 * Request that the Crtc be reconfigured
592 */
593extern _X_EXPORT Bool
594RRCrtcSet (RRCrtcPtr    crtc,
595	   RRModePtr	mode,
596	   int		x,
597	   int		y,
598	   Rotation	rotation,
599	   int		numOutput,
600	   RROutputPtr  *outputs);
601
602/*
603 * Request that the Crtc gamma be changed
604 */
605
606extern _X_EXPORT Bool
607RRCrtcGammaSet (RRCrtcPtr   crtc,
608		CARD16	    *red,
609		CARD16	    *green,
610		CARD16	    *blue);
611
612/*
613 * Request current gamma back from the DDX (if possible).
614 * This includes gamma size.
615 */
616
617extern _X_EXPORT Bool
618RRCrtcGammaGet(RRCrtcPtr crtc);
619
620/*
621 * Notify the extension that the Crtc gamma has been changed
622 * The driver calls this whenever it has changed the gamma values
623 * in the RRCrtcRec
624 */
625
626extern _X_EXPORT Bool
627RRCrtcGammaNotify (RRCrtcPtr	crtc);
628
629/*
630 * Set the size of the gamma table at server startup time
631 */
632
633extern _X_EXPORT Bool
634RRCrtcGammaSetSize (RRCrtcPtr	crtc,
635		    int		size);
636
637/*
638 * Return the area of the frame buffer scanned out by the crtc,
639 * taking into account the current mode and rotation
640 */
641
642extern _X_EXPORT void
643RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
644
645/*
646 * Compute the complete transformation matrix including
647 * client-specified transform, rotation/reflection values and the crtc
648 * offset.
649 *
650 * Return TRUE if the resulting transform is not a simple translation.
651 */
652extern _X_EXPORT Bool
653RRTransformCompute (int			    x,
654		    int			    y,
655		    int			    width,
656		    int			    height,
657		    Rotation		    rotation,
658		    RRTransformPtr	    rr_transform,
659
660		    PictTransformPtr	    transform,
661		    struct pict_f_transform *f_transform,
662		    struct pict_f_transform *f_inverse);
663
664/*
665 * Return crtc transform
666 */
667extern _X_EXPORT RRTransformPtr
668RRCrtcGetTransform (RRCrtcPtr crtc);
669
670/*
671 * Check whether the pending and current transforms are the same
672 */
673extern _X_EXPORT Bool
674RRCrtcPendingTransform (RRCrtcPtr crtc);
675
676/*
677 * Destroy a Crtc at shutdown
678 */
679extern _X_EXPORT void
680RRCrtcDestroy (RRCrtcPtr crtc);
681
682
683/*
684 * Set the pending CRTC transformation
685 */
686
687extern _X_EXPORT int
688RRCrtcTransformSet (RRCrtcPtr		crtc,
689		    PictTransformPtr	transform,
690		    struct pict_f_transform *f_transform,
691		    struct pict_f_transform *f_inverse,
692		    char		*filter,
693		    int			filter_len,
694		    xFixed		*params,
695		    int			nparams);
696
697/*
698 * Initialize crtc type
699 */
700extern _X_EXPORT Bool
701RRCrtcInit (void);
702
703/*
704 * Initialize crtc type error value
705 */
706extern _X_EXPORT void
707RRCrtcInitErrorValue (void);
708
709/*
710 * Crtc dispatch
711 */
712
713extern _X_EXPORT int
714ProcRRGetCrtcInfo (ClientPtr client);
715
716extern _X_EXPORT int
717ProcRRSetCrtcConfig (ClientPtr client);
718
719extern _X_EXPORT int
720ProcRRGetCrtcGammaSize (ClientPtr client);
721
722extern _X_EXPORT int
723ProcRRGetCrtcGamma (ClientPtr client);
724
725extern _X_EXPORT int
726ProcRRSetCrtcGamma (ClientPtr client);
727
728extern _X_EXPORT int
729ProcRRSetCrtcTransform (ClientPtr client);
730
731extern _X_EXPORT int
732ProcRRGetCrtcTransform (ClientPtr client);
733
734int
735ProcRRGetPanning (ClientPtr client);
736
737int
738ProcRRSetPanning (ClientPtr client);
739
740/* rrdispatch.c */
741extern _X_EXPORT Bool
742RRClientKnowsRates (ClientPtr	pClient);
743
744/* rrmode.c */
745/*
746 * Find, and if necessary, create a mode
747 */
748
749extern _X_EXPORT RRModePtr
750RRModeGet (xRRModeInfo	*modeInfo,
751	   const char	*name);
752
753/*
754 * Destroy a mode.
755 */
756
757extern _X_EXPORT void
758RRModeDestroy (RRModePtr mode);
759
760/*
761 * Return a list of modes that are valid for some output in pScreen
762 */
763extern _X_EXPORT RRModePtr *
764RRModesForScreen (ScreenPtr pScreen, int *num_ret);
765
766/*
767 * Initialize mode type
768 */
769extern _X_EXPORT Bool
770RRModeInit (void);
771
772/*
773 * Initialize mode type error value
774 */
775extern _X_EXPORT void
776RRModeInitErrorValue (void);
777
778extern _X_EXPORT int
779ProcRRCreateMode (ClientPtr client);
780
781extern _X_EXPORT int
782ProcRRDestroyMode (ClientPtr client);
783
784extern _X_EXPORT int
785ProcRRAddOutputMode (ClientPtr client);
786
787extern _X_EXPORT int
788ProcRRDeleteOutputMode (ClientPtr client);
789
790/* rroutput.c */
791
792/*
793 * Notify the output of some change. configChanged indicates whether
794 * any external configuration (mode list, clones, connected status)
795 * has changed, or whether the change was strictly internal
796 * (which crtc is in use)
797 */
798extern _X_EXPORT void
799RROutputChanged (RROutputPtr output, Bool configChanged);
800
801/*
802 * Create an output
803 */
804
805extern _X_EXPORT RROutputPtr
806RROutputCreate (ScreenPtr   pScreen,
807		const char  *name,
808		int	    nameLength,
809		void	    *devPrivate);
810
811/*
812 * Notify extension that output parameters have been changed
813 */
814extern _X_EXPORT Bool
815RROutputSetClones (RROutputPtr  output,
816		   RROutputPtr  *clones,
817		   int		numClones);
818
819extern _X_EXPORT Bool
820RROutputSetModes (RROutputPtr	output,
821		  RRModePtr	*modes,
822		  int		numModes,
823		  int		numPreferred);
824
825extern _X_EXPORT int
826RROutputAddUserMode (RROutputPtr    output,
827		     RRModePtr	    mode);
828
829extern _X_EXPORT int
830RROutputDeleteUserMode (RROutputPtr output,
831			RRModePtr   mode);
832
833extern _X_EXPORT Bool
834RROutputSetCrtcs (RROutputPtr	output,
835		  RRCrtcPtr	*crtcs,
836		  int		numCrtcs);
837
838extern _X_EXPORT Bool
839RROutputSetConnection (RROutputPtr  output,
840		       CARD8	    connection);
841
842extern _X_EXPORT Bool
843RROutputSetSubpixelOrder (RROutputPtr output,
844			  int	      subpixelOrder);
845
846extern _X_EXPORT Bool
847RROutputSetPhysicalSize (RROutputPtr	output,
848			 int		mmWidth,
849			 int		mmHeight);
850
851extern _X_EXPORT void
852RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
853
854extern _X_EXPORT void
855RROutputDestroy (RROutputPtr	output);
856
857extern _X_EXPORT int
858ProcRRGetOutputInfo (ClientPtr client);
859
860extern _X_EXPORT int
861ProcRRSetOutputPrimary (ClientPtr client);
862
863extern _X_EXPORT int
864ProcRRGetOutputPrimary (ClientPtr client);
865
866/*
867 * Initialize output type
868 */
869extern _X_EXPORT Bool
870RROutputInit (void);
871
872/*
873 * Initialize output type error value
874 */
875extern _X_EXPORT void
876RROutputInitErrorValue (void);
877
878/* rrpointer.c */
879extern _X_EXPORT void
880RRPointerMoved (ScreenPtr pScreen, int x, int y);
881
882extern _X_EXPORT void
883RRPointerScreenConfigured (ScreenPtr pScreen);
884
885/* rrproperty.c */
886
887extern _X_EXPORT void
888RRDeleteAllOutputProperties (RROutputPtr output);
889
890extern _X_EXPORT RRPropertyValuePtr
891RRGetOutputProperty (RROutputPtr output, Atom property, Bool pending);
892
893extern _X_EXPORT RRPropertyPtr
894RRQueryOutputProperty (RROutputPtr output, Atom property);
895
896extern _X_EXPORT void
897RRDeleteOutputProperty (RROutputPtr output, Atom property);
898
899extern _X_EXPORT Bool
900RRPostPendingProperties (RROutputPtr output);
901
902extern _X_EXPORT int
903RRChangeOutputProperty (RROutputPtr output, Atom property, Atom type,
904			int format, int mode, unsigned long len,
905			pointer value, Bool sendevent, Bool pending);
906
907extern _X_EXPORT int
908RRConfigureOutputProperty (RROutputPtr output, Atom property,
909			   Bool pending, Bool range, Bool immutable,
910			   int num_values, INT32 *values);
911extern _X_EXPORT int
912ProcRRChangeOutputProperty (ClientPtr client);
913
914extern _X_EXPORT int
915ProcRRGetOutputProperty (ClientPtr client);
916
917extern _X_EXPORT int
918ProcRRListOutputProperties (ClientPtr client);
919
920extern _X_EXPORT int
921ProcRRQueryOutputProperty (ClientPtr client);
922
923extern _X_EXPORT int
924ProcRRConfigureOutputProperty (ClientPtr client);
925
926extern _X_EXPORT int
927ProcRRDeleteOutputProperty (ClientPtr client);
928
929/* rrxinerama.c */
930#ifdef XINERAMA
931extern _X_EXPORT void
932RRXineramaExtensionInit(void);
933#endif
934
935#endif /* _RANDRSTR_H_ */
936
937/*
938
939randr extension implementation structure
940
941Query state:
942    ProcRRGetScreenInfo/ProcRRGetScreenResources
943	RRGetInfo
944
945	    • Request configuration from driver, either 1.0 or 1.2 style
946	    • These functions only record state changes, all
947	      other actions are pended until RRTellChanged is called
948
949	    ->rrGetInfo
950	    1.0:
951		RRRegisterSize
952		RRRegisterRate
953		RRSetCurrentConfig
954	    1.2:
955		RRScreenSetSizeRange
956		RROutputSetCrtcs
957		RRModeGet
958		RROutputSetModes
959		RROutputSetConnection
960		RROutputSetSubpixelOrder
961		RROutputSetClones
962		RRCrtcNotify
963
964	• Must delay scanning configuration until after ->rrGetInfo returns
965	  because some drivers will call SetCurrentConfig in the middle
966	  of the ->rrGetInfo operation.
967
968	1.0:
969
970	    • Scan old configuration, mirror to new structures
971
972	    RRScanOldConfig
973		RRCrtcCreate
974		RROutputCreate
975		RROutputSetCrtcs
976		RROutputSetConnection
977		RROutputSetSubpixelOrder
978		RROldModeAdd	• This adds modes one-at-a-time
979		    RRModeGet
980		RRCrtcNotify
981
982	• send events, reset pointer if necessary
983
984	RRTellChanged
985	    WalkTree (sending events)
986
987	    • when layout has changed:
988		RRPointerScreenConfigured
989		RRSendConfigNotify
990
991Asynchronous state setting (1.2 only)
992    When setting state asynchronously, the driver invokes the
993    ->rrGetInfo function and then calls RRTellChanged to flush
994    the changes to the clients and reset pointer if necessary
995
996Set state
997
998    ProcRRSetScreenConfig
999	RRCrtcSet
1000	    1.2:
1001		->rrCrtcSet
1002		    RRCrtcNotify
1003	    1.0:
1004		->rrSetConfig
1005		RRCrtcNotify
1006	    RRTellChanged
1007 */
1008