On Tue, Nov 17, 2015 at 06:10:57PM +0800, Jonas Ådahl wrote:
> A wp_relative_pointer object is an extension to the wl_pointer interface
> only used for emitting relative pointer events. It will only emit events
> when the parent pointer has focus.
> 
> To get a relative pointer object, use the get_relative_pointer request
> of the global wp_relative_pointer_manager object.
> 
> The relative pointer protocol is currently an unstable protocol, so
> unstable protocol naming conventions has been applied.
> 
> Signed-off-by: Jonas Ådahl <jad...@gmail.com>

Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net>
one comment regarding indentation below

> ---
> 
> Changes since v3:
> 
> Uses the XML file from wayland-protocols.
> 
> Updated implementation given interface renaming.
> 
> Updated implementation given protocol changes (see protocol patch).
> 
> 
> 
>  Makefile.am      |   4 +-
>  src/compositor.c |   3 +
>  src/compositor.h |   4 ++
>  src/input.c      | 188 
> +++++++++++++++++++++++++++++++++++++++++++++++++------
>  4 files changed, 180 insertions(+), 19 deletions(-)
> 
> diff --git a/Makefile.am b/Makefile.am
> index cbb3b57..08a3444 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -126,7 +126,9 @@ nodist_weston_SOURCES =                                   
> \
>       protocol/scaler-protocol.c                      \
>       protocol/scaler-server-protocol.h               \
>       protocol/linux-dmabuf-unstable-v1-protocol.c    \
> -     protocol/linux-dmabuf-unstable-v1-server-protocol.h
> +     protocol/linux-dmabuf-unstable-v1-server-protocol.h             \
> +     protocol/relative-pointer-unstable-v1-protocol.c                \
> +     protocol/relative-pointer-unstable-v1-server-protocol.h
>  
>  BUILT_SOURCES += $(nodist_weston_SOURCES)
>  
> diff --git a/src/compositor.c b/src/compositor.c
> index 6f8d769..12bd18e 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -4508,6 +4508,9 @@ weston_compositor_create(struct wl_display *display, 
> void *user_data)
>                             ec, bind_presentation))
>               goto fail;
>  
> +     if (weston_input_init(ec) != 0)
> +             goto fail;
> +
>       wl_list_init(&ec->view_list);
>       wl_list_init(&ec->plane_list);
>       wl_list_init(&ec->layer_list);
> diff --git a/src/compositor.h b/src/compositor.h
> index bd0d134..46a4d1f 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -335,6 +335,7 @@ struct weston_pointer_client {
>       struct wl_list link;
>       struct wl_client *client;
>       struct wl_list pointer_resources;
> +     struct wl_list relative_pointer_resources;
>  };
>  
>  struct weston_pointer {
> @@ -1647,6 +1648,9 @@ int
>  noop_renderer_init(struct weston_compositor *ec);
>  
>  int
> +weston_input_init(struct weston_compositor *compositor);
> +
> +int
>  backend_init(struct weston_compositor *c,
>            int *argc, char *argv[],
>            struct weston_config *config,
> diff --git a/src/input.c b/src/input.c
> index e9723fc..97bffab 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -37,6 +37,7 @@
>  #include "shared/helpers.h"
>  #include "shared/os-compatibility.h"
>  #include "compositor.h"
> +#include "protocol/relative-pointer-unstable-v1-server-protocol.h"
>  
>  static void
>  empty_region(pixman_region32_t *region)
> @@ -56,6 +57,7 @@ weston_pointer_client_create(struct wl_client *client)
>  
>       pointer_client->client = client;
>       wl_list_init(&pointer_client->pointer_resources);
> +     wl_list_init(&pointer_client->relative_pointer_resources);
>  
>       return pointer_client;
>  }
> @@ -69,7 +71,9 @@ weston_pointer_client_destroy(struct weston_pointer_client 
> *pointer_client)
>  static bool
>  weston_pointer_client_is_empty(struct weston_pointer_client *pointer_client)
>  {
> -     return wl_list_empty(&pointer_client->pointer_resources);
> +     return
> +             wl_list_empty(&pointer_client->pointer_resources) &&
> +             wl_list_empty(&pointer_client->relative_pointer_resources);

this is odd-looking indentation...

Cheers,
   Peter

>  }
>  
>  static struct weston_pointer_client *
> @@ -140,6 +144,49 @@ static void unbind_resource(struct wl_resource *resource)
>  }
>  
>  WL_EXPORT void
> +weston_pointer_motion_to_abs(struct weston_pointer *pointer,
> +                          struct weston_pointer_motion_event *event,
> +                          wl_fixed_t *x, wl_fixed_t *y)
> +{
> +     if (event->mask & WESTON_POINTER_MOTION_ABS) {
> +             *x = wl_fixed_from_double(event->x);
> +             *y = wl_fixed_from_double(event->y);
> +     } else if (event->mask & WESTON_POINTER_MOTION_REL) {
> +             *x = pointer->x + wl_fixed_from_double(event->dx);
> +             *y = pointer->y + wl_fixed_from_double(event->dy);
> +     } else {
> +             assert(!"invalid motion event");
> +             *x = *y = 0;
> +     }
> +}
> +
> +static bool
> +weston_pointer_motion_to_rel(struct weston_pointer *pointer,
> +                          struct weston_pointer_motion_event *event,
> +                          double *dx, double *dy,
> +                          double *dx_unaccel, double *dy_unaccel)
> +{
> +     if (event->mask & WESTON_POINTER_MOTION_REL &&
> +         event->mask & WESTON_POINTER_MOTION_REL_UNACCEL) {
> +             *dx = event->dx;
> +             *dy = event->dy;
> +             *dx_unaccel = event->dx_unaccel;
> +             *dy_unaccel = event->dy_unaccel;
> +             return true;
> +     } else if (event->mask & WESTON_POINTER_MOTION_REL) {
> +             *dx_unaccel = *dx = event->dx;
> +             *dy_unaccel = *dy = event->dy;
> +             return true;
> +     } else if (event->mask & WESTON_POINTER_MOTION_REL_UNACCEL) {
> +             *dx_unaccel = *dx = event->dx_unaccel;
> +             *dy_unaccel = *dy = event->dy_unaccel;
> +             return true;
> +     } else {
> +             return false;
> +     }
> +}
> +
> +WL_EXPORT void
>  weston_seat_repick(struct weston_seat *seat)
>  {
>       const struct weston_pointer *pointer = weston_seat_get_pointer(seat);
> @@ -255,6 +302,45 @@ default_grab_pointer_focus(struct weston_pointer_grab 
> *grab)
>  }
>  
>  static void
> +weston_pointer_send_relative_motion(struct weston_pointer *pointer,
> +                                 uint32_t time,
> +                                 struct weston_pointer_motion_event *event)
> +{
> +     uint64_t time_usec;
> +     double dx, dy, dx_unaccel, dy_unaccel;
> +     wl_fixed_t dxf, dyf, dxf_unaccel, dyf_unaccel;
> +     struct wl_list *resource_list;
> +     struct wl_resource *resource;
> +
> +     if (!pointer->focus_client)
> +             return;
> +
> +     if (!weston_pointer_motion_to_rel(pointer, event,
> +                                       &dx, &dy,
> +                                       &dx_unaccel, &dy_unaccel))
> +             return;
> +
> +     resource_list = &pointer->focus_client->relative_pointer_resources;
> +     time_usec = event->time_usec;
> +     if (time_usec == 0)
> +             time_usec = time * 1000ULL;
> +
> +     dxf = wl_fixed_from_double(dx);
> +     dyf = wl_fixed_from_double(dy);
> +     dxf_unaccel = wl_fixed_from_double(dx_unaccel);
> +     dyf_unaccel = wl_fixed_from_double(dy_unaccel);
> +
> +     wl_resource_for_each(resource, resource_list) {
> +             zwp_relative_pointer_v1_send_relative_motion(
> +                     resource,
> +                     (uint32_t) (time_usec >> 32),
> +                     (uint32_t) time_usec,
> +                     dxf, dyf,
> +                     dxf_unaccel, dyf_unaccel);
> +     }
> +}
> +
> +static void
>  default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time,
>                           struct weston_pointer_motion_event *event)
>  {
> @@ -281,6 +367,8 @@ default_grab_pointer_motion(struct weston_pointer_grab 
> *grab, uint32_t time,
>                                              pointer->sx, pointer->sy);
>               }
>       }
> +
> +     weston_pointer_send_relative_motion(pointer, time, event);
>  }
>  
>  static void
> @@ -1082,23 +1170,6 @@ weston_pointer_move_to(struct weston_pointer *pointer,
>  }
>  
>  WL_EXPORT void
> -weston_pointer_motion_to_abs(struct weston_pointer *pointer,
> -                          struct weston_pointer_motion_event *event,
> -                          wl_fixed_t *x, wl_fixed_t *y)
> -{
> -     if (event->mask & WESTON_POINTER_MOTION_ABS) {
> -             *x = wl_fixed_from_double(event->x);
> -             *y = wl_fixed_from_double(event->y);
> -     } else if (event->mask & WESTON_POINTER_MOTION_REL) {
> -             *x = pointer->x + wl_fixed_from_double(event->dx);
> -             *y = pointer->y + wl_fixed_from_double(event->dy);
> -     } else {
> -             assert(!"invalid motion event");
> -             *x = *y = 0;
> -     }
> -}
> -
> -WL_EXPORT void
>  weston_pointer_move(struct weston_pointer *pointer,
>                   struct weston_pointer_motion_event *event)
>  {
> @@ -2189,6 +2260,76 @@ bind_seat(struct wl_client *client, void *data, 
> uint32_t version, uint32_t id)
>               wl_seat_send_name(resource, seat->seat_name);
>  }
>  
> +static void
> +relative_pointer_destroy(struct wl_client *client,
> +                      struct wl_resource *resource)
> +{
> +     wl_resource_destroy(resource);
> +}
> +
> +static const struct zwp_relative_pointer_v1_interface 
> relative_pointer_interface = {
> +     relative_pointer_destroy
> +};
> +
> +static void
> +relative_pointer_manager_destroy(struct wl_client *client,
> +                              struct wl_resource *resource)
> +{
> +     wl_resource_destroy(resource);
> +}
> +
> +static void
> +relative_pointer_manager_get_relative_pointer(struct wl_client *client,
> +                                           struct wl_resource *resource,
> +                                           uint32_t id,
> +                                           struct wl_resource 
> *pointer_resource)
> +{
> +     struct weston_pointer *pointer =
> +             wl_resource_get_user_data(pointer_resource);
> +     struct weston_pointer_client *pointer_client;
> +     struct wl_resource *cr;
> +
> +     cr = wl_resource_create(client, &zwp_relative_pointer_v1_interface,
> +                             wl_resource_get_version(resource), id);
> +     if (cr == NULL) {
> +             wl_client_post_no_memory(client);
> +             return;
> +     }
> +
> +     pointer_client = weston_pointer_ensure_pointer_client(pointer, client);
> +     if (!pointer_client) {
> +             wl_client_post_no_memory(client);
> +             return;
> +     }
> +
> +     wl_list_insert(&pointer_client->relative_pointer_resources,
> +                    wl_resource_get_link(cr));
> +     wl_resource_set_implementation(cr, &relative_pointer_interface,
> +                                    pointer,
> +                                    unbind_pointer_client_resource);
> +}
> +
> +static const struct zwp_relative_pointer_manager_v1_interface 
> relative_pointer_manager = {
> +     relative_pointer_manager_destroy,
> +     relative_pointer_manager_get_relative_pointer,
> +};
> +
> +static void
> +bind_relative_pointer_manager(struct wl_client *client, void *data,
> +                           uint32_t version, uint32_t id)
> +{
> +     struct weston_compositor *compositor = data;
> +     struct wl_resource *resource;
> +
> +     resource = wl_resource_create(client,
> +                                   
> &zwp_relative_pointer_manager_v1_interface,
> +                                   1, id);
> +
> +     wl_resource_set_implementation(resource, &relative_pointer_manager,
> +                                    compositor,
> +                                    NULL);
> +}
> +
>  #ifdef ENABLE_XKBCOMMON
>  int
>  weston_compositor_xkb_init(struct weston_compositor *ec,
> @@ -2676,3 +2817,14 @@ weston_seat_get_touch(struct weston_seat *seat)
>  
>       return NULL;
>  }
> +
> +int
> +weston_input_init(struct weston_compositor *compositor)
> +{
> +     if (!wl_global_create(compositor->wl_display,
> +                           &zwp_relative_pointer_manager_v1_interface, 1,
> +                           compositor, bind_relative_pointer_manager))
> +             return -1;
> +
> +     return 0;
> +}
> -- 
> 2.4.3
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to