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);
|
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||||
DisplayModePtr mode;
|
DisplayModePtr mode;
|
||||||
int refresh0 = 60;
|
int refresh0 = 60;
|
||||||
|
xorgRRModeMM RRModeMM;
|
||||||
|
|
||||||
*rotations = RR_Rotate_0;
|
*rotations = RR_Rotate_0;
|
||||||
|
|
||||||
for (mode = scrp->modes; ; mode = mode->next)
|
for (mode = scrp->modes; ; mode = mode->next)
|
||||||
{
|
{
|
||||||
int refresh = xf86RandRModeRefresh (mode);
|
int refresh = xf86RandRModeRefresh (mode);
|
||||||
|
|
||||||
if (mode == scrp->modes)
|
if (mode == scrp->modes)
|
||||||
refresh0 = refresh;
|
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,
|
pSize = RRRegisterSize (pScreen,
|
||||||
mode->HDisplay, mode->VDisplay,
|
mode->HDisplay, mode->VDisplay,
|
||||||
randrp->mmWidth, randrp->mmHeight);
|
RRModeMM.mmWidth, RRModeMM.mmHeight);
|
||||||
if (!pSize)
|
if (!pSize)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
RRRegisterRate (pScreen, pSize, refresh);
|
RRRegisterRate (pScreen, pSize, refresh);
|
||||||
|
@ -93,10 +106,20 @@ xf86RandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
|
||||||
scrp->currentMode->VDisplay != randrp->virtualY)
|
scrp->currentMode->VDisplay != randrp->virtualY)
|
||||||
{
|
{
|
||||||
mode = scrp->modes;
|
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,
|
pSize = RRRegisterSize (pScreen,
|
||||||
randrp->virtualX, randrp->virtualY,
|
randrp->virtualX, randrp->virtualY,
|
||||||
randrp->mmWidth,
|
RRModeMM.mmWidth, RRModeMM.mmHeight);
|
||||||
randrp->mmHeight);
|
|
||||||
if (!pSize)
|
if (!pSize)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
RRRegisterRate (pScreen, pSize, refresh0);
|
RRRegisterRate (pScreen, pSize, refresh0);
|
||||||
|
|
|
@ -247,6 +247,7 @@ typedef struct _ScrnInfoRec *ScrnInfoPtr;
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RR_GET_INFO,
|
RR_GET_INFO,
|
||||||
RR_SET_CONFIG,
|
RR_SET_CONFIG,
|
||||||
|
RR_GET_MODE_MM,
|
||||||
GET_REQUIRED_HW_INTERFACES = 10
|
GET_REQUIRED_HW_INTERFACES = 10
|
||||||
} xorgDriverFuncOp;
|
} xorgDriverFuncOp;
|
||||||
|
|
||||||
|
@ -266,6 +267,15 @@ typedef union {
|
||||||
xorgRRConfig RRConfig;
|
xorgRRConfig RRConfig;
|
||||||
} xorgRRRotation, *xorgRRRotationPtr;
|
} xorgRRRotation, *xorgRRRotationPtr;
|
||||||
|
|
||||||
|
/* RR_GET_MODE_MM */
|
||||||
|
typedef struct {
|
||||||
|
DisplayModePtr mode;
|
||||||
|
int virtX;
|
||||||
|
int virtY;
|
||||||
|
int mmWidth;
|
||||||
|
int mmHeight;
|
||||||
|
} xorgRRModeMM, *xorgRRModeMMPtr;
|
||||||
|
|
||||||
/* GET_REQUIRED_HW_INTERFACES */
|
/* GET_REQUIRED_HW_INTERFACES */
|
||||||
#define HW_IO 1
|
#define HW_IO 1
|
||||||
#define HW_MMIO 2
|
#define HW_MMIO 2
|
||||||
|
|
Loading…
Reference in New Issue