[PATCH libinput 06/10] Add a config interface to change device rotation

Peter Hutterer peter.hutterer at who-t.net
Mon Jun 2 22:34:59 PDT 2014


Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/libinput-private.h |  9 +++++++
 src/libinput.c         | 33 ++++++++++++++++++++++++
 src/libinput.h         | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 111 insertions(+)

diff --git a/src/libinput-private.h b/src/libinput-private.h
index d3570a4..0d2a1b1 100644
--- a/src/libinput-private.h
+++ b/src/libinput-private.h
@@ -85,9 +85,18 @@ struct libinput_device_config_scroll {
 	void (*reset)(struct libinput_device *device);
 };
 
+struct libinput_device_config_rotation {
+	int (*increment)(struct libinput_device *device);
+	enum libinput_config_status (*set)(struct libinput_device *device,
+					   int degrees_cw);
+	int (*get)(struct libinput_device *device);
+	void (*reset)(struct libinput_device *device);
+};
+
 struct libinput_device_config {
 	struct libinput_device_config_tap *tap;
 	struct libinput_device_config_scroll *scroll;
+	struct libinput_device_config_rotation *rotation;
 };
 
 struct libinput_device {
diff --git a/src/libinput.c b/src/libinput.c
index b2388e6..2572f5b 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -1250,3 +1250,36 @@ libinput_device_config_scroll_reset(struct libinput_device *device)
 	if (device->config.scroll)
 		device->config.scroll->reset(device);
 }
+
+LIBINPUT_EXPORT int
+libinput_device_config_rotation_get_increment(struct libinput_device *device)
+{
+	return device->config.rotation ?
+		device->config.rotation->increment(device) : 0;
+}
+
+LIBINPUT_EXPORT enum libinput_config_status
+libinput_device_config_rotation_set(struct libinput_device *device,
+				    int degrees_cw)
+{
+	if (libinput_device_config_rotation_get_increment(device) == 0)
+		return LIBINPUT_CONFIG_STATUS_UNSUPPORTED;
+
+	return device->config.rotation->set(device, degrees_cw);
+}
+
+LIBINPUT_EXPORT int
+libinput_device_config_rotation_get(struct libinput_device *device)
+{
+	if (libinput_device_config_rotation_get_increment(device) == 0)
+		return 0;
+
+	return device->config.rotation->get(device);
+}
+
+LIBINPUT_EXPORT void
+libinput_device_config_rotation_reset(struct libinput_device *device)
+{
+	if (libinput_device_config_rotation_get_increment(device) != 0)
+		device->config.rotation->reset(device);
+}
diff --git a/src/libinput.h b/src/libinput.h
index 571f7ba..328d050 100644
--- a/src/libinput.h
+++ b/src/libinput.h
@@ -1508,6 +1508,75 @@ libinput_device_config_scroll_get_method(struct libinput_device *device);
 void
 libinput_device_config_scroll_reset(struct libinput_device *device);
 
+
+/**
+ * @ingroup config
+ *
+ * Query the rotation increment for this device, if any. The return value is
+ * the increment in degrees. For example, a device that returns 90 may only
+ * be rotated in 90-degree increments.
+ *
+ * @param device The device to configure
+ *
+ * @return The rotation increment in degrees, or 0 if the device cannot be
+ * rotated
+ */
+int
+libinput_device_config_rotation_get_increment(struct libinput_device *device);
+
+/**
+ * @ingroup config
+ *
+ * Set the rotation for this device, in degrees clockwise. This rotation
+ * applies to the physical orientation of the device, i.e. if a tablet is
+ * moved from landscape to portrait format, clockwise, this represents a
+ * 90-degree rotation. In the diagram below, if a is the device origin 0/0,
+ * after the rotation the coordinate b sends 0/0 coordinates and a sends
+ * xmax/0.
+ *
+ * @code
+ *   +-------------+    +---------+
+ *   |a            |    |b       a|
+ *   |             | -> |         |
+ *   |b            |    |         |
+ *   +-------------+    |         |
+ *                      |         |
+ *                      +---------+
+ * @endcode
+ *
+ * @param device The device to configure
+ * @param degrees_cw The number of degrees to rotate clockwise
+ *
+ * @return A config status code
+ */
+enum libinput_config_status
+libinput_device_config_rotation_set(struct libinput_device *device,
+				    int degrees_cw);
+
+/**
+ * @ingroup config
+ *
+ * Get the current rotation for this device, in degrees clockwise. If the
+ * device does not support rotation, this function always returns 0.
+ *
+ * @param device The device to configure
+ *
+ * @return The rotation in degrees clockwise
+ */
+int
+libinput_device_config_rotation_get(struct libinput_device *device);
+
+/**
+ * @ingroup config
+ *
+ * Reset the rotation to the device's default setting. If thd evice does not
+ * support rotation, this function does nothing.
+ *
+ * @param device The device to configure
+ */
+void
+libinput_device_config_rotation_reset(struct libinput_device *device);
+
 #ifdef __cplusplus
 }
 #endif
-- 
1.9.0



More information about the wayland-devel mailing list