diff options
author | David Ung <davidu@nvidia.com> | 2014-07-29 15:01:39 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-07-30 14:40:17 -0700 |
commit | b063a185ab9d2c54669fb6e036fdbae3707c9e4b (patch) | |
tree | 7edb6aa4a72dcb1ea8611236c00e46b8fb82e238 | |
parent | 90803042bcbb9dc6261b5d112acf5613829d9f70 (diff) |
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 <davidu@nvidia.com>
Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | randr/rrpointer.c | 11 |
1 files 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) |