diff --git a/src/compositor.c b/src/compositor.c index 50e0a776..f9e2499d 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1558,17 +1558,17 @@ static void weston_input_update_drag_surface(struct wl_input_device *input_device, int dx, int dy); -WL_EXPORT void -notify_motion(struct wl_input_device *device, uint32_t time, GLfloat x, GLfloat y) +static void +clip_pointer_motion(struct weston_compositor *ec, + GLfloat *fx, GLfloat *fy) { struct weston_output *output; - const struct wl_pointer_grab_interface *interface; - struct weston_input_device *wd = (struct weston_input_device *) device; - struct weston_compositor *ec = wd->compositor; + int32_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; - weston_compositor_activity(ec); + x = *fx; + y = *fy; wl_list_for_each(output, &ec->output_list, link) { if (output->x <= x && x < output->x + output->current->width) @@ -1602,6 +1602,22 @@ notify_motion(struct wl_input_device *device, uint32_t time, GLfloat x, GLfloat y = max_y; } + *fx = x; + *fy = y; +} + +WL_EXPORT void +notify_motion(struct wl_input_device *device, uint32_t time, GLfloat x, GLfloat y) +{ + const struct wl_pointer_grab_interface *interface; + struct weston_input_device *wd = (struct weston_input_device *) device; + struct weston_compositor *ec = wd->compositor; + struct weston_output *output; + + weston_compositor_activity(ec); + + clip_pointer_motion(ec, &x, &y); + weston_input_update_drag_surface(device, x - device->x, y - device->y);