[PATCH weston v4 11/20] Implement the relative pointer protocol
Peter Hutterer
peter.hutterer at who-t.net
Wed Nov 18 18:23:43 PST 2015
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 <jadahl at gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list