diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2012-11-20 14:50:41 -0500 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2012-11-29 14:48:54 +1000 |
commit | a51b2c3913fc8556f6bd1c76805d045fc424c4bb (patch) | |
tree | 8765309685ed3fe41b6c3fd6acb174e7621c07f3 | |
parent | 1712a45422a63f11b2146541279616fcfda09ec6 (diff) |
cursor: Revise edge cases for the pointer moving towards barriers
Since barriers block the invisible line between pixels, that means
that we need to explicitly check the boundaries, or else we'll have
a potential off-by-one error. This fixes issues when trying to move
down or right across a barrier and having the pointer visibly bounce.
Signed-off-by: Jasper St. Pierre <jstpierre@mecheye.net>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | xfixes/cursor.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/xfixes/cursor.c b/xfixes/cursor.c index bd175b40f..ffee4d6ab 100644 --- a/xfixes/cursor.c +++ b/xfixes/cursor.c @@ -1093,7 +1093,11 @@ barrier_is_blocking(const struct PointerBarrier * barrier, if (dir & BarrierNegativeX && x1 == (barrier->x1 - 1)) return FALSE; /* startpoint adjacent to barrier, moving towards -> block */ - if (x1 == barrier->x1 && y1 >= barrier->y1 && y1 <= barrier->y2) { + if (dir & BarrierPositiveX && x1 == (barrier->x1 - 1) && y1 >= barrier->y1 && y1 <= barrier->y2) { + *distance = 0; + return TRUE; + } + if (dir & BarrierNegativeX && x1 == barrier->x1 && y1 >= barrier->y1 && y1 <= barrier->y2) { *distance = 0; return TRUE; } @@ -1105,7 +1109,11 @@ barrier_is_blocking(const struct PointerBarrier * barrier, if (dir & BarrierNegativeY && y1 == (barrier->y1 - 1)) return FALSE; /* startpoint adjacent to barrier, moving towards -> block */ - if (y1 == barrier->y1 && x1 >= barrier->x1 && x1 <= barrier->x2) { + if (dir & BarrierPositiveY && y1 == (barrier->y1 - 1) && x1 >= barrier->x1 && x1 <= barrier->x2) { + *distance = 0; + return TRUE; + } + if (dir & BarrierNegativeY && y1 == barrier->y1 && x1 >= barrier->x1 && x1 <= barrier->x2) { *distance = 0; return TRUE; } |