2 * Copyright © 2011 Red Hat, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
24 #ifdef HAVE_DIX_CONFIG_H
25 #include <dix-config.h>
31 #include <xfixesint.h>
32 #include <X11/extensions/xfixeswire.h>
35 _fixes_test_direction(struct PointerBarrier
*barrier
, int d
[4], int permitted
)
39 int dir
= barrier_get_direction(d
[0], d
[1], d
[2], d
[3]);
41 barrier
->directions
= 0;
42 blocking
= barrier_is_blocking_direction(barrier
, dir
);
45 for (j
= 0; j
<= BarrierNegativeY
; j
++) {
46 for (i
= 0; i
<= BarrierNegativeY
; i
++) {
47 barrier
->directions
|= 1 << i
;
48 blocking
= barrier_is_blocking_direction(barrier
, dir
);
49 assert((barrier
->directions
& permitted
) ==
50 permitted
? !blocking
: blocking
);
57 fixes_pointer_barrier_direction_test(void)
59 struct PointerBarrier barrier
;
64 int directions
[8][4] = {
65 {x
, y
, x
, y
+ 100}, /* S */
66 {x
+ 50, y
, x
- 50, y
+ 100}, /* SW */
67 {x
+ 100, y
, x
, y
}, /* W */
68 {x
+ 100, y
+ 50, x
, y
- 50}, /* NW */
69 {x
, y
+ 100, x
, y
}, /* N */
70 {x
- 50, y
+ 100, x
+ 50, y
}, /* NE */
71 {x
, y
, x
+ 100, y
}, /* E */
72 {x
, y
- 50, x
+ 100, y
+ 50}, /* SE */
80 _fixes_test_direction(&barrier
, directions
[0], BarrierPositiveY
);
81 _fixes_test_direction(&barrier
, directions
[1],
82 BarrierPositiveY
| BarrierNegativeX
);
83 _fixes_test_direction(&barrier
, directions
[2], BarrierNegativeX
);
84 _fixes_test_direction(&barrier
, directions
[3],
85 BarrierNegativeY
| BarrierNegativeX
);
86 _fixes_test_direction(&barrier
, directions
[4], BarrierNegativeY
);
87 _fixes_test_direction(&barrier
, directions
[5],
88 BarrierPositiveX
| BarrierNegativeY
);
89 _fixes_test_direction(&barrier
, directions
[6], BarrierPositiveX
);
90 _fixes_test_direction(&barrier
, directions
[7],
91 BarrierPositiveY
| BarrierPositiveX
);
96 fixes_pointer_barriers_test(void)
98 struct PointerBarrier barrier
;
111 /* across at half-way */
116 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
117 assert(distance
== 1);
119 /* definitely not across */
122 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
124 /* across, but outside of y range */
129 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
131 /* across, diagonally */
136 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
138 /* across but outside boundary, diagonally */
143 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
145 /* edge case: startpoint of movement on barrier → blocking */
150 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
152 /* edge case: startpoint of movement on barrier → not blocking, positive */
157 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
159 /* edge case: startpoint of movement on barrier → not blocking, negative */
164 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
166 /* edge case: endpoint of movement on barrier → blocking */
171 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
173 /* startpoint on barrier but outside y range */
178 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
180 /* endpoint on barrier but outside y range */
185 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
187 /* horizontal barrier */
193 /* across at half-way */
198 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
200 /* definitely not across */
203 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
205 /* across, but outside of y range */
210 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
212 /* across, diagonally */
217 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
219 /* across but outside boundary, diagonally */
224 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
226 /* edge case: startpoint of movement on barrier → blocking */
231 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
233 /* edge case: startpoint of movement on barrier → not blocking, positive */
238 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
240 /* edge case: startpoint of movement on barrier → not blocking, negative */
245 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
247 /* edge case: endpoint of movement on barrier → blocking */
252 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
254 /* startpoint on barrier but outside y range */
259 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
261 /* endpoint on barrier but outside y range */
266 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
268 /* ray vert barrier */
272 barrier
.y2
= y
+ 100;
274 /* ray barrier simple case */
279 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
281 /* endpoint outside y range; should be blocked */
286 assert(barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
288 /* endpoint outside y range */
293 assert(!barrier_is_blocking(&barrier
, x1
, y1
, x2
, y2
, &distance
));
297 fixes_pointer_barrier_clamp_test(void)
299 struct PointerBarrier barrier
;
304 int cx
, cy
; /* clamped */
311 barrier
.directions
= 0;
315 barrier_clamp_to_barrier(&barrier
, BarrierPositiveX
, &cx
, &cy
);
316 assert(cx
== barrier
.x1
- 1);
317 assert(cy
== INT_MAX
);
321 barrier_clamp_to_barrier(&barrier
, BarrierNegativeX
, &cx
, &cy
);
322 assert(cx
== barrier
.x1
);
323 assert(cy
== INT_MAX
);
330 barrier
.directions
= 0;
334 barrier_clamp_to_barrier(&barrier
, BarrierPositiveY
, &cx
, &cy
);
335 assert(cx
== INT_MAX
);
336 assert(cy
== barrier
.y1
- 1);
340 barrier_clamp_to_barrier(&barrier
, BarrierNegativeY
, &cx
, &cy
);
341 assert(cx
== INT_MAX
);
342 assert(cy
== barrier
.y1
);
346 main(int argc
, char **argv
)
349 fixes_pointer_barriers_test();
350 fixes_pointer_barrier_direction_test();
351 fixes_pointer_barrier_clamp_test();