On Mon, Apr 21, 2014 at 07:11:18PM +0200, Carlos Garnacho wrote:
> This event would be emitted whenever a device with
> LIBINPUT_DEVICE_CAP_STYLUS capabilities changes its tool type.
> 
> When the tablet reaches proximity, the tool/serial will be
> updated to match the current physical stylus'. Likewise, when
> the stylus moves out of proximity, the tool will be reset to
> LIBINPUT_TOOL_NONE, so this event comes in pairs and can be used
> to track stylus proximity.
> 
> Signed-off-by: Carlos Garnacho <[email protected]>
> ---
>  src/libinput-private.h |  6 ++++++
>  src/libinput.c         | 41 ++++++++++++++++++++++++++++++++++++++
>  src/libinput.h         | 54 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 101 insertions(+)
> 
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index 4eac89d..7cdce64 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -159,6 +159,12 @@ pointer_notify_axis_frame(struct libinput_device *device,
>                         uint32_t time);
>  
>  void
> +pointer_notify_tool_update(struct libinput_device *device,
> +                        uint32_t time,
> +                        enum libinput_tool tool,
> +                        uint32_t serial);
> +
> +void
>  touch_notify_touch_down(struct libinput_device *device,
>                       uint32_t time,
>                       int32_t slot,
> diff --git a/src/libinput.c b/src/libinput.c
> index 4ecd068..76a0b12 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -66,6 +66,8 @@ struct libinput_event_pointer {
>       enum libinput_pointer_button_state state;
>       enum libinput_pointer_axis axis;
>       li_fixed_t value;
> +     enum libinput_tool tool;
> +     uint32_t tool_serial;
>  };
>  
>  struct libinput_event_touch {
> @@ -176,6 +178,7 @@ libinput_event_get_pointer_event(struct libinput_event 
> *event)
>       case LIBINPUT_EVENT_POINTER_BUTTON:
>       case LIBINPUT_EVENT_POINTER_AXIS:
>       case LIBINPUT_EVENT_POINTER_AXIS_FRAME:
> +     case LIBINPUT_EVENT_POINTER_TOOL_UPDATE:
>               return (struct libinput_event_pointer *) event;
>       case LIBINPUT_EVENT_TOUCH_DOWN:
>       case LIBINPUT_EVENT_TOUCH_UP:
> @@ -204,6 +207,7 @@ libinput_event_get_keyboard_event(struct libinput_event 
> *event)
>       case LIBINPUT_EVENT_POINTER_BUTTON:
>       case LIBINPUT_EVENT_POINTER_AXIS:
>       case LIBINPUT_EVENT_POINTER_AXIS_FRAME:
> +     case LIBINPUT_EVENT_POINTER_TOOL_UPDATE:
>       case LIBINPUT_EVENT_TOUCH_DOWN:
>       case LIBINPUT_EVENT_TOUCH_UP:
>       case LIBINPUT_EVENT_TOUCH_MOTION:
> @@ -229,6 +233,7 @@ libinput_event_get_touch_event(struct libinput_event 
> *event)
>       case LIBINPUT_EVENT_POINTER_BUTTON:
>       case LIBINPUT_EVENT_POINTER_AXIS:
>       case LIBINPUT_EVENT_POINTER_AXIS_FRAME:
> +     case LIBINPUT_EVENT_POINTER_TOOL_UPDATE:
>               break;
>       case LIBINPUT_EVENT_TOUCH_DOWN:
>       case LIBINPUT_EVENT_TOUCH_UP:
> @@ -256,6 +261,7 @@ libinput_event_get_device_notify_event(struct 
> libinput_event *event)
>       case LIBINPUT_EVENT_POINTER_BUTTON:
>       case LIBINPUT_EVENT_POINTER_AXIS:
>       case LIBINPUT_EVENT_POINTER_AXIS_FRAME:
> +     case LIBINPUT_EVENT_POINTER_TOOL_UPDATE:
>       case LIBINPUT_EVENT_TOUCH_DOWN:
>       case LIBINPUT_EVENT_TOUCH_UP:
>       case LIBINPUT_EVENT_TOUCH_MOTION:
> @@ -355,6 +361,18 @@ libinput_event_pointer_get_axis(struct 
> libinput_event_pointer *event)
>       return event->axis;
>  }
>  
> +LIBINPUT_EXPORT enum libinput_tool
> +libinput_event_pointer_get_tool(struct libinput_event_pointer *event)
> +{
> +     return event->tool;
> +}
> +
> +LIBINPUT_EXPORT uint32_t
> +libinput_event_pointer_get_tool_serial(struct libinput_event_pointer *event)
> +{
> +     return event->tool_serial;
> +}


I think the tool needs to be an object, with the serial as a property on
the object, similar to the seat object. So that'd leave us with
    struct libinput_tool libinput_event_pointer_get_tool();
and
    int32_t libinput_tool_get_serial();

Note that we've used -1 for "no tool" in the wacom drivers, so the serial
should be a int32_t.

Cheers,
   Peter
 
> +
>  LIBINPUT_EXPORT li_fixed_t
>  libinput_event_pointer_get_axis_value(struct libinput_event_pointer *event)
>  {
> @@ -867,6 +885,29 @@ pointer_notify_axis_frame(struct libinput_device *device,
>  }
>  
>  void
> +pointer_notify_tool_update(struct libinput_device *device,
> +                        uint32_t time,
> +                        enum libinput_tool tool,
> +                        uint32_t serial)
> +{
> +     struct libinput_event_pointer *tool_update_event;
> +
> +     tool_update_event = zalloc(sizeof *tool_update_event);
> +     if (!tool_update_event)
> +             return;
> +
> +     *tool_update_event = (struct libinput_event_pointer) {
> +             .time = time,
> +             .tool = tool,
> +             .tool_serial = serial,
> +     };
> +
> +     post_device_event(device,
> +                       LIBINPUT_EVENT_POINTER_TOOL_UPDATE,
> +                       &tool_update_event->base);
> +}
> +
> +void
>  touch_notify_touch_down(struct libinput_device *device,
>                       uint32_t time,
>                       int32_t slot,
> diff --git a/src/libinput.h b/src/libinput.h
> index f6a881c..8d40a1a 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -117,6 +117,24 @@ enum libinput_pointer_axis {
>  };
>  
>  /**
> + * @ingroup device
> + *
> + * Available tool types for a device. It must have the @ref
> + * LIBINPUT_DEVICE_CAP_STYLUS capability.
> + */
> +enum libinput_tool {
> +     LIBINPUT_TOOL_NONE = 0,
> +     LIBINPUT_TOOL_PEN = 0x140, /* Matches BTN_TOOL_PEN */
> +     LIBINPUT_TOOL_ERASER,
> +     LIBINPUT_TOOL_BRUSH,
> +     LIBINPUT_TOOL_PENCIL,
> +     LIBINPUT_TOOL_AIRBRUSH,
> +     LIBINPUT_TOOL_FINGER,
> +     LIBINPUT_TOOL_MOUSE,
> +     LIBINPUT_TOOL_LENS
> +};
> +
> +/**
>   * @ingroup base
>   *
>   * Event type for events returned by libinput_get_event().
> @@ -157,6 +175,12 @@ enum libinput_event_type {
>        */
>       LIBINPUT_EVENT_POINTER_AXIS_FRAME,
>  
> +     /**
> +      * Signals that a device with the @ref LIBINPUT_DEVICE_CAP_STYLUS
> +      * capability has changed its tool.
> +      */
> +     LIBINPUT_EVENT_POINTER_TOOL_UPDATE,
> +
>       LIBINPUT_EVENT_TOUCH_DOWN = 500,
>       LIBINPUT_EVENT_TOUCH_UP,
>       LIBINPUT_EVENT_TOUCH_MOTION,
> @@ -557,6 +581,36 @@ libinput_event_pointer_get_axis(struct 
> libinput_event_pointer *event);
>  /**
>   * @ingroup event_pointer
>   *
> + * Return the tool mode set by this event.
> + * For pointer events that are not of type @ref 
> LIBINPUT_EVENT_POINTER_TOOL_UPDATE,
> + * this function returns @ref LIBINPUT_TOOL_NONE.
> + *
> + * @note It is an application bug to call this function for events other than
> + * @ref LIBINPUT_EVENT_POINTER_TOOL_UPDATE.
> + *
> + * @return The new tool triggering this event
> + */
> +enum libinput_tool
> +libinput_event_pointer_get_tool(struct libinput_event_pointer *event);
> +
> +/**
> + * @ingroup event_pointer
> + *
> + * Return the tool serial set by this event.
> + * For pointer events that are not of type @ref 
> LIBINPUT_EVENT_POINTER_TOOL_UPDATE,
> + * this function returns @ref LIBINPUT_TOOL_NONE.
> + *
> + * @note It is an application bug to call this function for events other than
> + * @ref LIBINPUT_EVENT_POINTER_TOOL_UPDATE.
> + *
> + * @return The new tool serial triggering this event
> + */
> +uint32_t
> +libinput_event_pointer_get_tool_serial(struct libinput_event_pointer *event);
> +
> +/**
> + * @ingroup event_pointer
> + *
>   * Return the axis value of the given axis. The interpretation of the value
>   * is dependent on the axis. For the two scrolling axes
>   * LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL and
> -- 
> 1.9.0
> 
> _______________________________________________
> 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