490 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			490 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * 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
 | |
|  */
 | |
| 
 | |
| #ifndef _XSERVER_RANDRSTR_PRIV_H_
 | |
| #define _XSERVER_RANDRSTR_PRIV_H_
 | |
| 
 | |
| #include <X11/Xdefs.h>
 | |
| 
 | |
| #include "randrstr.h"
 | |
| 
 | |
| extern int RREventBase, RRErrorBase;
 | |
| 
 | |
| extern RESTYPE RRClientType, RREventType;     /* resource types for event masks */
 | |
| extern DevPrivateKeyRec RRClientPrivateKeyRec;
 | |
| 
 | |
| /* see also randr/randrstr.h: some still need to be exported for legacy Nvidia */
 | |
| extern RESTYPE RRProviderType;  /* X resource type: Randr PROVIDER */
 | |
| extern RESTYPE RRLeaseType;     /* X resource type: Randr LEASE */
 | |
| 
 | |
| #define RRClientPrivateKey (&RRClientPrivateKeyRec)
 | |
| 
 | |
| #define VERIFY_RR_OUTPUT(id, ptr, a)\
 | |
|     {\
 | |
| 	int rc = dixLookupResourceByType((void **)&(ptr), id,\
 | |
| 	                                 RROutputType, client, a);\
 | |
| 	if (rc != Success) {\
 | |
| 	    client->errorValue = id;\
 | |
| 	    return rc;\
 | |
| 	}\
 | |
|     }
 | |
| 
 | |
| #define VERIFY_RR_CRTC(id, ptr, a)\
 | |
|     {\
 | |
| 	int rc = dixLookupResourceByType((void **)&(ptr), id,\
 | |
| 	                                 RRCrtcType, client, a);\
 | |
| 	if (rc != Success) {\
 | |
| 	    client->errorValue = id;\
 | |
| 	    return rc;\
 | |
| 	}\
 | |
|     }
 | |
| 
 | |
| #define VERIFY_RR_MODE(id, ptr, a)\
 | |
|     {\
 | |
| 	int rc = dixLookupResourceByType((void **)&(ptr), id,\
 | |
| 	                                 RRModeType, client, a);\
 | |
| 	if (rc != Success) {\
 | |
| 	    client->errorValue = id;\
 | |
| 	    return rc;\
 | |
| 	}\
 | |
|     }
 | |
| 
 | |
| #define VERIFY_RR_PROVIDER(id, ptr, a)\
 | |
|     {\
 | |
|         int rc = dixLookupResourceByType((void **)&(ptr), id,\
 | |
|                                          RRProviderType, client, a);\
 | |
|         if (rc != Success) {\
 | |
|             client->errorValue = id;\
 | |
|             return rc;\
 | |
|         }\
 | |
|     }
 | |
| 
 | |
| #define VERIFY_RR_LEASE(id, ptr, a)\
 | |
|     {\
 | |
|         int rc = dixLookupResourceByType((void **)&(ptr), id,\
 | |
|                                          RRLeaseType, 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)
 | |
| 
 | |
| void RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *);
 | |
| 
 | |
| /* rrlease.c */
 | |
| void RRDeliverLeaseEvent(ClientPtr client, WindowPtr window);
 | |
| 
 | |
| void RRTerminateLease(RRLeasePtr lease);
 | |
| 
 | |
| Bool RRLeaseInit(void);
 | |
| 
 | |
| /* rrprovider.c */
 | |
| #define PRIME_SYNC_PROP         "PRIME Synchronization"
 | |
| 
 | |
| void RRMonitorInit(ScreenPtr screen);
 | |
| 
 | |
| Bool RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, int *nmon_ret);
 | |
| 
 | |
| int RRMonitorCountList(ScreenPtr screen);
 | |
| 
 | |
| void RRMonitorFreeList(RRMonitorPtr monitors, int nmon);
 | |
| 
 | |
| void RRMonitorClose(ScreenPtr screen);
 | |
| 
 | |
| RRMonitorPtr RRMonitorAlloc(int noutput);
 | |
| 
 | |
| int RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor);
 | |
| 
 | |
| void RRMonitorFree(RRMonitorPtr monitor);
 | |
| 
 | |
| /*
 | |
|  * Deliver a ScreenChangeNotity event to given client
 | |
|  *
 | |
|  * @param pClient the client to notify
 | |
|  * @param pWin    the window to refer to in the event
 | |
|  * @param pScreen the screen where the change happened
 | |
|  */
 | |
| void RRDeliverScreenEvent(ClientPtr pClient, WindowPtr pWin, ScreenPtr pScreen);
 | |
| 
 | |
| /*
 | |
|  * Mark screen resources as changed, so listeners will get updates on them.
 | |
|  *
 | |
|  * @param pScreen the screen where changes occoured
 | |
|  */
 | |
| void RRResourcesChanged(ScreenPtr pScreen);
 | |
| 
 | |
| /*
 | |
|  * Initialize randr subsystem
 | |
|  *
 | |
|  * @return TRUE on success
 | |
|  */
 | |
| Bool RRInit(void);
 | |
| 
 | |
| /*
 | |
|  * Retrieve the first enabled CRTC on given screen
 | |
|  *
 | |
|  * @param pScreen the screen to query
 | |
|  * @return pointer to CRTC structure or NULL
 | |
|  */
 | |
| RRCrtcPtr RRFirstEnabledCrtc(ScreenPtr pScreen);
 | |
| 
 | |
| /*
 | |
|  * Compute vertical refresh rate from randr mode information
 | |
|  *
 | |
|  * @param mode pointer to randr mode info
 | |
|  * @return vertical refresh rate
 | |
|  */
 | |
| CARD16 RRVerticalRefresh(xRRModeInfo * mode);
 | |
| 
 | |
| /*
 | |
|  * Tests if findCrtc belongs to pScreen or secondary screens
 | |
|  *
 | |
|  * @param pScreen the screen to check on
 | |
|  * @param findCrtc the Crtc to check for
 | |
|  * @return TRUE if given CRTC belongs to pScreen / secondard screens
 | |
|  */
 | |
| Bool RRCrtcExists(ScreenPtr pScreen, RRCrtcPtr findCrtc);
 | |
| 
 | |
| /*
 | |
|  * Set whether transforms are allowed on a CRTC
 | |
|  *
 | |
|  * @param crtc the CRTC to set the flag on
 | |
|  * @param transforms TRUE if transforms are allowed
 | |
|  */
 | |
| void RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms);
 | |
| 
 | |
| /*
 | |
|  * Deliver CRTC update event to given client
 | |
|  *
 | |
|  * @param pClient the client to send event to
 | |
|  * @param pWin    the window whose screen had been changed
 | |
|  * @param crtc    the CRTC that had been changed
 | |
|  */
 | |
| void RRDeliverCrtcEvent(ClientPtr pClient, WindowPtr pWin, RRCrtcPtr crtc);
 | |
| 
 | |
| /*
 | |
|  * Destroy a Crtc at shutdown
 | |
|  *
 | |
|  * @param crtc    the CRTC to destroy
 | |
|  */
 | |
| void RRCrtcDestroy(RRCrtcPtr crtc);
 | |
| 
 | |
| /*
 | |
|  * Initialize crtc resource type
 | |
|  */
 | |
| Bool RRCrtcInit(void);
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Initialize crtc type error value
 | |
|  */
 | |
| void RRCrtcInitErrorValue(void);
 | |
| 
 | |
| /*
 | |
|  * Handler for the ReplaceScanoutPixmap screen proc
 | |
|  * Should not be called directly.
 | |
|  */
 | |
| Bool RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable);
 | |
| 
 | |
| /*
 | |
|  * Check whether given screen has any scanout pixmap attached
 | |
|  *
 | |
|  * @param pScreen the screen to check
 | |
|  * @return TRUE if the screen has a scanout pixmap attached
 | |
|  */
 | |
| Bool RRHasScanoutPixmap(ScreenPtr pScreen);
 | |
| 
 | |
| /*
 | |
|  * Called by DIX to notify RANDR extension that a lease had been terminated.
 | |
|  *
 | |
|  * @param lease   the lease that had been terminated
 | |
|  */
 | |
| void RRLeaseTerminated(RRLeasePtr lease);
 | |
| 
 | |
| /*
 | |
|  * Free a RRLease structure
 | |
|  *
 | |
|  * @param lease   pointer to the lease to be freed
 | |
|  */
 | |
| void RRLeaseFree(RRLeasePtr lease);
 | |
| 
 | |
| /*
 | |
|  * Check whether given CRTC has an active lease
 | |
|  *
 | |
|  * @param crtc    the CRTC to check
 | |
|  * @return TRUE if there is any active lease on that CRTC
 | |
|  */
 | |
| Bool RRCrtcIsLeased(RRCrtcPtr crtc);
 | |
| 
 | |
| /*
 | |
|  * Check whether given output is leased
 | |
|  *
 | |
|  * @param output  the output to check
 | |
|  * @return TRUE if theere is any active lease on that output
 | |
|  */
 | |
| Bool RROutputIsLeased(RROutputPtr output);
 | |
| 
 | |
| /*
 | |
|  * Query a list of modes valid for some output in given screen
 | |
|  *
 | |
|  + The list is allocated by that function and must be freed by caller.
 | |
|  * `num_ret` holds the number of entries (the buffer might be larger)
 | |
|  *
 | |
|  * @param pScreen the screen to query
 | |
|  * @param num_ret return buffer for number of returned modes
 | |
|  * @return pointer to array of RRModePtr's
 | |
|  */
 | |
| RRModePtr *RRModesForScreen(ScreenPtr pScreen, int *num_ret);
 | |
| 
 | |
| /*
 | |
|  * Initialize mode resource type
 | |
|  *
 | |
|  * @return TRUE on success
 | |
|  */
 | |
| Bool RRModeInit(void);
 | |
| 
 | |
| /*
 | |
|  * Initialize mode type error value
 | |
|  *
 | |
|  * @return TRUE on success
 | |
|  */
 | |
| void RRModeInitErrorValue(void);
 | |
| 
 | |
| /*
 | |
|  * Add user-given mode to output
 | |
|  *
 | |
|  * @param output  the output where to which a mode should be added
 | |
|  * @param mode    the mode to add to the output
 | |
|  * @return X error code
 | |
|  */
 | |
| int RROutputAddUserMode(RROutputPtr output, RRModePtr mode);
 | |
| 
 | |
| /*
 | |
|  * Delete user-given mode (that had been added via RROutputAddUserMode)
 | |
|  * from output.
 | |
|  *
 | |
|  * @param output  the output from which the mode is to be removed
 | |
|  * @param mode    the mode to be removed from output
 | |
|  * @return X error code
 | |
|  */
 | |
| int RROutputDeleteUserMode(RROutputPtr output, RRModePtr mode);
 | |
| 
 | |
| /*
 | |
|  * Set subpixel order on given output
 | |
|  *
 | |
|  * @param output  the output to set subpixel order on
 | |
|  * @param order   subpixel order value to set
 | |
|  */
 | |
| void RROutputSetSubpixelOrder(RROutputPtr output, int order);
 | |
| 
 | |
| /*
 | |
|  * Deliver RROutputChangeNotify event to client
 | |
|  *
 | |
|  * @param pClient the client to send notify even to
 | |
|  * @param pWin    the window who's screen is acted on
 | |
|  * @param output  the output who's changes are delivered
 | |
|  */
 | |
| void RRDeliverOutputEvent(ClientPtr pClient, WindowPtr pWin, RROutputPtr output);
 | |
| 
 | |
| /*
 | |
|  * Initialize output resource type
 | |
|  *
 | |
|  * @return TRUE on success
 | |
|  */
 | |
| Bool RROutputInit(void);
 | |
| 
 | |
| /*
 | |
|  * Initialize output type error value
 | |
|  */
 | |
| void RROutputInitErrorValue(void);
 | |
| 
 | |
| /*
 | |
|  * When the screen is reconfigured, move all pointers to the nearest
 | |
|  * CRTC
 | |
|  *
 | |
|  * @param pScreen the screen that had been reconfigured
 | |
|  */
 | |
| void RRPointerScreenConfigured(ScreenPtr pScreen);
 | |
| 
 | |
| /*
 | |
|  * Retrieve output property value
 | |
|  *
 | |
|  * @param output  the output to query
 | |
|  * @param property Atom ID of the property to retrieve
 | |
|  * @param pending  retrieve pending instead of current value
 | |
|  * @return pointer to property value or NULL (if not found)
 | |
|  */
 | |
| RRPropertyValuePtr RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending);
 | |
| 
 | |
| /*
 | |
|  * Retrieve full property structure from output
 | |
|  *
 | |
|  * @param output    the output to query
 | |
|  * @param property  Atom ID of the property to query
 | |
|  * @return pointer to property structure, or NULL if not found
 | |
|  */
 | |
| RRPropertyPtr RRQueryOutputProperty(RROutputPtr output, Atom property);
 | |
| 
 | |
| /*
 | |
|  * Delete all properties on given output
 | |
|  *
 | |
|  * @param output  the output whose properties shall be deleted
 | |
|  */
 | |
| void RRDeleteAllOutputProperties(RROutputPtr output);
 | |
| 
 | |
| /*
 | |
|  * Initialize render provider resource type
 | |
|  *
 | |
|  * @return TRUE on success
 | |
|  */
 | |
| Bool RRProviderInit(void);
 | |
| 
 | |
| /*
 | |
|  * Initialize RR provider error values
 | |
|  */
 | |
| void RRProviderInitErrorValue(void);
 | |
| 
 | |
| /*
 | |
|  * Destroy a provider and free it's memory
 | |
|  *
 | |
|  * @param provider  the provider to be destroyed
 | |
|  */
 | |
| void RRProviderDestroy (RRProviderPtr provider);
 | |
| 
 | |
| /*
 | |
|  * Deliver provider ProviderChangeNotify event to client
 | |
|  *
 | |
|  * @param pClient   the client to send even to
 | |
|  * @param pWin      the window whose screen was changed
 | |
|  * @param provider  the provider which was changed
 | |
|  */
 | |
| void RRDeliverProviderEvent(ClientPtr pClient, WindowPtr pWin, RRProviderPtr provider);
 | |
| 
 | |
| /*
 | |
|  * Auto configure a GPU screen
 | |
|  *
 | |
|  * @param pScreen         the GPU screen to configure
 | |
|  * @param primaryScreen   the associated primary screen
 | |
|  */
 | |
| void RRProviderAutoConfigGpuScreen(ScreenPtr pScreen, ScreenPtr primaryScreen);
 | |
| 
 | |
| /*
 | |
|  * Retrieve property value from provider
 | |
|  *
 | |
|  * @param provider  the provider to query
 | |
|  * @param property  Atom ID of the property to retrieve
 | |
|  * @param pending   TRUE if pending (instead of current) value shall be fetched
 | |
|  * @return pointer to property value if found, otherwise NULL
 | |
|  */
 | |
| RRPropertyValuePtr RRGetProviderProperty(RRProviderPtr provider, Atom property, Bool pending);
 | |
| 
 | |
| /*
 | |
|  * Retrieve full property structure
 | |
|  * (instead of just the value -- @see RRGetProviderProperty)
 | |
|  *
 | |
|  * @param provider  the provider to query
 | |
|  * @param property  Atom ID of the property to retrieve
 | |
|  * @return pointer to render property structure if found, otherwise NULL
 | |
|  */
 | |
| RRPropertyPtr  RRQueryProviderProperty(RRProviderPtr provider, Atom property);
 | |
| 
 | |
| /*
 | |
|  * Delete property from provider
 | |
|  *
 | |
|  * @param provider  the provider to remove property from
 | |
|  * @param property  Atom ID of the property to remove
 | |
|  */
 | |
| void RRDeleteProviderProperty(RRProviderPtr provider, Atom property);
 | |
| 
 | |
| /*
 | |
|  * Change property of provider
 | |
|  *
 | |
|  * @param provider  the provider to change property on
 | |
|  * @param property  Atom ID of the property to change
 | |
|  * @param type      type Atom ID of the new property value
 | |
|  * @param format    format (8/16/32) of the new property value
 | |
|  * @param len       length in (format specific) units of the new property value
 | |
|  * @param value     pointer to value data
 | |
|  * @param sendevent TRUE when change notify event shall be sent
 | |
|  * @param pending   TRUE when pending instead of current value shall be changed
 | |
|  * @return X error code
 | |
|  */
 | |
| int RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type,
 | |
|                              int format, int mode, unsigned long len,
 | |
|                              void *value, Bool sendevent, Bool pending);
 | |
| 
 | |
| /*
 | |
|  * Configure a (custom) property in given provider
 | |
|  *
 | |
|  * @param provider  the provider to configure property in
 | |
|  * @param property  Atom ID of the property
 | |
|  * @param pending   TRUE on pending value
 | |
|  * @param range     TRUE when limited range
 | |
|  * @param immutable TRUE when it's immutable
 | |
|  * @param num_values number of allowed values
 | |
|  * @param values     allowed values (array of num_values length)
 | |
|  */
 | |
| int RRConfigureProviderProperty(RRProviderPtr provider, Atom property,
 | |
|                                 Bool pending, Bool range, Bool immutable,
 | |
|                                 int num_values, INT32 *values);
 | |
| 
 | |
| /*
 | |
|  * Init xinerama specific extension parts
 | |
|  */
 | |
| void RRXineramaExtensionInit(void);
 | |
| 
 | |
| /*
 | |
|  * Init transform structure
 | |
|  *
 | |
|  * @param transform   the transform structure to initialized
 | |
|  */
 | |
| void RRTransformInit(RRTransformPtr transform);
 | |
| 
 | |
| /*
 | |
|  * Compare two transform structures
 | |
|  *
 | |
|  * @param a   first transform
 | |
|  * @param b   second transform
 | |
|  * @return TRUE if both transforms are equal
 | |
|  */
 | |
| Bool RRTransformEqual(RRTransformPtr a, RRTransformPtr b);
 | |
| 
 | |
| /*
 | |
|  * Copy transform structure to another
 | |
|  *
 | |
|  * @param dst destination structure pointer
 | |
|  * @param src source structure pointer
 | |
|  * @return TRUE on success
 | |
|  */
 | |
| Bool RRTransformCopy(RRTransformPtr dst, RRTransformPtr src);
 | |
| 
 | |
| #endif /* _XSERVER_RANDRSTR_PRIV_H_ */
 |