RandR: Add a driver func to let the driver determine the physical size of a
screen size (display mode). Useful for faked widescreen modes, modes which are scaled by the driver, etc. This really helps fixing RandR's sometimes dumb DPI assumptions.
This commit is contained in:
parent
c818d3a1a5
commit
7993486e80
|
@ -69,17 +69,30 @@ xf86RandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
|
|||
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||
DisplayModePtr mode;
|
||||
int refresh0 = 60;
|
||||
xorgRRModeMM RRModeMM;
|
||||
|
||||
*rotations = RR_Rotate_0;
|
||||
|
||||
for (mode = scrp->modes; ; mode = mode->next)
|
||||
{
|
||||
int refresh = xf86RandRModeRefresh (mode);
|
||||
|
||||
if (mode == scrp->modes)
|
||||
refresh0 = refresh;
|
||||
|
||||
RRModeMM.mode = mode;
|
||||
RRModeMM.virtX = randrp->virtualX;
|
||||
RRModeMM.virtY = randrp->virtualY;
|
||||
RRModeMM.mmWidth = randrp->mmWidth;
|
||||
RRModeMM.mmHeight = randrp->mmHeight;
|
||||
|
||||
if(scrp->DriverFunc) {
|
||||
(*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
|
||||
}
|
||||
|
||||
pSize = RRRegisterSize (pScreen,
|
||||
mode->HDisplay, mode->VDisplay,
|
||||
randrp->mmWidth, randrp->mmHeight);
|
||||
RRModeMM.mmWidth, RRModeMM.mmHeight);
|
||||
if (!pSize)
|
||||
return FALSE;
|
||||
RRRegisterRate (pScreen, pSize, refresh);
|
||||
|
@ -93,10 +106,20 @@ xf86RandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
|
|||
scrp->currentMode->VDisplay != randrp->virtualY)
|
||||
{
|
||||
mode = scrp->modes;
|
||||
|
||||
RRModeMM.mode = NULL;
|
||||
RRModeMM.virtX = randrp->virtualX;
|
||||
RRModeMM.virtY = randrp->virtualY;
|
||||
RRModeMM.mmWidth = randrp->mmWidth;
|
||||
RRModeMM.mmHeight = randrp->mmHeight;
|
||||
|
||||
if(scrp->DriverFunc) {
|
||||
(*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
|
||||
}
|
||||
|
||||
pSize = RRRegisterSize (pScreen,
|
||||
randrp->virtualX, randrp->virtualY,
|
||||
randrp->mmWidth,
|
||||
randrp->mmHeight);
|
||||
RRModeMM.mmWidth, RRModeMM.mmHeight);
|
||||
if (!pSize)
|
||||
return FALSE;
|
||||
RRRegisterRate (pScreen, pSize, refresh0);
|
||||
|
|
|
@ -247,6 +247,7 @@ typedef struct _ScrnInfoRec *ScrnInfoPtr;
|
|||
typedef enum {
|
||||
RR_GET_INFO,
|
||||
RR_SET_CONFIG,
|
||||
RR_GET_MODE_MM,
|
||||
GET_REQUIRED_HW_INTERFACES = 10
|
||||
} xorgDriverFuncOp;
|
||||
|
||||
|
@ -266,6 +267,15 @@ typedef union {
|
|||
xorgRRConfig RRConfig;
|
||||
} xorgRRRotation, *xorgRRRotationPtr;
|
||||
|
||||
/* RR_GET_MODE_MM */
|
||||
typedef struct {
|
||||
DisplayModePtr mode;
|
||||
int virtX;
|
||||
int virtY;
|
||||
int mmWidth;
|
||||
int mmHeight;
|
||||
} xorgRRModeMM, *xorgRRModeMMPtr;
|
||||
|
||||
/* GET_REQUIRED_HW_INTERFACES */
|
||||
#define HW_IO 1
|
||||
#define HW_MMIO 2
|
||||
|
|
Loading…
Reference in New Issue
Block a user