[PATCH libinput 09/24] Add LIBINPUT_EVENT_POINTER_TOOL_UPDATE event type

Carlos Garnacho carlosg at gnome.org
Mon Apr 21 10:11:18 PDT 2014


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 <carlosg at gnome.org>
---
 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



More information about the wayland-devel mailing list