Signed-off-by: Peter Hutterer <peter.hutte...@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 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel