[PATCH] add notify_motion_absolute for absolute motion devices

Kristian Høgsberg krh at bitplanet.net
Mon Mar 25 10:13:06 PDT 2013


On Fri, Mar 22, 2013 at 12:10 PM, U. Artie Eoff
<ullysses.a.eoff at intel.com> wrote:
> From: "U. Artie Eoff" <ullysses.a.eoff at intel.com>
>
> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=61997

Ok, I see.  I think it would be better to add a RELATIVE_MOTION flag
to notify_motion() so we don't have to duplicate the notify_motion
logic in notify_motion_absolute(), and then just add pointer->x/y
there if the flag is set.

Kristian

> Signed-off-by: U. Artie Eoff <ullysses.a.eoff at intel.com>
> ---
>  src/compositor.c | 29 +++++++++++++++++++++++++----
>  src/compositor.h |  7 ++++++-
>  src/evdev.c      |  2 +-
>  3 files changed, 32 insertions(+), 6 deletions(-)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index b734f67..ce5c788 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1783,16 +1783,13 @@ clip_pointer_motion(struct weston_seat *seat, wl_fixed_t *fx, wl_fixed_t *fy)
>  }
>
>  static void
> -move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy)
> +move_pointer_absolute(struct weston_seat *seat, wl_fixed_t x, wl_fixed_t y)
>  {
>         struct weston_compositor *ec = seat->compositor;
>         struct wl_pointer *pointer = seat->seat.pointer;
>         struct weston_output *output;
> -       wl_fixed_t x, y;
>         int32_t ix, iy;
>
> -       x = pointer->x + dx;
> -       y = pointer->y + dy;
>         clip_pointer_motion(seat, &x, &y);
>
>         weston_seat_update_drag_surface(seat, x - pointer->x, y - pointer->y);
> @@ -1819,6 +1816,13 @@ move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy)
>         }
>  }
>
> +static void
> +move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy)
> +{
> +       struct wl_pointer *pointer = seat->seat.pointer;
> +       move_pointer_absolute(seat, pointer->x + dx, pointer->y + dy);
> +}
> +
>  WL_EXPORT void
>  notify_motion(struct weston_seat *seat,
>               uint32_t time, wl_fixed_t dx, wl_fixed_t dy)
> @@ -1837,6 +1841,23 @@ notify_motion(struct weston_seat *seat,
>  }
>
>  WL_EXPORT void
> +notify_motion_absolute(struct weston_seat *seat,
> +             uint32_t time, wl_fixed_t x, wl_fixed_t y)
> +{
> +       const struct wl_pointer_grab_interface *interface;
> +       struct weston_compositor *ec = seat->compositor;
> +       struct wl_pointer *pointer = seat->seat.pointer;
> +
> +       weston_compositor_wake(ec);
> +
> +       move_pointer_absolute(seat, x, y);
> +
> +       interface = pointer->grab->interface;
> +       interface->motion(pointer->grab, time,
> +                         pointer->grab->x, pointer->grab->y);
> +}
> +
> +WL_EXPORT void
>  weston_surface_activate(struct weston_surface *surface,
>                         struct weston_seat *seat)
>  {
> diff --git a/src/compositor.h b/src/compositor.h
> index 58ab58d..c1efe0f 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -555,7 +555,12 @@ weston_surface_activate(struct weston_surface *surface,
>                         struct weston_seat *seat);
>  void
>  notify_motion(struct weston_seat *seat, uint32_t time,
> -             wl_fixed_t x, wl_fixed_t y);
> +             wl_fixed_t dx, wl_fixed_t dy);
> +
> +void
> +notify_motion_absolute(struct weston_seat *seat,
> +             uint32_t time, wl_fixed_t x, wl_fixed_t y);
> +
>  void
>  notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
>               enum wl_pointer_button_state state);
> diff --git a/src/evdev.c b/src/evdev.c
> index d2954b5..2c81d2b 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -284,7 +284,7 @@ evdev_flush_motion(struct evdev_device *device, uint32_t time)
>         }
>         if (device->pending_events & EVDEV_ABSOLUTE_MOTION) {
>                 transform_absolute(device);
> -               notify_motion(master, time,
> +               notify_motion_absolute(master, time,
>                               wl_fixed_from_int(device->abs.x),
>                               wl_fixed_from_int(device->abs.y));
>                 device->pending_events &= ~EVDEV_ABSOLUTE_MOTION;
> --
> 1.7.11.7
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list