Instead of automatically transforming absolute coordinates of touch and
pointer events to screen coordinates, the user now uses the corresponding
transform helper function. This means the coordinates returned by
libinput_event_pointer_get_absolute_x(),
libinput_event_pointer_get_absolute_y(), libinput_touch_get_x() and
libinput_touch_get_y() has changed from being in output screen coordinate
space to being in device specific coordinate space.

For example, where one before would call libinput_event_touch_get_x(event),
one now calls libinput_event_touch_get_x_transformed(event, output_width).

Signed-off-by: Jonas Ådahl <[email protected]>
---
 src/evdev.c    |  54 ++++++++++--------------
 src/evdev.h    |  10 +++++
 src/libinput.c |  44 ++++++++++++++++++++
 src/libinput.h | 128 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 test/litest.c  |  11 -----
 5 files changed, 186 insertions(+), 61 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index 46bd35a..cb83a1f 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -86,6 +86,24 @@ transform_absolute(struct evdev_device *device, int32_t *x, 
int32_t *y)
        }
 }
 
+li_fixed_t
+evdev_device_transform_x(struct evdev_device *device,
+                        li_fixed_t x,
+                        uint32_t width)
+{
+       return (x - device->abs.min_x) * width /
+               (device->abs.max_x - device->abs.min_x);
+}
+
+li_fixed_t
+evdev_device_transform_y(struct evdev_device *device,
+                        li_fixed_t y,
+                        uint32_t height)
+{
+       return (y - device->abs.min_y) * height /
+               (device->abs.max_y - device->abs.min_y);
+}
+
 static void
 evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
 {
@@ -242,16 +260,6 @@ evdev_process_touch(struct evdev_device *device,
                    struct input_event *e,
                    uint32_t time)
 {
-       struct libinput *libinput = device->base.seat->libinput;
-       int screen_width;
-       int screen_height;
-
-       libinput->interface->get_current_screen_dimensions(
-               &device->base,
-               &screen_width,
-               &screen_height,
-               libinput->user_data);
-
        switch (e->code) {
        case ABS_MT_SLOT:
                evdev_flush_pending_event(device, time);
@@ -267,16 +275,12 @@ evdev_process_touch(struct evdev_device *device,
                        device->pending_event = EVDEV_ABSOLUTE_MT_UP;
                break;
        case ABS_MT_POSITION_X:
-               device->mt.slots[device->mt.slot].x =
-                       (e->value - device->abs.min_x) * screen_width /
-                       (device->abs.max_x - device->abs.min_x);
+               device->mt.slots[device->mt.slot].x = e->value;
                if (device->pending_event == EVDEV_NONE)
                        device->pending_event = EVDEV_ABSOLUTE_MT_MOTION;
                break;
        case ABS_MT_POSITION_Y:
-               device->mt.slots[device->mt.slot].y =
-                       (e->value - device->abs.min_y) * screen_height /
-                       (device->abs.max_y - device->abs.min_y);
+               device->mt.slots[device->mt.slot].y = e->value;
                if (device->pending_event == EVDEV_NONE)
                        device->pending_event = EVDEV_ABSOLUTE_MT_MOTION;
                break;
@@ -287,28 +291,14 @@ static inline void
 evdev_process_absolute_motion(struct evdev_device *device,
                              struct input_event *e)
 {
-       struct libinput *libinput = device->base.seat->libinput;
-       int screen_width;
-       int screen_height;
-
-       libinput->interface->get_current_screen_dimensions(
-               &device->base,
-               &screen_width,
-               &screen_height,
-               libinput->user_data);
-
        switch (e->code) {
        case ABS_X:
-               device->abs.x =
-                       (e->value - device->abs.min_x) * screen_width /
-                       (device->abs.max_x - device->abs.min_x);
+               device->abs.x = e->value;
                if (device->pending_event == EVDEV_NONE)
                        device->pending_event = EVDEV_ABSOLUTE_MOTION;
                break;
        case ABS_Y:
-               device->abs.y =
-                       (e->value - device->abs.min_y) * screen_height /
-                       (device->abs.max_y - device->abs.min_y);
+               device->abs.y = e->value;
                if (device->pending_event == EVDEV_NONE)
                        device->pending_event = EVDEV_ABSOLUTE_MOTION;
                break;
diff --git a/src/evdev.h b/src/evdev.h
index 58ae552..37c32e5 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -146,6 +146,16 @@ int
 evdev_device_has_capability(struct evdev_device *device,
                            enum libinput_device_capability capability);
 
+li_fixed_t
+evdev_device_transform_x(struct evdev_device *device,
+                        li_fixed_t x,
+                        uint32_t width);
+
+li_fixed_t
+evdev_device_transform_y(struct evdev_device *device,
+                        li_fixed_t y,
+                        uint32_t height);
+
 void
 evdev_device_remove(struct evdev_device *device);
 
diff --git a/src/libinput.c b/src/libinput.c
index a77f165..cfce2c5 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -245,6 +245,28 @@ libinput_event_pointer_get_absolute_y(
        return event->y;
 }
 
+LIBINPUT_EXPORT li_fixed_t
+libinput_event_pointer_get_absolute_x_transformed(
+       struct libinput_event_pointer *event,
+       uint32_t width)
+{
+       struct evdev_device *device =
+               (struct evdev_device *) event->base.device;
+
+       return evdev_device_transform_x(device, event->x, width);
+}
+
+LIBINPUT_EXPORT li_fixed_t
+libinput_event_pointer_get_absolute_y_transformed(
+       struct libinput_event_pointer *event,
+       uint32_t height)
+{
+       struct evdev_device *device =
+               (struct evdev_device *) event->base.device;
+
+       return evdev_device_transform_y(device, event->y, height);
+}
+
 LIBINPUT_EXPORT uint32_t
 libinput_event_pointer_get_button(
        struct libinput_event_pointer *event)
@@ -295,6 +317,28 @@ libinput_event_touch_get_x(
 }
 
 LIBINPUT_EXPORT li_fixed_t
+libinput_event_touch_get_x_transformed(
+       struct libinput_event_touch *event,
+       uint32_t width)
+{
+       struct evdev_device *device =
+               (struct evdev_device *) event->base.device;
+
+       return evdev_device_transform_x(device, event->x, width);
+}
+
+LIBINPUT_EXPORT li_fixed_t
+libinput_event_touch_get_y_transformed(
+       struct libinput_event_touch *event,
+       uint32_t height)
+{
+       struct evdev_device *device =
+               (struct evdev_device *) event->base.device;
+
+       return evdev_device_transform_y(device, event->y, height);
+}
+
+LIBINPUT_EXPORT li_fixed_t
 libinput_event_touch_get_y(
        struct libinput_event_touch *event)
 {
diff --git a/src/libinput.h b/src/libinput.h
index ddaeb73..8d347b9 100644
--- a/src/libinput.h
+++ b/src/libinput.h
@@ -395,16 +395,19 @@ libinput_event_pointer_get_dy(
 /**
  * @ingroup event_pointer
  *
- * Return the absolute x coordinate of the device, scaled to screen
- * coordinates.
- * The axes' positive direction is device-specific. For pointer events that
- * are not of type LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE, this function
- * returns 0.
+ * Return the current absolute x coordinate of the pointer event.
+ *
+ * The coordinate is in a device specific coordinate space; to get the
+ * corresponding output screen coordinate, use
+ * libinput_event_pointer_get_x_transformed().
+ *
+ * For pointer events that are not of type
+ * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE, this function returns 0.
  *
  * @note It is an application bug to call this function for events other than
  * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE.
  *
- * @return the current absolute x coordinate scaled to screen coordinates.
+ * @return the current absolute x coordinate
  */
 li_fixed_t
 libinput_event_pointer_get_absolute_x(
@@ -413,15 +416,19 @@ libinput_event_pointer_get_absolute_x(
 /**
  * @ingroup event_pointer
  *
- * Return the absolute y coordinate of the device, scaled to screen 
coordinates.
- * The axes' positive direction is device-specific. For pointer events that
- * are not of type LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE, this function
- * returns 0.
+ * Return the current absolute y coordinate of the pointer event.
+ *
+ * The coordinate is in a device specific coordinate space; to get the
+ * corresponding output screen coordinate, use
+ * libinput_event_pointer_get_y_transformed().
+ *
+ * For pointer events that are not of type
+ * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE, this function returns 0.
  *
  * @note It is an application bug to call this function for events other than
  * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE.
  *
- * @return the current absolute y coordinate scaled to screen coordinates.
+ * @return the current absolute y coordinate
  */
 li_fixed_t
 libinput_event_pointer_get_absolute_y(
@@ -430,6 +437,50 @@ libinput_event_pointer_get_absolute_y(
 /**
  * @ingroup event_pointer
  *
+ * Return the current absolute x coordinate of the pointer event, transformed 
to
+ * screen coordinates.
+ *
+ * For pointer events that are not of type
+ * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE, the return value of this function is
+ * undefined.
+ *
+ * @note It is an application bug to call this function for events other than
+ * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE.
+ *
+ * @param event The libinput pointer event
+ * @param width The current output screen width
+ * @return the current absolute x coordinate transformed to a screen coordinate
+ */
+li_fixed_t
+libinput_event_pointer_get_absolute_x_transformed(
+       struct libinput_event_pointer *event,
+       uint32_t width);
+
+/**
+ * @ingroup event_pointer
+ *
+ * Return the current absolute y coordinate of the pointer event, transformed 
to
+ * screen coordinates.
+ *
+ * For pointer events that are not of type
+ * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE, the return value of this function is
+ * undefined.
+ *
+ * @note It is an application bug to call this function for events other than
+ * LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE.
+ *
+ * @param event The libinput pointer event
+ * @param height The current output screen height
+ * @return the current absolute y coordinate transformed to a screen coordinate
+ */
+li_fixed_t
+libinput_event_pointer_get_absolute_y_transformed(
+       struct libinput_event_pointer *event,
+       uint32_t height);
+
+/**
+ * @ingroup event_pointer
+ *
  * Return the button that triggered this event.
  * For pointer events that are not of type LIBINPUT_EVENT_POINTER_BUTTON,
  * this function returns 0.
@@ -531,9 +582,16 @@ libinput_event_touch_get_slot(
 /**
  * @ingroup event_touch
  *
+ * Return the current absolute x coordinate of the touch event.
+ *
+ * The coordinate is in a device specific coordinate space; to get the
+ * corresponding output screen coordinate, use
+ * libinput_event_touch_get_x_transformed().
+ *
  * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME.
  *
- * @return the absolute X coordinate on this touch device, scaled to screen 
coordinates.
+ * @param event The libinput touch event
+ * @return the current absolute x coordinate
  */
 li_fixed_t
 libinput_event_touch_get_x(
@@ -542,9 +600,16 @@ libinput_event_touch_get_x(
 /**
  * @ingroup event_touch
  *
+ * Return the current absolute y coordinate of the touch event.
+ *
+ * The coordinate is in a device specific coordinate space; to get the
+ * corresponding output screen coordinate, use
+ * libinput_event_touch_get_y_transformed().
+ *
  * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME.
  *
- * @return the absolute X coordinate on this touch device, scaled to screen 
coordinates.
+ * @param event The libinput touch event
+ * @return the current absolute y coordinate
  */
 li_fixed_t
 libinput_event_touch_get_y(
@@ -553,6 +618,38 @@ libinput_event_touch_get_y(
 /**
  * @ingroup event_touch
  *
+ * Return the current absolute x coordinate of the touch event, transformed to
+ * screen coordinates.
+ *
+ * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME.
+ *
+ * @param event The libinput touch event
+ * @param width The current output screen width
+ * @return the current absolute x coordinate transformed to a screen coordinate
+ */
+li_fixed_t
+libinput_event_touch_get_x_transformed(struct libinput_event_touch *event,
+                                      uint32_t width);
+
+/**
+ * @ingroup event_touch
+ *
+ * Return the current absolute y coordinate of the touch event, transformed to
+ * screen coordinates.
+ *
+ * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME.
+ *
+ * @param event The libinput touch event
+ * @param height The current output screen height
+ * @return the current absolute y coordinate transformed to a screen coordinate
+ */
+li_fixed_t
+libinput_event_touch_get_y_transformed(struct libinput_event_touch *event,
+                                      uint32_t height);
+
+/**
+ * @ingroup event_touch
+ *
  * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME.
  *
  * @return the type of touch that occured on the device
@@ -586,11 +683,6 @@ struct libinput_interface {
         * libinput_create_from_udev()
         */
        void (*close_restricted)(int fd, void *user_data);
-
-       void (*get_current_screen_dimensions)(struct libinput_device *device,
-                                             int *width,
-                                             int *height,
-                                             void *user_data);
 };
 
 /**
diff --git a/test/litest.c b/test/litest.c
index 5235e3c..216e1a0 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -318,20 +318,9 @@ close_restricted(int fd, void *userdata)
        close(fd);
 }
 
-static void
-get_current_screen_dimensions(struct libinput_device *device,
-                             int *width,
-                             int *height,
-                             void *user_data)
-{
-       *width = 1024;
-       *height = 768;
-}
-
 const struct libinput_interface interface = {
        .open_restricted = open_restricted,
        .close_restricted = close_restricted,
-       .get_current_screen_dimensions = get_current_screen_dimensions,
 };
 
 struct litest_device *
-- 
1.8.3.2

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to