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;
+}
+
 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

Reply via email to