From b063a185ab9d2c54669fb6e036fdbae3707c9e4b Mon Sep 17 00:00:00 2001 From: David Ung Date: Tue, 29 Jul 2014 15:01:39 -0700 Subject: [PATCH] randr: Fix logic in RRPointerToNearestCrtc RRPointerToNearestCrtc is suppose to snap to the nearest Crtc, but best_x and best_y is always positive, hence when calling SetCursorPosition it will make the cursor even further away. Correct delta x/y to allow negative values and also use "width/height -1" in the calculation. Also choose the closest Crtc by setting the "best" value. Signed-off-by: David Ung Reviewed-by: Keith Packard Signed-off-by: Keith Packard --- randr/rrpointer.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/randr/rrpointer.c b/randr/rrpointer.c index eb6b6770c..b301d050d 100644 --- a/randr/rrpointer.c +++ b/randr/rrpointer.c @@ -77,21 +77,22 @@ RRPointerToNearestCrtc(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y, if (x < crtc->x) dx = crtc->x - x; - else if (x > crtc->x + scan_width) - dx = x - (crtc->x + scan_width); + else if (x > crtc->x + scan_width - 1) + dx = crtc->x + (scan_width - 1) - x; else dx = 0; if (y < crtc->y) dy = crtc->y - y; - else if (y > crtc->y + scan_height) - dy = y - (crtc->y + scan_height); + else if (y > crtc->y + scan_height - 1) + dy = crtc->y + (scan_height - 1) - y; else dy = 0; - dist = dx + dy; + dist = dx * dx + dy * dy; if (!nearest || dist < best) { nearest = crtc; best_dx = dx; best_dy = dy; + best = dist; } } if (best_dx || best_dy)