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