From: Pekka Paalanen <pekka.paala...@collabora.co.uk>

This is a Wayland protocol extension to allow the calibration of
touchscreens in Weston.

See: https://phabricator.freedesktop.org/T7868

Signed-off-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
---
 Makefile.am                           |   5 +-
 protocol/weston-touch-calibration.xml | 320 ++++++++++++++++++++++++++++++++++
 2 files changed, 324 insertions(+), 1 deletion(-)
 create mode 100644 protocol/weston-touch-calibration.xml

diff --git a/Makefile.am b/Makefile.am
index e028a2a1..5e830777 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -168,7 +168,9 @@ nodist_libweston_@LIBWESTON_MAJOR@_la_SOURCES =             
                \
        protocol/pointer-constraints-unstable-v1-protocol.c             \
        protocol/pointer-constraints-unstable-v1-server-protocol.h      \
        protocol/input-timestamps-unstable-v1-protocol.c                \
-       protocol/input-timestamps-unstable-v1-server-protocol.h
+       protocol/input-timestamps-unstable-v1-server-protocol.h         \
+       protocol/weston-touch-calibration-protocol.c                    \
+       protocol/weston-touch-calibration-server-protocol.h
 
 BUILT_SOURCES += $(nodist_libweston_@LIBWESTON_MAJOR@_la_SOURCES)
 
@@ -1534,6 +1536,7 @@ EXTRA_DIST +=                                     \
        protocol/weston-screenshooter.xml       \
        protocol/text-cursor-position.xml       \
        protocol/weston-test.xml                \
+       protocol/weston-touch-calibration.xml   \
        protocol/ivi-application.xml            \
        protocol/ivi-hmi-controller.xml
 
diff --git a/protocol/weston-touch-calibration.xml 
b/protocol/weston-touch-calibration.xml
new file mode 100644
index 00000000..b1e19f9b
--- /dev/null
+++ b/protocol/weston-touch-calibration.xml
@@ -0,0 +1,320 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<protocol name="weston_touch_calibration">
+
+  <copyright>
+    Copyright © 2017 Collabora, Ltd.
+    Copyright © 2017 General Electric Company
+
+    Permission is hereby granted, free of charge, to any person obtaining a
+    copy of this software and associated documentation files (the "Software"),
+    to deal in the Software without restriction, including without limitation
+    the rights to use, copy, modify, merge, publish, distribute, sublicense,
+    and/or sell copies of the Software, and to permit persons to whom the
+    Software is furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice (including the next
+    paragraph) shall be included in all copies or substantial portions of the
+    Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+    DEALINGS IN THE SOFTWARE.
+  </copyright>
+
+  <interface name="weston_touch_calibration" version="1">
+    <description summary="weston touchscreen calibration interface">
+      This is the global interface for calibrating a touchscreen input
+      coordinate transformation. It is recommended to make this interface
+      privileged.
+
+      This interface can be used by a client to show a calibration pattern and
+      receive uncalibrated touch coordinates, facilitating the computation of
+      a calibration transformation that will align actual touch positions
+      on screen with their expected coordinates.
+
+      Immediately after being bound by a client, the server sends the
+      touch_device events.
+
+      The client chooses a touch device from the touch_device events,
+      creates a wl_surface and then a weston_touch_calibrator for the
+      wl_surface and the chosen touch device. The client waits for the server
+      to send a configure event before it starts drawing the first calibration
+      pattern. After receiving the configure event, the client will iterate
+      drawing a pattern, getting touch input via weston_touch_calibrator,
+      and converting pixel coordinates to expected touch coordinates with
+      weston_touch_calibrator.convert until it has enough correspondences to
+      compute the calibration transformation or the server cancels the
+      calibration.
+
+      Once the client has successfully computed a new calibration, it can use
+      weston_touch_calibration.save request to load the new calibration into
+      the server. The server may take this new calibration into use and may
+      write it into persistent storage.
+    </description>
+
+    <enum name="error">
+      <description summary="global interface errors"/>
+      <entry name="invalid_surface" value="0"
+             summary="the given wl_surface already has a role"/>
+      <entry name="invalid_device" value="1"
+             summary="the given device is not valid"/>
+      <entry name="already_exists" value="2"
+             summary="a calibrator has already been created"/>
+    </enum>
+
+    <request name="destroy" type="destructor">
+      <description summary="unbind">
+       Destroy the binding to the global interface, does not affect any
+       objects already created through this interface.
+      </description>
+    </request>
+
+    <request name="create_calibrator">
+      <description summary="give the calibrator role to a surface">
+       This gives the calibrator role to the surface and ties it with the
+       given touch input device.
+
+       The surface must not already have a role, otherwise invalid_surface
+       error is raised.
+
+       The device string must be one advertised with touch_device event's
+       device argument, otherwise invalid_device error is raised.
+
+       There must not exist a weston_touch_calibrator protocol object in the
+       server already, otherwise already_exists error is raised. This
+       limitation is server-wide and not specific to any particular client.
+      </description>
+      <arg name="surface" type="object" interface="wl_surface"
+           summary="the surface to give the role to"/>
+      <arg name="device" type="string" summary="the touch device to 
calibrate"/>
+      <arg name="cal" type="new_id" interface="weston_touch_calibrator"
+           summary="a new calibrator object"/>
+    </request>
+
+    <request name="save">
+      <description summary="save calibration for a touch device">
+       This request asks the server to save the calibration data for the
+       given touch input device. The server may ignore this request.
+
+       The device string must be one advertised with touch_device event's
+       device argument, otherwise invalid_device error is raised.
+
+       The array must contain exactly six 'float' (the 32-bit floating
+       point format used by the C language on the system) numbers. The numbers
+       form a libinput style 2-by-3 calibration matrix in row-major order.
+      </description>
+      <arg name="device" type="string" summary="the target touch device"/>
+      <arg name="matrix" type="array" summary="the new calibration matrix"/>
+    </request>
+
+    <event name="touch_device">
+      <description summary="advertise a touchscreen input device">
+       When a client binds to weston_touch_calibration, one touch_device
+       event is sent for each touchscreen that is available to be calibrated.
+       These events are not sent later even if new touch devices appear.
+
+       An event carries the touch device identification and the associated
+       output or head (display connector) name.
+
+       On platforms using udev, the device identification is the udev DEVPATH.
+      </description>
+      <arg name="device" type="string"
+           summary="the touch device identification"/>
+      <arg name="head" type="string"
+           summary="name of the head or display connector"/>
+    </event>
+  </interface>
+
+  <interface name="weston_touch_calibrator" version="1">
+    <description summary="calibrator surface for a specific touch device">
+      On creation, this object is tied to a specific touch device. The
+      server sends a configure event which the client must obey with the
+      associated wl_surface.
+
+      Once the client has committed content to the surface, the server can
+      grab the touch input device, prevent it from emitting normal touch 
events,
+      show the surface on the correct output, and relay input events from the
+      touch device via this protocol object.
+
+      Touch events from other touch devices than the one tied to this object
+      must generate wrong_touch events on at least touch-down and must not
+      generate normal or calibration touch events.
+
+      At any time, the server can choose to cancel the calibration procedure by
+      sending the cancel_calibration event. This should also be used if the
+      touch device disappears or anything else prevents the calibration from
+      continuing on the server side.
+
+      If the wl_surface is destroyed, the server must cancel the calibration.
+
+      The touch event coordinates and conversion results are delivered in
+      calibration units. Calibration units are in the closed interval
+      [0.0, 1.0] mapped into 32-bit unsigned integers. An integer can be
+      converted into a real value by dividing by 2^32-1. A calibration matrix
+      must be computed from the [0.0, 1.0] real values, but the matrix elements
+      do not need to fall into that range.
+    </description>
+
+    <enum name="error">
+      <description summary="calibrator object errors"/>
+      <entry name="bad_size" value="0"
+             summary="surface size does not match"/>
+      <entry name="not_mapped" value="0"
+             summary="requested operation is not possible without mapping the 
surface"/>
+    </enum>
+
+    <request name="destroy" type="destructor">
+      <description summary="destroy the calibrator">
+       This unmaps the surface if it was mapped. The input device grab
+       is dropped, if it was present. The surface loses its role as a
+       calibrator.
+      </description>
+    </request>
+
+    <request name="convert">
+      <description summary="convert from surface to raw coordinates">
+       This request asks the server to convert the surface-local coordinates
+       into the expected touch input coordinates appropriate for the
+       associated touch device.
+
+       The coordinates given as arguments to this request are relative to
+       the associated wl_surface.
+
+       If a client asks for conversion before it has committed valid
+       content to the wl_surface, the not_mapped error is raised.
+
+       If the server has cancelled the calibration, the conversion result
+       shall be zeroes.
+
+       The intention is that a client uses this request to convert marker
+       positions that the user is supposed to touch during calibration.
+      </description>
+      <arg name="x" type="int" summary="surface-local X coordinate"/>
+      <arg name="y" type="int" summary="surface-local Y coordinate"/>
+      <arg name="reply" type="new_id" interface="weston_touch_coordinate"
+           summary="object delivering the result"/>
+    </request>
+
+    <event name="configure">
+      <description summary="surface size">
+       This event tells the client what size to make the surface. The client
+       must obey the size exactly on the next commit with a wl_buffer.
+
+       This event shall be sent once as a response to creating a
+       weston_touch_calibrator object.
+      </description>
+      <arg name="width" type="int" summary="surface width"/>
+      <arg name="height" type="int" summary="surface height"/>
+    </event>
+
+    <event name="cancel_calibration">
+      <description summary="cancel the calibration procedure">
+       This is sent when the server wants to cancel the calibration and
+       drop the touch device grab. The server unmaps the surface, if
+       it was mapped.
+
+       The weston_touch_calibrator object will not send any more events. The
+       client should destroy it.
+      </description>
+    </event>
+
+    <event name="wrong_touch">
+      <description summary="user touched a wrong touchscreen">
+       Calibration can only be done on one touch input device at a time. If
+       the user touches another touch device during calibration, the server
+       sends this event to notify the calibration client. The client should
+       show feedback to the user that he touched a wrong screen. This is
+       useful particularly when it is impossible for a user to tell which
+       screen he should touch (when the screens are cloned).
+      </description>
+    </event>
+
+    <!-- touch events copied from wl_touch interface -->
+    <event name="down">
+      <description summary="touch down event and beginning of a touch 
sequence">
+       A new touch point has appeared on the surface. This touch point is
+       assigned a unique ID. Future events from this touch point reference
+       this ID. The ID ceases to be valid after a touch up event and may be
+       reused in the future.
+
+       For the coordinate units, see weston_touch_calibrator.
+      </description>
+      <arg name="time" type="uint" summary="timestamp with millisecond 
granularity"/>
+      <arg name="id" type="int" summary="the unique ID of this touch point"/>
+      <arg name="x" type="uint" summary="x coordinate in calibration units"/>
+      <arg name="y" type="uint" summary="y coordinate in calibration units"/>
+    </event>
+
+    <event name="up">
+      <description summary="end of a touch event sequence">
+       The touch point has disappeared. No further events will be sent for
+       this touch point and the touch point's ID is released and may be
+       reused in a future touch down event.
+      </description>
+      <arg name="time" type="uint" summary="timestamp with millisecond 
granularity"/>
+      <arg name="id" type="int" summary="the unique ID of this touch point"/>
+    </event>
+
+    <event name="motion">
+      <description summary="update of touch point coordinates">
+       A touch point has changed coordinates.
+
+       For the coordinate units, see weston_touch_calibrator.
+      </description>
+      <arg name="time" type="uint" summary="timestamp with millisecond 
granularity"/>
+      <arg name="id" type="int" summary="the unique ID of this touch point"/>
+      <arg name="x" type="uint" summary="x coordinate in calibration units"/>
+      <arg name="y" type="uint" summary="y coordinate in calibration units"/>
+    </event>
+
+    <event name="frame">
+      <description summary="end of touch frame event">
+       Indicates the end of a set of events that logically belong together.
+       A client is expected to accumulate the data in all events within the
+       frame before proceeding.
+
+       A wl_touch.frame terminates at least one event but otherwise no
+       guarantee is provided about the set of events within a frame. A client
+       must assume that any state not updated in a frame is unchanged from the
+       previously known state.
+      </description>
+    </event>
+
+    <event name="cancel">
+      <description summary="touch session cancelled">
+       Sent if the compositor decides the touch stream is a global
+       gesture. No further events are sent to the clients from that
+       particular gesture. Touch cancellation applies to all touch points
+       currently active on this client's surface. The client is
+       responsible for finalizing the touch points, future touch points on
+       this surface may reuse the touch point ID.
+      </description>
+    </event>
+    <!-- END of touch events copied from wl_touch interface -->
+
+  </interface>
+
+  <interface name="weston_touch_coordinate" version="1">
+    <description summary="coordinate conversion reply"/>
+
+    <!-- no destructor request defined, no requests possible -->
+
+    <event name="result">
+      <description summary="coordinates in raw touch space">
+       This event returns the conversion result from surface coordinates to
+       raw touch device coordinates.
+
+       For details, see weston_touch_calibrator.convert. For the coordinate
+       units, see weston_touch_calibrator.
+
+       This event destroys the weston_touch_coordinate object.
+      </description>
+      <arg name="x" type="uint" summary="x coordinate in calibration units"/>
+      <arg name="y" type="uint" summary="y coordinate in calibration units"/>
+    </event>
+  </interface>
+</protocol>
-- 
2.16.1

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to