/* * Copyright © 2000 Compaq Computer Corporation * Copyright © 2002 Hewlett-Packard Company * Copyright © 2006 Intel Corporation * Copyright © 2008 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting documentation, and * that the name of the copyright holders not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no representations * about the suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * * Author: Jim Gettys, Hewlett-Packard Company, Inc. * Keith Packard, Intel Corporation */ #ifdef HAVE_DIX_CONFIG_H #include <dix-config.h> #endif #ifndef _RANDRSTR_H_ #define _RANDRSTR_H_ #include <X11/X.h> #include <X11/Xproto.h> #include "misc.h" #include "os.h" #include "dixstruct.h" #include "resource.h" #include "scrnintstr.h" #include "windowstr.h" #include "pixmapstr.h" #include "extnsionst.h" #include "servermd.h" #include "rrtransform.h" #include <X11/extensions/randr.h> #include <X11/extensions/randrproto.h> #include <X11/extensions/render.h> /* we share subpixel order information */ #include "picturestr.h" #include <X11/Xfuncproto.h> /* required for ABI compatibility for now */ #define RANDR_10_INTERFACE 1 #define RANDR_12_INTERFACE 1 #define RANDR_13_INTERFACE 1 /* requires RANDR_12_INTERFACE */ #define RANDR_GET_CRTC_INTERFACE 1 #define RANDR_INTERFACE_VERSION 0x0103 typedef XID RRMode; typedef XID RROutput; typedef XID RRCrtc; typedef XID RRProvider; extern _X_EXPORT int RREventBase, RRErrorBase; extern _X_EXPORT int (*ProcRandrVector[RRNumberRequests]) (ClientPtr); extern _X_EXPORT int (*SProcRandrVector[RRNumberRequests]) (ClientPtr); /* * Modeline for a monitor. Name follows directly after this struct */ #define RRModeName(pMode) ((char *) (pMode + 1)) typedef struct _rrMode RRModeRec, *RRModePtr; typedef struct _rrPropertyValue RRPropertyValueRec, *RRPropertyValuePtr; typedef struct _rrProperty RRPropertyRec, *RRPropertyPtr; typedef struct _rrCrtc RRCrtcRec, *RRCrtcPtr; typedef struct _rrOutput RROutputRec, *RROutputPtr; typedef struct _rrProvider RRProviderRec, *RRProviderPtr; struct _rrMode { int refcnt; xRRModeInfo mode; char *name; ScreenPtr userScreen; }; struct _rrPropertyValue { Atom type; /* ignored by server */ short format; /* format of data for swapping - 8,16,32 */ long size; /* size of data in (format/8) bytes */ pointer data; /* private to client */ }; struct _rrProperty { RRPropertyPtr next; ATOM propertyName; Bool is_pending; Bool range; Bool immutable; int num_valid; INT32 *valid_values; RRPropertyValueRec current, pending; }; struct _rrCrtc { RRCrtc id; ScreenPtr pScreen; RRModePtr mode; int x, y; Rotation rotation; Rotation rotations; Bool changed; int numOutputs; RROutputPtr *outputs; int gammaSize; CARD16 *gammaRed; CARD16 *gammaBlue; CARD16 *gammaGreen; void *devPrivate; Bool transforms; RRTransformRec client_pending_transform; RRTransformRec client_current_transform; PictTransform transform; struct pict_f_transform f_transform; struct pict_f_transform f_inverse; PixmapPtr scanout_pixmap; }; struct _rrOutput { RROutput id; ScreenPtr pScreen; char *name; int nameLength; CARD8 connection; CARD8 subpixelOrder; int mmWidth; int mmHeight; RRCrtcPtr crtc; int numCrtcs; RRCrtcPtr *crtcs; int numClones; RROutputPtr *clones; int numModes; int numPreferred; RRModePtr *modes; int numUserModes; RRModePtr *userModes; Bool changed; RRPropertyPtr properties; Bool pendingProperties; void *devPrivate; }; struct _rrProvider { RRProvider id; ScreenPtr pScreen; uint32_t capabilities; char *name; int nameLength; RRPropertyPtr properties; Bool pendingProperties; struct _rrProvider *offload_sink; struct _rrProvider *output_source; }; #if RANDR_12_INTERFACE typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen, CARD16 width, CARD16 height, CARD32 mmWidth, CARD32 mmHeight); typedef Bool (*RRCrtcSetProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc, RRModePtr mode, int x, int y, Rotation rotation, int numOutputs, RROutputPtr * outputs); typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); typedef Bool (*RRCrtcGetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr pScreen, RROutputPtr output, Atom property, RRPropertyValuePtr value); typedef Bool (*RROutputValidateModeProcPtr) (ScreenPtr pScreen, RROutputPtr output, RRModePtr mode); typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, RRModePtr mode); #endif #if RANDR_13_INTERFACE typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen, RROutputPtr output, Atom property); typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea, BoxPtr trackingArea, INT16 *border); typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea, BoxPtr trackingArea, INT16 *border); #endif /* RANDR_13_INTERFACE */ typedef Bool (*RRProviderGetPropertyProcPtr) (ScreenPtr pScreen, RRProviderPtr provider, Atom property); typedef Bool (*RRProviderSetPropertyProcPtr) (ScreenPtr pScreen, RRProviderPtr provider, Atom property, RRPropertyValuePtr value); typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation * rotations); typedef Bool (*RRCloseScreenProcPtr) (ScreenPtr pscreen); typedef Bool (*RRProviderSetOutputSourceProcPtr)(ScreenPtr pScreen, RRProviderPtr provider, RRProviderPtr output_source); typedef Bool (*RRProviderSetOffloadSinkProcPtr)(ScreenPtr pScreen, RRProviderPtr provider, RRProviderPtr offload_sink); /* These are for 1.0 compatibility */ typedef struct _rrRefresh { CARD16 rate; RRModePtr mode; } RRScreenRate, *RRScreenRatePtr; typedef struct _rrScreenSize { int id; short width, height; short mmWidth, mmHeight; int nRates; RRScreenRatePtr pRates; } RRScreenSize, *RRScreenSizePtr; #ifdef RANDR_10_INTERFACE typedef Bool (*RRSetConfigProcPtr) (ScreenPtr pScreen, Rotation rotation, int rate, RRScreenSizePtr pSize); #endif typedef Bool (*RRCrtcSetScanoutPixmapProcPtr)(RRCrtcPtr crtc, PixmapPtr pixmap); typedef struct _rrScrPriv { /* * 'public' part of the structure; DDXen fill this in * as they initialize */ #if RANDR_10_INTERFACE RRSetConfigProcPtr rrSetConfig; #endif RRGetInfoProcPtr rrGetInfo; #if RANDR_12_INTERFACE RRScreenSetSizeProcPtr rrScreenSetSize; RRCrtcSetProcPtr rrCrtcSet; RRCrtcSetGammaProcPtr rrCrtcSetGamma; RRCrtcGetGammaProcPtr rrCrtcGetGamma; RROutputSetPropertyProcPtr rrOutputSetProperty; RROutputValidateModeProcPtr rrOutputValidateMode; RRModeDestroyProcPtr rrModeDestroy; #endif #if RANDR_13_INTERFACE RROutputGetPropertyProcPtr rrOutputGetProperty; RRGetPanningProcPtr rrGetPanning; RRSetPanningProcPtr rrSetPanning; #endif /* TODO #if RANDR_15_INTERFACE */ RRCrtcSetScanoutPixmapProcPtr rrCrtcSetScanoutPixmap; RRProviderSetOutputSourceProcPtr rrProviderSetOutputSource; RRProviderSetOffloadSinkProcPtr rrProviderSetOffloadSink; RRProviderGetPropertyProcPtr rrProviderGetProperty; RRProviderSetPropertyProcPtr rrProviderSetProperty; /* * Private part of the structure; not considered part of the ABI */ TimeStamp lastSetTime; /* last changed by client */ TimeStamp lastConfigTime; /* possible configs changed */ RRCloseScreenProcPtr CloseScreen; Bool changed; /* some config changed */ Bool configChanged; /* configuration changed */ Bool layoutChanged; /* screen layout changed */ CARD16 minWidth, minHeight; CARD16 maxWidth, maxHeight; CARD16 width, height; /* last known screen size */ CARD16 mmWidth, mmHeight; /* last known screen size */ int numOutputs; RROutputPtr *outputs; RROutputPtr primaryOutput; int numCrtcs; RRCrtcPtr *crtcs; /* Last known pointer position */ RRCrtcPtr pointerCrtc; #ifdef RANDR_10_INTERFACE /* * Configuration information */ Rotation rotations; CARD16 reqWidth, reqHeight; int nSizes; RRScreenSizePtr pSizes; Rotation rotation; int rate; int size; #endif Bool discontiguous; RRProviderPtr provider; } rrScrPrivRec, *rrScrPrivPtr; extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec; #define rrPrivKey (&rrPrivKeyRec) #define rrGetScrPriv(pScr) ((rrScrPrivPtr)dixLookupPrivate(&(pScr)->devPrivates, rrPrivKey)) #define rrScrPriv(pScr) rrScrPrivPtr pScrPriv = rrGetScrPriv(pScr) #define SetRRScreen(s,p) dixSetPrivate(&(s)->devPrivates, rrPrivKey, p) /* * each window has a list of clients requesting * RRNotify events. Each client has a resource * for each window it selects RRNotify input for, * this resource is used to delete the RRNotifyRec * entry from the per-window queue. */ typedef struct _RREvent *RREventPtr; typedef struct _RREvent { RREventPtr next; ClientPtr client; WindowPtr window; XID clientResource; int mask; } RREventRec; typedef struct _RRTimes { TimeStamp setTime; TimeStamp configTime; } RRTimesRec, *RRTimesPtr; typedef struct _RRClient { int major_version; int minor_version; /* RRTimesRec times[0]; */ } RRClientRec, *RRClientPtr; extern _X_EXPORT RESTYPE RRClientType, RREventType; /* resource types for event masks */ extern _X_EXPORT DevPrivateKeyRec RRClientPrivateKeyRec; #define RRClientPrivateKey (&RRClientPrivateKeyRec) extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType, RRProviderType; #define VERIFY_RR_OUTPUT(id, ptr, a)\ {\ int rc = dixLookupResourceByType((pointer *)&(ptr), id,\ RROutputType, client, a);\ if (rc != Success) {\ client->errorValue = id;\ return rc;\ }\ } #define VERIFY_RR_CRTC(id, ptr, a)\ {\ int rc = dixLookupResourceByType((pointer *)&(ptr), id,\ RRCrtcType, client, a);\ if (rc != Success) {\ client->errorValue = id;\ return rc;\ }\ } #define VERIFY_RR_MODE(id, ptr, a)\ {\ int rc = dixLookupResourceByType((pointer *)&(ptr), id,\ RRModeType, client, a);\ if (rc != Success) {\ client->errorValue = id;\ return rc;\ }\ } #define VERIFY_RR_PROVIDER(id, ptr, a)\ {\ int rc = dixLookupResourceByType((pointer *)&(ptr), id,\ RRProviderType, client, a);\ if (rc != Success) {\ client->errorValue = id;\ return rc;\ }\ } #define GetRRClient(pClient) ((RRClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RRClientPrivateKey)) #define rrClientPriv(pClient) RRClientPtr pRRClient = GetRRClient(pClient) #ifdef RANDR_12_INTERFACE /* * Set the range of sizes for the screen */ extern _X_EXPORT void RRScreenSetSizeRange(ScreenPtr pScreen, CARD16 minWidth, CARD16 minHeight, CARD16 maxWidth, CARD16 maxHeight); #endif /* rrscreen.c */ /* * Notify the extension that the screen size has been changed. * The driver is responsible for calling this whenever it has changed * the size of the screen */ extern _X_EXPORT void RRScreenSizeNotify(ScreenPtr pScreen); /* * Request that the screen be resized */ extern _X_EXPORT Bool RRScreenSizeSet(ScreenPtr pScreen, CARD16 width, CARD16 height, CARD32 mmWidth, CARD32 mmHeight); /* * Send ConfigureNotify event to root window when 'something' happens */ extern _X_EXPORT void RRSendConfigNotify(ScreenPtr pScreen); /* * screen dispatch */ extern _X_EXPORT int ProcRRGetScreenSizeRange(ClientPtr client); extern _X_EXPORT int ProcRRSetScreenSize(ClientPtr client); extern _X_EXPORT int ProcRRGetScreenResources(ClientPtr client); extern _X_EXPORT int ProcRRGetScreenResourcesCurrent(ClientPtr client); extern _X_EXPORT int ProcRRSetScreenConfig(ClientPtr client); extern _X_EXPORT int ProcRRGetScreenInfo(ClientPtr client); /* * Deliver a ScreenNotify event */ extern _X_EXPORT void RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen); /* randr.c */ /* * Send all pending events */ extern _X_EXPORT void RRTellChanged(ScreenPtr pScreen); /* * Poll the driver for changed information */ extern _X_EXPORT Bool RRGetInfo(ScreenPtr pScreen, Bool force_query); extern _X_EXPORT Bool RRInit(void); extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen); extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen); extern _X_EXPORT CARD16 RRVerticalRefresh(xRRModeInfo * mode); #ifdef RANDR_10_INTERFACE /* * This is the old interface, deprecated but left * around for compatibility */ /* * Then, register the specific size with the screen */ extern _X_EXPORT RRScreenSizePtr RRRegisterSize(ScreenPtr pScreen, short width, short height, short mmWidth, short mmHeight); extern _X_EXPORT Bool RRRegisterRate(ScreenPtr pScreen, RRScreenSizePtr pSize, int rate); /* * Finally, set the current configuration of the screen */ extern _X_EXPORT void RRSetCurrentConfig(ScreenPtr pScreen, Rotation rotation, int rate, RRScreenSizePtr pSize); extern _X_EXPORT Rotation RRGetRotation(ScreenPtr pScreen); #endif /* rrcrtc.c */ /* * Notify the CRTC of some change; layoutChanged indicates that * some position or size element changed */ extern _X_EXPORT void RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged); /* * Create a CRTC */ extern _X_EXPORT RRCrtcPtr RRCrtcCreate(ScreenPtr pScreen, void *devPrivate); /* * Set the allowed rotations on a CRTC */ extern _X_EXPORT void RRCrtcSetRotations(RRCrtcPtr crtc, Rotation rotations); /* * Set whether transforms are allowed on a CRTC */ extern _X_EXPORT void RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms); /* * Notify the extension that the Crtc has been reconfigured, * the driver calls this whenever it has updated the mode */ extern _X_EXPORT Bool RRCrtcNotify(RRCrtcPtr crtc, RRModePtr mode, int x, int y, Rotation rotation, RRTransformPtr transform, int numOutputs, RROutputPtr * outputs); extern _X_EXPORT void RRDeliverCrtcEvent(ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc); /* * Request that the Crtc be reconfigured */ extern _X_EXPORT Bool RRCrtcSet(RRCrtcPtr crtc, RRModePtr mode, int x, int y, Rotation rotation, int numOutput, RROutputPtr * outputs); /* * Request that the Crtc gamma be changed */ extern _X_EXPORT Bool RRCrtcGammaSet(RRCrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue); /* * Request current gamma back from the DDX (if possible). * This includes gamma size. */ extern _X_EXPORT Bool RRCrtcGammaGet(RRCrtcPtr crtc); /* * Notify the extension that the Crtc gamma has been changed * The driver calls this whenever it has changed the gamma values * in the RRCrtcRec */ extern _X_EXPORT Bool RRCrtcGammaNotify(RRCrtcPtr crtc); /* * Set the size of the gamma table at server startup time */ extern _X_EXPORT Bool RRCrtcGammaSetSize(RRCrtcPtr crtc, int size); /* * Return the area of the frame buffer scanned out by the crtc, * taking into account the current mode and rotation */ extern _X_EXPORT void RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height); /* * Return crtc transform */ extern _X_EXPORT RRTransformPtr RRCrtcGetTransform(RRCrtcPtr crtc); /* * Check whether the pending and current transforms are the same */ extern _X_EXPORT Bool RRCrtcPendingTransform(RRCrtcPtr crtc); /* * Destroy a Crtc at shutdown */ extern _X_EXPORT void RRCrtcDestroy(RRCrtcPtr crtc); /* * Set the pending CRTC transformation */ extern _X_EXPORT int RRCrtcTransformSet(RRCrtcPtr crtc, PictTransformPtr transform, struct pict_f_transform *f_transform, struct pict_f_transform *f_inverse, char *filter, int filter_len, xFixed * params, int nparams); /* * Initialize crtc type */ extern _X_EXPORT Bool RRCrtcInit(void); /* * Initialize crtc type error value */ extern _X_EXPORT void RRCrtcInitErrorValue(void); /* * Detach and free a scanout pixmap */ extern _X_EXPORT void RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc); extern _X_EXPORT Bool RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable); /* * Crtc dispatch */ extern _X_EXPORT int ProcRRGetCrtcInfo(ClientPtr client); extern _X_EXPORT int ProcRRSetCrtcConfig(ClientPtr client); extern _X_EXPORT int ProcRRGetCrtcGammaSize(ClientPtr client); extern _X_EXPORT int ProcRRGetCrtcGamma(ClientPtr client); extern _X_EXPORT int ProcRRSetCrtcGamma(ClientPtr client); extern _X_EXPORT int ProcRRSetCrtcTransform(ClientPtr client); extern _X_EXPORT int ProcRRGetCrtcTransform(ClientPtr client); int ProcRRGetPanning(ClientPtr client); int ProcRRSetPanning(ClientPtr client); void RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *); /* rrdispatch.c */ extern _X_EXPORT Bool RRClientKnowsRates(ClientPtr pClient); /* rrmode.c */ /* * Find, and if necessary, create a mode */ extern _X_EXPORT RRModePtr RRModeGet(xRRModeInfo * modeInfo, const char *name); /* * Destroy a mode. */ extern _X_EXPORT void RRModeDestroy(RRModePtr mode); /* * Return a list of modes that are valid for some output in pScreen */ extern _X_EXPORT RRModePtr *RRModesForScreen(ScreenPtr pScreen, int *num_ret); /* * Initialize mode type */ extern _X_EXPORT Bool RRModeInit(void); /* * Initialize mode type error value */ extern _X_EXPORT void RRModeInitErrorValue(void); extern _X_EXPORT int ProcRRCreateMode(ClientPtr client); extern _X_EXPORT int ProcRRDestroyMode(ClientPtr client); extern _X_EXPORT int ProcRRAddOutputMode(ClientPtr client); extern _X_EXPORT int ProcRRDeleteOutputMode(ClientPtr client); /* rroutput.c */ /* * Notify the output of some change. configChanged indicates whether * any external configuration (mode list, clones, connected status) * has changed, or whether the change was strictly internal * (which crtc is in use) */ extern _X_EXPORT void RROutputChanged(RROutputPtr output, Bool configChanged); /* * Create an output */ extern _X_EXPORT RROutputPtr RROutputCreate(ScreenPtr pScreen, const char *name, int nameLength, void *devPrivate); /* * Notify extension that output parameters have been changed */ extern _X_EXPORT Bool RROutputSetClones(RROutputPtr output, RROutputPtr * clones, int numClones); extern _X_EXPORT Bool RROutputSetModes(RROutputPtr output, RRModePtr * modes, int numModes, int numPreferred); extern _X_EXPORT int RROutputAddUserMode(RROutputPtr output, RRModePtr mode); extern _X_EXPORT int RROutputDeleteUserMode(RROutputPtr output, RRModePtr mode); extern _X_EXPORT Bool RROutputSetCrtcs(RROutputPtr output, RRCrtcPtr * crtcs, int numCrtcs); extern _X_EXPORT Bool RROutputSetConnection(RROutputPtr output, CARD8 connection); extern _X_EXPORT Bool RROutputSetSubpixelOrder(RROutputPtr output, int subpixelOrder); extern _X_EXPORT Bool RROutputSetPhysicalSize(RROutputPtr output, int mmWidth, int mmHeight); extern _X_EXPORT void RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output); extern _X_EXPORT void RROutputDestroy(RROutputPtr output); extern _X_EXPORT int ProcRRGetOutputInfo(ClientPtr client); extern _X_EXPORT int ProcRRSetOutputPrimary(ClientPtr client); extern _X_EXPORT int ProcRRGetOutputPrimary(ClientPtr client); /* * Initialize output type */ extern _X_EXPORT Bool RROutputInit(void); /* * Initialize output type error value */ extern _X_EXPORT void RROutputInitErrorValue(void); /* rrpointer.c */ extern _X_EXPORT void RRPointerMoved(ScreenPtr pScreen, int x, int y); extern _X_EXPORT void RRPointerScreenConfigured(ScreenPtr pScreen); /* rrproperty.c */ extern _X_EXPORT void RRDeleteAllOutputProperties(RROutputPtr output); extern _X_EXPORT RRPropertyValuePtr RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending); extern _X_EXPORT RRPropertyPtr RRQueryOutputProperty(RROutputPtr output, Atom property); extern _X_EXPORT void RRDeleteOutputProperty(RROutputPtr output, Atom property); extern _X_EXPORT Bool RRPostPendingProperties(RROutputPtr output); extern _X_EXPORT int RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type, int format, int mode, unsigned long len, pointer value, Bool sendevent, Bool pending); extern _X_EXPORT int RRConfigureOutputProperty(RROutputPtr output, Atom property, Bool pending, Bool range, Bool immutable, int num_values, INT32 *values); extern _X_EXPORT int ProcRRChangeOutputProperty(ClientPtr client); extern _X_EXPORT int ProcRRGetOutputProperty(ClientPtr client); extern _X_EXPORT int ProcRRListOutputProperties(ClientPtr client); extern _X_EXPORT int ProcRRQueryOutputProperty(ClientPtr client); extern _X_EXPORT int ProcRRConfigureOutputProperty(ClientPtr client); extern _X_EXPORT int ProcRRDeleteOutputProperty(ClientPtr client); /* rrprovider.c */ extern _X_EXPORT void RRProviderInitErrorValue(void); extern _X_EXPORT int ProcRRGetProviders(ClientPtr client); extern _X_EXPORT int ProcRRGetProviderInfo(ClientPtr client); extern _X_EXPORT int ProcRRSetProviderOutputSource(ClientPtr client); extern _X_EXPORT int ProcRRSetProviderOffloadSink(ClientPtr client); extern _X_EXPORT Bool RRProviderInit(void); extern _X_EXPORT RRProviderPtr RRProviderCreate(ScreenPtr pScreen, const char *name, int nameLength); extern _X_EXPORT void RRProviderDestroy (RRProviderPtr provider); extern _X_EXPORT void RRProviderSetCapabilities(RRProviderPtr provider, uint32_t capabilities); extern _X_EXPORT Bool RRProviderLookup(XID id, RRProviderPtr *provider_p); /* rrproviderproperty.c */ extern _X_EXPORT void RRDeleteAllProviderProperties(RRProviderPtr provider); extern _X_EXPORT RRPropertyValuePtr RRGetProviderProperty(RRProviderPtr provider, Atom property, Bool pending); extern _X_EXPORT RRPropertyPtr RRQueryProviderProperty(RRProviderPtr provider, Atom property); extern _X_EXPORT void RRDeleteProviderProperty(RRProviderPtr provider, Atom property); extern _X_EXPORT int RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type, int format, int mode, unsigned long len, pointer value, Bool sendevent, Bool pending); extern _X_EXPORT int ProcRRGetProviderProperty(ClientPtr client); extern _X_EXPORT int ProcRRListProviderProperties(ClientPtr client); extern _X_EXPORT int ProcRRQueryProviderProperty(ClientPtr client); extern _X_EXPORT int ProcRRConfigureProviderProperty(ClientPtr client); extern _X_EXPORT int ProcRRChangeProviderProperty(ClientPtr client); extern _X_EXPORT int ProcRRDeleteProviderProperty(ClientPtr client); /* rrxinerama.c */ #ifdef XINERAMA extern _X_EXPORT void RRXineramaExtensionInit(void); #endif #endif /* _RANDRSTR_H_ */ /* randr extension implementation structure Query state: ProcRRGetScreenInfo/ProcRRGetScreenResources RRGetInfo • Request configuration from driver, either 1.0 or 1.2 style • These functions only record state changes, all other actions are pended until RRTellChanged is called ->rrGetInfo 1.0: RRRegisterSize RRRegisterRate RRSetCurrentConfig 1.2: RRScreenSetSizeRange RROutputSetCrtcs RRModeGet RROutputSetModes RROutputSetConnection RROutputSetSubpixelOrder RROutputSetClones RRCrtcNotify • Must delay scanning configuration until after ->rrGetInfo returns because some drivers will call SetCurrentConfig in the middle of the ->rrGetInfo operation. 1.0: • Scan old configuration, mirror to new structures RRScanOldConfig RRCrtcCreate RROutputCreate RROutputSetCrtcs RROutputSetConnection RROutputSetSubpixelOrder RROldModeAdd • This adds modes one-at-a-time RRModeGet RRCrtcNotify • send events, reset pointer if necessary RRTellChanged WalkTree (sending events) • when layout has changed: RRPointerScreenConfigured RRSendConfigNotify Asynchronous state setting (1.2 only) When setting state asynchronously, the driver invokes the ->rrGetInfo function and then calls RRTellChanged to flush the changes to the clients and reset pointer if necessary Set state ProcRRSetScreenConfig RRCrtcSet 1.2: ->rrCrtcSet RRCrtcNotify 1.0: ->rrSetConfig RRCrtcNotify RRTellChanged */