diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-09 22:21:14 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-09 22:21:27 -0400 |
commit | 34829dec713589518727c2e00bb1d2f2736e3763 (patch) | |
tree | 39962b453c2ad1bba2e33c10218ab5bdaf8822df /src | |
parent | f647c5a5d5f1ec809653c8a807c86551beedc45f (diff) |
compositor: Simplify clip_pointer_motion() and make it handle dead areas
We were testing if the pointer were outside any output and doing a lot of
work to compute the bounding box of all output and then clip against that.
Just clip against previous (valid) output and don't bother with the
bounding box.
Diffstat (limited to 'src')
-rw-r--r-- | src/compositor.c | 66 |
1 files changed, 26 insertions, 40 deletions
diff --git a/src/compositor.c b/src/compositor.c index 99bf833..4cb117a 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1559,53 +1559,39 @@ weston_input_update_drag_surface(struct wl_input_device *input_device, int dx, int dy); static void -clip_pointer_motion(struct weston_compositor *ec, +clip_pointer_motion(struct weston_input_device *device, wl_fixed_t *fx, wl_fixed_t *fy) { - struct weston_output *output; - wl_fixed_t x, y; - int x_valid = 0, y_valid = 0; - int min_x = INT_MAX, min_y = INT_MAX, max_x = INT_MIN, max_y = INT_MIN; + struct weston_compositor *ec = device->compositor; + struct weston_output *output, *prev = NULL; + int x, y, old_x, old_y, valid = 0; - x = *fx; - y = *fy; + x = wl_fixed_to_int(*fx); + y = wl_fixed_to_int(*fy); + old_x = wl_fixed_to_int(device->input_device.x); + old_y = wl_fixed_to_int(device->input_device.y); wl_list_for_each(output, &ec->output_list, link) { - if (wl_fixed_from_int(output->x) <= x && - x < wl_fixed_from_int(output->x + output->current->width)) - x_valid = 1; - - if (wl_fixed_from_int(output->y) <= y && - y < wl_fixed_from_int(output->y + output->current->height)) - y_valid = 1; - - /* FIXME: calculate this only on output addition/deletion */ - if (output->x < min_x) - min_x = output->x; - if (output->y < min_y) - min_y = output->y; - - if (output->x + output->current->width > max_x) - max_x = output->x + output->current->width - 1; - if (output->y + output->current->height > max_y) - max_y = output->y + output->current->height - 1; + if (pixman_region32_contains_point(&output->region, + x, y, NULL)) + valid = 1; + if (pixman_region32_contains_point(&output->region, + old_x, old_y, NULL)) + prev = output; } - if (!x_valid) { - if (x < wl_fixed_from_int(min_x)) - x = wl_fixed_from_int(min_x); - else if (x >= wl_fixed_from_int(max_x)) - x = wl_fixed_from_int(max_x); - } - if (!y_valid) { - if (y < wl_fixed_from_int(min_y)) - y = wl_fixed_from_int(min_y); - else if (y >= max_y) - y = wl_fixed_from_int(max_y); + if (!valid) { + if (x < prev->x) + *fx = wl_fixed_from_int(prev->x); + else if (x >= prev->x + prev->current->width) + *fx = wl_fixed_from_int(prev->x + + prev->current->width - 1); + if (y < prev->y) + *fy = wl_fixed_from_int(prev->y); + else if (y >= prev->y + prev->current->height) + *fy = wl_fixed_from_int(prev->y + + prev->current->height - 1); } - - *fx = x; - *fy = y; } WL_EXPORT void @@ -1620,7 +1606,7 @@ notify_motion(struct wl_input_device *device, weston_compositor_activity(ec); - clip_pointer_motion(ec, &x, &y); + clip_pointer_motion(wd, &x, &y); weston_input_update_drag_surface(device, x - device->x, y - device->y); |