On Sat, Mar 24, 2012 at 10:37 PM, <[email protected]> wrote: > From: Chris Bagwell <[email protected]> > > 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.
Any comments on this patch? To see the issue for yourself, its as simple as: xrandr --output XXX --scale 1.0x1.28 On my 1024x600 display and Xserver 1.11 or 1.12, that scales to 1024x768 but there is a invisible wall that blocks moving cursor between 600 and 768. The bug in code is obvious but this patch is untested with multiple monitors (which patch that broke scaling/panning was addressing) and it seems expensive to recompute output width/height every movement. I do not have good enough understanding of all places I'd need to add hooks to compute width/height a single time but willing to learn if you guys think that is right direction. Chris > > Signed-off-by: Chris Bagwell <[email protected]> > --- > > 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 > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
