myoverlay/x11-base/xorg-server/files/0100-randr-Account-for-panning-and-transforms-when-constr.patch

142 lines
4.6 KiB
Diff

From 9365c02aba72fd370c7080c875d196f14d8d93bd Mon Sep 17 00:00:00 2001
From: Chris Wilson <chris@chris-wilson.co.uk>
Date: Sat, 1 Mar 2014 08:25:18 +0000
Subject: [PATCH] randr: Account for panning and transforms when constraining
the cursor
commit 56c90e29f04727c903bd0f084d23bf44eb1a0a11 [1.10.99.901]
Author: Adam Jackson <ajax@redhat.com>
Date: Mon Nov 15 14:29:14 2010 -0500
randr: Add RRConstrainCursorHarder
introduced a regression as it ignored the effect of panning and
transforms upon the crtc bounds. The result was that the cursor would be
constrained to the visible area even though the panning arena was much
bigger, or the cursor was constrained to a region that did not even
match the visible area when the output was transformed or reflected.
This supercedes the hack introduced by
commit 1bf81af4a6be1113bcc3b940ab264d5c9e0f0c5d [1.12.99.904]
Author: Rui Matos <tiagomatos@gmail.com>
Date: Mon Jul 30 14:32:12 2012 -0400
xf86RandR12: Don't call ConstrainCursorHarder() if panning is enabled
which disabled the cursor constraints if a panning mode was active, but
did not fix the regression with arbitrary output transforms.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=39949
Cc: Adam Jackson <ajax@redhat.com>
Cc: Rui Matos <tiagomatos@gmail.com>
---
randr/rrcrtc.c | 60 +++++++++++++++++++++++++++++++++-------------------------
1 file changed, 34 insertions(+), 26 deletions(-)
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 6e181ba..900c7db 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -273,25 +273,34 @@ RRCrtcPendingProperties(RRCrtcPtr crtc)
return FALSE;
}
-static void
-crtc_bounds(RRCrtcPtr crtc, int *left, int *right, int *top, int *bottom)
+static Bool
+cursor_bounds(RRCrtcPtr crtc, int *left, int *right, int *top, int *bottom)
{
- *left = crtc->x;
- *top = crtc->y;
+ rrScrPriv(crtc->pScreen);
+ BoxRec bounds;
- switch (crtc->rotation) {
- case RR_Rotate_0:
- case RR_Rotate_180:
- default:
- *right = crtc->x + crtc->mode->mode.width;
- *bottom = crtc->y + crtc->mode->mode.height;
- return;
- case RR_Rotate_90:
- case RR_Rotate_270:
- *right = crtc->x + crtc->mode->mode.height;
- *bottom = crtc->y + crtc->mode->mode.width;
- return;
+ if (crtc->mode == NULL)
+ return FALSE;
+
+ memset(&bounds, 0, sizeof(bounds));
+ if (pScrPriv->rrGetPanning)
+ pScrPriv->rrGetPanning(crtc->pScreen, crtc, NULL, &bounds, NULL);
+
+ if (bounds.y2 <= bounds.y1 || bounds.x2 <= bounds.x1) {
+ bounds.x1 = 0;
+ bounds.y1 = 0;
+ bounds.x2 = crtc->mode->mode.width;
+ bounds.y2 = crtc->mode->mode.height;
}
+
+ pixman_f_transform_bounds(&crtc->f_transform, &bounds);
+
+ *left = bounds.x1;
+ *right = bounds.x2;
+ *top = bounds.y1;
+ *bottom = bounds.y2;
+
+ return TRUE;
}
/* overlapping counts as adjacent */
@@ -303,8 +312,10 @@ crtcs_adjacent(const RRCrtcPtr a, const RRCrtcPtr b)
int bl, br, bt, bb;
int cl, cr, ct, cb; /* the overlap, if any */
- crtc_bounds(a, &al, &ar, &at, &ab);
- crtc_bounds(b, &bl, &br, &bt, &bb);
+ if (!cursor_bounds(a, &al, &ar, &at, &ab))
+ return FALSE;
+ if (!cursor_bounds(b, &bl, &br, &bt, &bb))
+ return FALSE;
cl = max(al, bl);
cr = min(ar, br);
@@ -322,7 +333,7 @@ mark_crtcs(rrScrPrivPtr pScrPriv, int *reachable, int cur)
reachable[cur] = TRUE;
for (i = 0; i < pScrPriv->numCrtcs; ++i) {
- if (reachable[i] || !pScrPriv->crtcs[i]->mode)
+ if (reachable[i])
continue;
if (crtcs_adjacent(pScrPriv->crtcs[cur], pScrPriv->crtcs[i]))
mark_crtcs(pScrPriv, reachable, i);
@@ -1573,10 +1584,8 @@ static Bool check_all_screen_crtcs(ScreenPtr pScreen, int *x, int *y)
int left, right, top, bottom;
- if (!crtc->mode)
- continue;
-
- crtc_bounds(crtc, &left, &right, &top, &bottom);
+ if (!cursor_bounds(crtc, &left, &right, &top, &bottom))
+ continue;
if ((*x >= left) && (*x < right) && (*y >= top) && (*y < bottom))
return TRUE;
@@ -1595,10 +1604,9 @@ static Bool constrain_all_screen_crtcs(DeviceIntPtr pDev, ScreenPtr pScreen, int
int nx, ny;
int left, right, top, bottom;
- if (!crtc->mode)
- continue;
+ if (!cursor_bounds(crtc, &left, &right, &top, &bottom))
+ continue;
- crtc_bounds(crtc, &left, &right, &top, &bottom);
miPointerGetPosition(pDev, &nx, &ny);
if ((nx >= left) && (nx < right) && (ny >= top) && (ny < bottom)) {
--
1.9.0