I already submitted 
http://lists.freedesktop.org/archives/wayland-devel/2013-March/008103.html that 
does this same thing... except that it preserved the relative "move_pointer" 
logic.

-----Original Message-----
From: wayland-devel-bounces+ullysses.a.eoff=intel....@lists.freedesktop.org 
[mailto:wayland-devel-bounces+ullysses.a.eoff=intel....@lists.freedesktop.org] 
On Behalf Of Bill Spitzak
Sent: Wednesday, March 27, 2013 12:24 PM
To: Bradford, Robert
Cc: [email protected]
Subject: Re: [PATCH weston] compositor: Support notifying with absolute 
position too

Looks like there is a lot of duplicated code between notify_motion and 
notify_motion_absolute.

It might be better to have notify_motion just add pointer->x and 
pointer->y and call notify_motion_absolute, and put all the shared 
logic, and possibly all of move_pointer(), into that.

Rob Bradford wrote:
> From: Rob Bradford <[email protected]>
> 
> With evdev input devices that generate absolute positions we need to provide
> an infrastructure in the compositor for supporting those.
> 
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=61997
> ---
>  src/compositor.c | 25 ++++++++++++++++++++-----
>  src/compositor.h |  5 ++++-
>  src/evdev.c      |  2 +-
>  3 files changed, 25 insertions(+), 7 deletions(-)
> 
> diff --git a/src/compositor.c b/src/compositor.c
> index 3e24295..d339472 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1782,17 +1782,15 @@ clip_pointer_motion(struct weston_seat *seat, 
> wl_fixed_t *fx, wl_fixed_t *fy)
>       }
>  }
>  
> +/* Takes absolute values */
>  static void
> -move_pointer(struct weston_seat *seat, wl_fixed_t dx, wl_fixed_t dy)
> +move_pointer(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);
> @@ -1829,7 +1827,24 @@ notify_motion(struct weston_seat *seat,
>  
>       weston_compositor_wake(ec);
>  
> -     move_pointer(seat, dx, dy);
> +     move_pointer(seat, pointer->x + dx, pointer->y + dy);
> +
> +     interface = pointer->grab->interface;
> +     interface->motion(pointer->grab, time,
> +                       pointer->grab->x, pointer->grab->y);
> +}
> +
> +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(seat, x, y);
>  
>       interface = pointer->grab->interface;
>       interface->motion(pointer->grab, time,
> diff --git a/src/compositor.h b/src/compositor.h
> index 4cc24d8..dc03aeb 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -556,7 +556,10 @@ 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;
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to