[PATCH xserver] Account for panning/scaling when bounding RR cursor
chris at cnpbagwell.com
chris at cnpbagwell.com
Sat Mar 24 20:37:18 PDT 2012
From: Chris Bagwell <chris at cnpbagwell.com>
See Bug #39949.
Commit 56c90e29f04727c903bd0f084d23bf44eb1a0a11 caused xrandr
scaling and panning options to have cursor issues. For scaling,
there could be a dead area of screen when scaling larger than size
of mode. For panning, you couldn't pan bigger than mode.
When returning bounds, account for panning and scaling.
Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
---
This is an RFC for Bug #39949. It does fix the issue but
there may be better ways to solve.
randr/rrcrtc.c | 24 ++++++++++++++++++++----
1 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 36caa58..d3df98a 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -282,20 +282,36 @@ RRCrtcPendingProperties(RRCrtcPtr crtc)
static void
crtc_bounds(RRCrtcPtr crtc, int *left, int *right, int *top, int *bottom)
{
+ int width, height;
+ BoxRec panned_area;
+ ScreenPtr pScreen = crtc->pScreen;
+ rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen);
+
*left = crtc->x;
*top = crtc->y;
+ if (pScrPriv->rrGetPanning &&
+ pScrPriv->rrGetPanning(pScreen, crtc, &panned_area, NULL, NULL) &&
+ (panned_area.x2 > panned_area.x1) && (panned_area.y2 > panned_area.y1))
+ {
+ width = panned_area.x2 - panned_area.x1;
+ height = panned_area.y2 - panned_area.y1;
+ }
+ else {
+ RRCrtcGetScanoutSize(crtc, &width, &height);
+ }
+
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;
+ *right = crtc->x + width;
+ *bottom = crtc->y + height;
return;
case RR_Rotate_90:
case RR_Rotate_270:
- *right = crtc->x + crtc->mode->mode.height;
- *bottom = crtc->y + crtc->mode->mode.width;
+ *right = crtc->x + height;
+ *bottom = crtc->y + width;
return;
}
}
--
1.7.7.6
More information about the xorg-devel
mailing list