#!/bin/bash

# Copyright 2018 Collabora, Ltd.
# Copyright 2018 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.

# This is an example script working as Weston's calibration helper.
# Its purpose is to permanently store the calibration matrix for the given
# touchscreen input device into a udev property. Since this script naturally
# runs as the user that runs Weston, it presumably cannot write directly into
# /etc. It is left for the administrator to set up appropriate files and
# permissions.

# To use this script, one needs to edit weston.ini, in section [libinput], add:
#   calibration_helper=/path/to/bin/calibration-helper.bash

# exit immediately if any command fails
set -e

# The arguments Weston gives us:
SYSPATH="$1"
MATRIX="$2 $3 $4 $5 $6 $7"

# Pick something to recognize the right touch device with.
# Usually one would use something like a serial.
SERIAL=$(udevadm info "$SYSPATH" --query=property | \
	awk -- 'BEGIN { FS="=" } { if ($1 == "ID_SERIAL") { print $2; exit } }')

# If cannot find a serial, tell the server to not use the new calibration.
[ -z "$SERIAL" ] && exit 1

# You'd have this write a file instead.
echo "ACTION!=\"remove\",SUBSYSTEM==\"input\",ENV{ID_SERIAL}==\"$SERIAL\",ENV{LIBINPUT_CALIBRATION_MATRIX}=\"$MATRIX\""

# Then you'd tell udev to reload the rules:
#udevadm control --reload
# This lets Weston get the new calibration if you unplug and replug the input
# device. Instead of writing a udev rule directly, you could have a udev rule
# with IMPORT{file}="/path/to/calibration", write
# "LIBINPUT_CALIBRATION_MATRIX=\"$MATRIX\"" into /path/to/calibration instead,
# and skip this reload step.

# Make udev process the new rule by triggering a "change" event:
#udevadm trigger "$SYSPATH"
# If you were to restart Weston without rebooting, this lets it pick up the new
# calibration.
