xf86RandR12: Don't call ConstrainCursorHarder() if panning is enabled

Panning is at odds with CRTC cursor confinement. This disables CRTC cursor
confinement as long as panning is enabled.

Fixes regression introduced in 56c90e29f0.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Rui Matos <tiagomatos@gmail.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Rui Matos 2012-07-30 14:32:12 -04:00 committed by Keith Packard
parent ff56f88616
commit 1bf81af4a6

View File

@ -60,6 +60,9 @@ typedef struct _xf86RandR12Info {
* See https://bugs.freedesktop.org/show_bug.cgi?id=21554
*/
xf86EnterVTProc *orig_EnterVT;
Bool panning;
ConstrainCursorHarderProcPtr orig_ConstrainCursorHarder;
} XF86RandRInfoRec, *XF86RandRInfoPtr;
#ifdef RANDR_12_INTERFACE
@ -665,6 +668,10 @@ xf86RandR12SetConfig(ScreenPtr pScreen,
return TRUE;
}
#define PANNING_ENABLED(crtc) \
((crtc)->panningTotalArea.x2 > (crtc)->panningTotalArea.x1 || \
(crtc)->panningTotalArea.y2 > (crtc)->panningTotalArea.y1)
static Bool
xf86RandR12ScreenSetSize(ScreenPtr pScreen,
CARD16 width,
@ -676,6 +683,7 @@ xf86RandR12ScreenSetSize(ScreenPtr pScreen,
WindowPtr pRoot = pScreen->root;
PixmapPtr pScrnPix;
Bool ret = FALSE;
Bool panning = FALSE;
int c;
if (xf86RandR12Key) {
@ -696,8 +704,7 @@ xf86RandR12ScreenSetSize(ScreenPtr pScreen,
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) {
if (PANNING_ENABLED (crtc)) {
if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
crtc->panningTotalArea.x2 += width - pScreen->width;
if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
@ -708,6 +715,7 @@ xf86RandR12ScreenSetSize(ScreenPtr pScreen,
crtc->panningTrackingArea.y2 += height - pScreen->height;
xf86RandR13VerifyPanningArea(crtc, width, height);
xf86RandR13Pan(crtc, randrp->pointerX, randrp->pointerY);
panning = TRUE;
}
}
@ -903,6 +911,7 @@ xf86RandR12CloseScreen(ScreenPtr pScreen)
randrp = XF86RANDRINFO(pScreen);
#if RANDR_12_INTERFACE
xf86ScreenToScrn(pScreen)->EnterVT = randrp->orig_EnterVT;
pScreen->ConstrainCursorHarder = randrp->orig_ConstrainCursorHarder;
#endif
free(randrp);
@ -1216,6 +1225,7 @@ xf86RandR12CrtcSet(ScreenPtr pScreen,
}
xf86RandR13VerifyPanningArea(crtc, pScreen->width, pScreen->height);
xf86RandR13Pan(crtc, randrp->pointerX, randrp->pointerY);
randrp->panning = PANNING_ENABLED (crtc);
/*
* Save the last successful setting for EnterVT
*/
@ -1650,6 +1660,7 @@ xf86RandR13SetPanning(ScreenPtr pScreen,
BoxRec oldTotalArea;
BoxRec oldTrackingArea;
INT16 oldBorder[4];
Bool oldPanning = randrp->panning;
if (crtc->version < 2)
return FALSE;
@ -1667,6 +1678,7 @@ xf86RandR13SetPanning(ScreenPtr pScreen,
if (xf86RandR13VerifyPanningArea(crtc, pScreen->width, pScreen->height)) {
xf86RandR13Pan(crtc, randrp->pointerX, randrp->pointerY);
randrp->panning = PANNING_ENABLED (crtc);
return TRUE;
}
else {
@ -1674,6 +1686,7 @@ xf86RandR13SetPanning(ScreenPtr pScreen,
memcpy(&crtc->panningTotalArea, &oldTotalArea, sizeof(BoxRec));
memcpy(&crtc->panningTrackingArea, &oldTrackingArea, sizeof(BoxRec));
memcpy(crtc->panningBorder, oldBorder, 4 * sizeof(INT16));
randrp->panning = oldPanning;
return FALSE;
}
}
@ -1762,8 +1775,6 @@ xf86RandR14ProviderSetOutputSource(ScreenPtr pScreen,
RRProviderPtr provider,
RRProviderPtr source_provider)
{
if (!source_provider) {
if (provider->output_source) {
ScreenPtr cmScreen = pScreen->current_master;
@ -1859,6 +1870,21 @@ xf86CrtcSetScanoutPixmap(RRCrtcPtr randr_crtc, PixmapPtr pixmap)
return crtc->funcs->set_scanout_pixmap(crtc, pixmap);
}
static void
xf86RandR13ConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen, int mode, int *x, int *y)
{
XF86RandRInfoPtr randrp = XF86RANDRINFO(screen);
if (randrp->panning)
return;
if (randrp->orig_ConstrainCursorHarder) {
screen->ConstrainCursorHarder = randrp->orig_ConstrainCursorHarder;
screen->ConstrainCursorHarder(dev, screen, mode, x, y);
screen->ConstrainCursorHarder = xf86RandR13ConstrainCursorHarder;
}
}
static Bool
xf86RandR12Init12(ScreenPtr pScreen)
{
@ -1895,6 +1921,10 @@ xf86RandR12Init12(ScreenPtr pScreen)
randrp->orig_EnterVT = pScrn->EnterVT;
pScrn->EnterVT = xf86RandR12EnterVT;
randrp->panning = FALSE;
randrp->orig_ConstrainCursorHarder = pScreen->ConstrainCursorHarder;
pScreen->ConstrainCursorHarder = xf86RandR13ConstrainCursorHarder;
if (!xf86RandR12CreateObjects12(pScreen))
return FALSE;