[PATCH v3 weston 2/2] Support axis source, axis discrete, frame and axis stop events

Peter Hutterer peter.hutterer at who-t.net
Mon Jan 11 15:05:40 PST 2016


On Mon, Jan 11, 2016 at 03:59:56PM +0800, Jonas Ådahl wrote:
> On Tue, Dec 08, 2015 at 11:15:01AM +1000, Peter Hutterer wrote:
> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> 
> Looks correct to me, so consider this (and the previous patch)
> Reviewed-by: Jonas Ådahl <jadahl at gmail.com>. I do, however, have some
> comments on the overall design inlined below.
> 
> > ---
> > Changes to v2: 
> > - use the new weston axis event struct, client-side is still a per-event
> >   handler (could be done at some later point)
> > - couple of minor improvements to extracting the information out of libinput
> > 
> >  clients/eventdemo.c               |  57 ++++++++++++++++-
> >  clients/window.c                  |  97 ++++++++++++++++++++++++++++-
> >  clients/window.h                  |  31 +++++++++
> >  desktop-shell/exposay.c           |  12 ++++
> >  desktop-shell/shell.c             |  33 ++++++++++
> >  ivi-shell/hmi-controller.c        |  15 +++++
> >  src/compositor-wayland.c          |  66 ++++++++++++++++++++
> >  src/compositor-x11.c              |  13 ++++
> >  src/compositor.h                  |  16 +++++
> >  src/data-device.c                 |  12 ++++
> >  src/input.c                       |  93 ++++++++++++++++++++++++---
> >  src/libinput-device.c             | 128 ++++++++++++++++++++++++++++----------
> >  tests/weston-test-client-helper.c |  32 ++++++++++
> >  13 files changed, 564 insertions(+), 41 deletions(-)
> > 
> > diff --git a/clients/eventdemo.c b/clients/eventdemo.c
> > index bdad6fd..e323aa5 100644
> > --- a/clients/eventdemo.c
> > +++ b/clients/eventdemo.c
> > @@ -259,6 +259,54 @@ axis_handler(struct widget *widget, struct input *input, uint32_t time,
> >  	       wl_fixed_to_double(value));
> >  }
> >  
> > +static void
> > +pointer_frame_handler(struct widget *widget, struct input *input, void *data)
> > +{
> > +	printf("pointer frame\n");
> > +}
> > +
> > +static void
> > +axis_source_handler(struct widget *widget, struct input *input,
> > +		    uint32_t source, void *data)
> > +{
> > +	const char *axis_source;
> > +
> > +	switch (source) {
> > +	case WL_POINTER_AXIS_SOURCE_WHEEL:
> > +		axis_source = "wheel";
> > +		break;
> > +	case WL_POINTER_AXIS_SOURCE_FINGER:
> > +		axis_source = "finger";
> > +		break;
> > +	case WL_POINTER_AXIS_SOURCE_CONTINUOUS:
> > +		axis_source = "continuous";
> > +		break;
> > +	default:
> > +		axis_source = "<invalid source value>";
> > +		break;
> > +	}
> > +
> > +	printf("axis source: %s\n", axis_source);
> > +}
> > +
> > +static void
> > +axis_stop_handler(struct widget *widget, struct input *input,
> > +		  uint32_t time, uint32_t axis,
> > +		  void *data)
> > +{
> > +	printf("axis stop time: %d, axis: %s\n",
> > +	       time,
> > +	       axis == WL_POINTER_AXIS_VERTICAL_SCROLL ? "vertical" :
> > +							 "horizontal");
> > +}
> > +
> > +static void
> > +axis_discrete_handler(struct widget *widget, struct input *input,
> > +		      uint32_t axis, int32_t discrete, void *data)
> > +{
> > +	printf("axis discrete axis: %d value: %d\n", axis, discrete);
> > +}
> > +
> >  /**
> >   * \brief CALLBACK function, Waylands informs about pointer motion
> >   * \param widget widget
> > @@ -347,8 +395,15 @@ eventdemo_create(struct display *d)
> >  	/* Set the callback motion handler for the window */
> >  	widget_set_motion_handler(e->widget, motion_handler);
> >  
> > +	/* Set the callback pointer frame handler for the window */
> > +	widget_set_pointer_frame_handler(e->widget, pointer_frame_handler);
> > +
> >  	/* Set the callback axis handler for the window */
> > -	widget_set_axis_handler(e->widget, axis_handler);
> > +	widget_set_axis_handlers(e->widget,
> > +				 axis_handler,
> > +				 axis_source_handler,
> > +				 axis_stop_handler,
> > +				 axis_discrete_handler);
> >  
> >  	/* Initial drawing of the window */
> >  	window_schedule_resize(e->window, width, height);
> > diff --git a/clients/window.c b/clients/window.c
> > index 5d69116..7d45acd 100644
> > --- a/clients/window.c
> > +++ b/clients/window.c
> > @@ -282,6 +282,10 @@ struct widget {
> >  	widget_touch_frame_handler_t touch_frame_handler;
> >  	widget_touch_cancel_handler_t touch_cancel_handler;
> >  	widget_axis_handler_t axis_handler;
> > +	widget_pointer_frame_handler_t pointer_frame_handler;
> > +	widget_axis_source_handler_t axis_source_handler;
> > +	widget_axis_stop_handler_t axis_stop_handler;
> > +	widget_axis_discrete_handler_t axis_discrete_handler;
> 
> Should we really make the toytoolkit API this low level? I guess it's
> easier this way, so I won't complain further, but it'd be good to have
> our toy toolkit try to construct the higher level events the protocol
> try to communicate.

I think the question is: how much we want the toytoolkit to stay a
toy? Composing those events is doable, but how many toytoolkit users will
really care about them?

[...]

> > diff --git a/src/compositor.h b/src/compositor.h
> > index bf38784..c9e61a5 100644
> > --- a/src/compositor.h
> > +++ b/src/compositor.h
> > @@ -256,6 +256,8 @@ struct weston_pointer_motion_event {
> >  struct weston_pointer_axis_event {
> >  	uint32_t axis;
> >  	wl_fixed_t value;
> > +	bool has_discrete;
> > +	int32_t discrete;
> >  };
> >  
> >  struct weston_pointer_grab;
> > @@ -268,6 +270,8 @@ struct weston_pointer_grab_interface {
> >  	void (*axis)(struct weston_pointer_grab *grab,
> >  		     uint32_t time,
> >  		     struct weston_pointer_axis_event *event);
> > +	void (*axis_source)(struct weston_pointer_grab *grab, uint32_t source);
> 
> I suppose you have this as a separate event because the axis event is
> only per-axis instead of in 2D? Wouldn't it be better to make
> weston_pointer_axis_event contain the actual axis events including all
> the changed axis, source tag?

it's per frame, and it's optional. So you may get axis events without a
source tag, which would require an "unknown" define. Not the end of the
world though, but again, the question is: how many toytoolkit clients will
care?

Cheers,
   Peter



More information about the wayland-devel mailing list