aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLas <las@protonmail.ch>2018-09-18 13:05:44 +0200
committerLas <las@protonmail.ch>2018-09-18 13:05:44 +0200
commitafa2e399aa9c19c250a03cce1cb466f54348a97a (patch)
tree5bcfee55013f0515b689bc0601696aa61bd2bc2c
parentfa2e6e7d9d5ffbd782063c89e460a915b29d4a58 (diff)
Fix implicit conversion of floats to ints in calls to pixman_region32_contains_point
I do not think the conversion is specifically defined, but on my system and SirCmpwn's the floats are rounded instead of floored, which is incorrect in this case, since for a range from 0 to 256, any value greater or equal to 0 and less than 256 is valid. I.e. [0;256[, or 0 <= x < 256, but if x is e.g. -0.1, then it will be rounded to 0, which is invalid. The correct behavior would be to floor to -1.
-rw-r--r--rootston/cursor.c6
-rw-r--r--types/wlr_surface.c2
-rw-r--r--util/region.c2
3 files changed, 5 insertions, 5 deletions
diff --git a/rootston/cursor.c b/rootston/cursor.c
index 0aaff132..4ec600e1 100644
--- a/rootston/cursor.c
+++ b/rootston/cursor.c
@@ -381,7 +381,7 @@ void roots_cursor_handle_motion_absolute(struct roots_cursor *cursor,
if (cursor->active_constraint &&
!pixman_region32_contains_point(&cursor->confine,
- lx - view->x, ly - view->y, NULL)) {
+ floor(lx - view->x), floor(ly - view->y), NULL)) {
return;
}
}
@@ -501,7 +501,7 @@ void roots_cursor_handle_tool_axis(struct roots_cursor *cursor,
if (cursor->active_constraint &&
!pixman_region32_contains_point(&cursor->confine,
- lx - view->x, ly - view->y, NULL)) {
+ floor(lx - view->x), floor(ly - view->y), NULL)) {
return;
}
}
@@ -602,7 +602,7 @@ void roots_cursor_constrain(struct roots_cursor *cursor,
pixman_region32_t *region = &constraint->region;
- if (!pixman_region32_contains_point(region, sx, sy, NULL)) {
+ if (!pixman_region32_contains_point(region, floor(sx), floor(sy), NULL)) {
// Warp into region if possible
int nboxes;
pixman_box32_t *boxes = pixman_region32_rectangles(region, &nboxes);
diff --git a/types/wlr_surface.c b/types/wlr_surface.c
index 773de460..408f38d1 100644
--- a/types/wlr_surface.c
+++ b/types/wlr_surface.c
@@ -943,7 +943,7 @@ bool wlr_surface_point_accepts_input(struct wlr_surface *surface,
double sx, double sy) {
return sx >= 0 && sx < surface->current.width &&
sy >= 0 && sy < surface->current.height &&
- pixman_region32_contains_point(&surface->current.input, sx, sy, NULL);
+ pixman_region32_contains_point(&surface->current.input, floor(sx), floor(sy), NULL);
}
struct wlr_surface *wlr_surface_surface_at(struct wlr_surface *surface,
diff --git a/util/region.c b/util/region.c
index 76df71f3..61f9c7c7 100644
--- a/util/region.c
+++ b/util/region.c
@@ -241,7 +241,7 @@ static void region_confine(pixman_region32_t *region, double x1, double y1, doub
bool wlr_region_confine(pixman_region32_t *region, double x1, double y1, double x2,
double y2, double *x2_out, double *y2_out) {
pixman_box32_t box;
- if (pixman_region32_contains_point(region, x1, y1, &box)) {
+ if (pixman_region32_contains_point(region, floor(x1), floor(y1), &box)) {
region_confine(region, x1, y1, x2, y2, x2_out, y2_out, box);
return true;
} else {