randr: Panning support
This commit is contained in:
parent
834cbc16f3
commit
b929d721ef
|
@ -328,8 +328,14 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
|
||||||
crtc->x, crtc->y);
|
crtc->x, crtc->y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX short-circuit changes to base location only */
|
if (crtc->funcs->pan &&
|
||||||
|
memcmp (mode, &saved_mode, sizeof(saved_mode)) == 0 &&
|
||||||
|
saved_rotation == rotation) {
|
||||||
|
crtc->funcs->pan (crtc, crtc->x, crtc->y);
|
||||||
|
ret = TRUE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
/* Pass our mode to the outputs and the CRTC to give them a chance to
|
/* Pass our mode to the outputs and the CRTC to give them a chance to
|
||||||
* adjust it according to limitations or output properties, and also
|
* adjust it according to limitations or output properties, and also
|
||||||
* a chance to reject the mode entirely.
|
* a chance to reject the mode entirely.
|
||||||
|
@ -418,6 +424,20 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
||||||
return xf86CrtcSetModeTransform (crtc, mode, rotation, NULL, x, y);
|
return xf86CrtcSetModeTransform (crtc, mode, rotation, NULL, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pans the screen, does not change the mode
|
||||||
|
*/
|
||||||
|
_X_EXPORT void
|
||||||
|
xf86CrtcPan (xf86CrtcPtr crtc, int x, int y)
|
||||||
|
{
|
||||||
|
crtc->x = x;
|
||||||
|
crtc->y = y;
|
||||||
|
if (crtc->funcs->pan)
|
||||||
|
crtc->funcs->pan (crtc, x, y);
|
||||||
|
else
|
||||||
|
xf86CrtcSetMode (crtc, &crtc->mode, crtc->rotation, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Output functions
|
* Output functions
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -51,6 +51,8 @@ typedef struct _xf86RandR12Info {
|
||||||
int mmHeight;
|
int mmHeight;
|
||||||
int maxX;
|
int maxX;
|
||||||
int maxY;
|
int maxY;
|
||||||
|
int pointerX;
|
||||||
|
int pointerY;
|
||||||
Rotation rotation; /* current mode */
|
Rotation rotation; /* current mode */
|
||||||
Rotation supported_rotations; /* driver supported */
|
Rotation supported_rotations; /* driver supported */
|
||||||
} XF86RandRInfoRec, *XF86RandRInfoPtr;
|
} XF86RandRInfoRec, *XF86RandRInfoPtr;
|
||||||
|
@ -86,6 +88,85 @@ xf86RandR12ModeRefresh (DisplayModePtr mode)
|
||||||
return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
|
return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight)
|
||||||
|
{
|
||||||
|
if (crtc->version < 2)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 ||
|
||||||
|
crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) {
|
||||||
|
memset (&crtc->panningTotalArea, 0, sizeof(BoxRec));
|
||||||
|
memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec));
|
||||||
|
memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 ||
|
||||||
|
crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1 ||
|
||||||
|
crtc->panningTotalArea.x1 < 0 ||
|
||||||
|
crtc->panningTotalArea.y1 < 0 ||
|
||||||
|
crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay ||
|
||||||
|
crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay ||
|
||||||
|
crtc->panningTotalArea.x2 > screenWidth ||
|
||||||
|
crtc->panningTotalArea.y2 > screenHeight)
|
||||||
|
{
|
||||||
|
memset (&crtc->panningTotalArea, 0, sizeof(BoxRec));
|
||||||
|
memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec));
|
||||||
|
memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay ||
|
||||||
|
crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) {
|
||||||
|
memset (&crtc->panningBorder, 0, 4*sizeof(INT16));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
|
||||||
|
{
|
||||||
|
int newX, newY;
|
||||||
|
int width, height;
|
||||||
|
|
||||||
|
if (crtc->version < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (! crtc->enabled ||
|
||||||
|
crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 ||
|
||||||
|
crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
newX = crtc->x;
|
||||||
|
newY = crtc->y;
|
||||||
|
width = crtc->mode.HDisplay;
|
||||||
|
height = crtc->mode.VDisplay;
|
||||||
|
|
||||||
|
if (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2 &&
|
||||||
|
y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2) {
|
||||||
|
if (x < crtc->x + crtc->panningBorder[0])
|
||||||
|
newX = x - crtc->panningBorder[0];
|
||||||
|
if (x >= crtc->x + width - crtc->panningBorder[2])
|
||||||
|
newX = x - width + crtc->panningBorder[2] + 1;
|
||||||
|
if (y < crtc->y + crtc->panningBorder[1])
|
||||||
|
newY = y - crtc->panningBorder[1];
|
||||||
|
if (y >= crtc->y + height - crtc->panningBorder[3])
|
||||||
|
newY = y - height + crtc->panningBorder[3] + 1;
|
||||||
|
}
|
||||||
|
/* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */
|
||||||
|
if (newX >= crtc->panningTotalArea.x2 - width)
|
||||||
|
newX = crtc->panningTotalArea.x2 - width - 1;
|
||||||
|
if (newX < crtc->panningTotalArea.x1)
|
||||||
|
newX = crtc->panningTotalArea.x1;
|
||||||
|
if (newY >= crtc->panningTotalArea.y2 - height)
|
||||||
|
newY = crtc->panningTotalArea.y2 - height - 1;
|
||||||
|
if (newY < crtc->panningTotalArea.y1)
|
||||||
|
newY = crtc->panningTotalArea.y1;
|
||||||
|
if (newX != crtc->x || newY != crtc->y)
|
||||||
|
xf86CrtcPan (crtc, newX, newY);
|
||||||
|
}
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations)
|
xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations)
|
||||||
{
|
{
|
||||||
|
@ -332,6 +413,7 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
||||||
WindowPtr pRoot = WindowTable[pScreen->myNum];
|
WindowPtr pRoot = WindowTable[pScreen->myNum];
|
||||||
PixmapPtr pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
|
PixmapPtr pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
|
||||||
Bool ret = FALSE;
|
Bool ret = FALSE;
|
||||||
|
int c;
|
||||||
|
|
||||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
||||||
if (xf86RandR12Key) {
|
if (xf86RandR12Key) {
|
||||||
|
@ -352,6 +434,19 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
/* Update panning information */
|
||||||
|
for (c = 0; c < config->num_crtc; c++) {
|
||||||
|
xf86CrtcPtr crtc = config->crtc[c];
|
||||||
|
if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 &&
|
||||||
|
crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
|
||||||
|
crtc->panningTotalArea.x2 += width - pScreen->width;
|
||||||
|
crtc->panningTotalArea.y2 += height - pScreen->height;
|
||||||
|
crtc->panningTrackingArea.x2 += width - pScreen->width;
|
||||||
|
crtc->panningTrackingArea.y2 += height - pScreen->height;
|
||||||
|
xf86RandR13VerifyPanningArea (crtc, width, height);
|
||||||
|
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pScreen->width = pScrnPix->drawable.width = width;
|
pScreen->width = pScrnPix->drawable.width = width;
|
||||||
pScreen->height = pScrnPix->drawable.height = height;
|
pScreen->height = pScrnPix->drawable.height = height;
|
||||||
|
@ -762,6 +857,7 @@ xf86RandR12CrtcSet (ScreenPtr pScreen,
|
||||||
int num_randr_outputs,
|
int num_randr_outputs,
|
||||||
RROutputPtr *randr_outputs)
|
RROutputPtr *randr_outputs)
|
||||||
{
|
{
|
||||||
|
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||||
xf86CrtcPtr crtc = randr_crtc->devPrivate;
|
xf86CrtcPtr crtc = randr_crtc->devPrivate;
|
||||||
|
@ -841,6 +937,8 @@ xf86RandR12CrtcSet (ScreenPtr pScreen,
|
||||||
xfree(save_crtcs);
|
xfree(save_crtcs);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
|
||||||
|
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
|
||||||
/*
|
/*
|
||||||
* Save the last successful setting for EnterVT
|
* Save the last successful setting for EnterVT
|
||||||
*/
|
*/
|
||||||
|
@ -1187,6 +1285,62 @@ xf86RandR12TellChanged (ScreenPtr pScreen)
|
||||||
static void
|
static void
|
||||||
xf86RandR12PointerMoved (int scrnIndex, int x, int y)
|
xf86RandR12PointerMoved (int scrnIndex, int x, int y)
|
||||||
{
|
{
|
||||||
|
ScreenPtr pScreen = screenInfo.screens[scrnIndex];
|
||||||
|
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
|
||||||
|
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||||
|
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||||
|
int c;
|
||||||
|
|
||||||
|
randrp->pointerX = x;
|
||||||
|
randrp->pointerY = y;
|
||||||
|
for (c = 0; c < config->num_crtc; c++)
|
||||||
|
xf86RandR13Pan (config->crtc[c], x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
xf86RandR13GetPanning (ScreenPtr pScreen,
|
||||||
|
RRCrtcPtr randr_crtc,
|
||||||
|
BoxPtr totalArea,
|
||||||
|
BoxPtr trackingArea,
|
||||||
|
INT16 *border)
|
||||||
|
{
|
||||||
|
xf86CrtcPtr crtc = randr_crtc->devPrivate;
|
||||||
|
|
||||||
|
if (crtc->version < 2)
|
||||||
|
return FALSE;
|
||||||
|
if (totalArea)
|
||||||
|
memcpy (totalArea, &crtc->panningTotalArea, sizeof(BoxRec));
|
||||||
|
if (trackingArea)
|
||||||
|
memcpy (trackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
|
||||||
|
if (border)
|
||||||
|
memcpy (border, crtc->panningBorder, 4*sizeof(INT16));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
xf86RandR13SetPanning (ScreenPtr pScreen,
|
||||||
|
RRCrtcPtr randr_crtc,
|
||||||
|
BoxPtr totalArea,
|
||||||
|
BoxPtr trackingArea,
|
||||||
|
INT16 *border)
|
||||||
|
{
|
||||||
|
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||||
|
xf86CrtcPtr crtc = randr_crtc->devPrivate;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (crtc->version < 2)
|
||||||
|
return FALSE;
|
||||||
|
if (totalArea)
|
||||||
|
memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec));
|
||||||
|
if (trackingArea)
|
||||||
|
memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec));
|
||||||
|
if (border)
|
||||||
|
memcpy (crtc->panningBorder, border, 4*sizeof(INT16));
|
||||||
|
ret = xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
|
||||||
|
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
|
@ -1203,6 +1357,8 @@ xf86RandR12Init12 (ScreenPtr pScreen)
|
||||||
rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
|
rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
|
||||||
#if RANDR_13_INTERFACE
|
#if RANDR_13_INTERFACE
|
||||||
rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
|
rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
|
||||||
|
rp->rrGetPanning = xf86RandR13GetPanning;
|
||||||
|
rp->rrSetPanning = xf86RandR13SetPanning;
|
||||||
#endif
|
#endif
|
||||||
rp->rrModeDestroy = xf86RandR12ModeDestroy;
|
rp->rrModeDestroy = xf86RandR12ModeDestroy;
|
||||||
rp->rrSetConfig = NULL;
|
rp->rrSetConfig = NULL;
|
||||||
|
|
Loading…
Reference in New Issue