diff options
author | Louis-Francis Ratté-Boulianne <lfrb@collabora.com> | 2017-12-15 02:02:56 -0500 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2018-05-30 14:46:24 +0300 |
commit | 5a1b0cf0e76d01478dbfb76009d8e986fbe83e4b (patch) | |
tree | 566beae870593fb6d6e0e6d071f5a9c31b91d4ba | |
parent | 83630983ad5335d8a28a9a86ee9b0e9a682d6643 (diff) | |
download | weston-5a1b0cf0e76d01478dbfb76009d8e986fbe83e4b.tar.gz weston-5a1b0cf0e76d01478dbfb76009d8e986fbe83e4b.tar.bz2 weston-5a1b0cf0e76d01478dbfb76009d8e986fbe83e4b.zip |
weston: add touchscreen_calibrator option
Add an option to enable the touchscreen calibrator interface. This is a
global on/off toggle, in lack of more fine-grained access restrictions.
As Weston should not hardcode system specifics, the actual permanent
saving of a new calibration is left for a user supplied script or a
program. Usually this script would write an appropriate udev rule to set
LIBINPUT_CALIBRATION_MATRIX for the touch device.
Co-developed by Louis-Francis and Pekka.
v2:
- use syspath instead of devpath
Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
v1 Tested-by: Matt Hoosier <matt.hoosier@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | compositor/main.c | 68 | ||||
-rw-r--r-- | man/weston.ini.man | 39 |
2 files changed, 107 insertions, 0 deletions
diff --git a/compositor/main.c b/compositor/main.c index 1092204f..e84857f7 100644 --- a/compositor/main.c +++ b/compositor/main.c @@ -765,6 +765,64 @@ load_modules(struct weston_compositor *ec, const char *modules, } static int +save_touch_device_calibration(struct weston_compositor *compositor, + struct weston_touch_device *device, + const struct weston_touch_device_matrix *calibration) +{ + struct weston_config_section *s; + struct weston_config *config = wet_get_config(compositor); + char *helper = NULL; + char *helper_cmd = NULL; + int ret = -1; + int status; + const float *m = calibration->m; + + s = weston_config_get_section(config, + "libinput", NULL, NULL); + + weston_config_section_get_string(s, "calibration_helper", + &helper, NULL); + + if (!helper || strlen(helper) == 0) { + ret = 0; + goto out; + } + + if (asprintf(&helper_cmd, "\"%s\" '%s' %f %f %f %f %f %f", + helper, device->syspath, + m[0], m[1], m[2], + m[3], m[4], m[5]) < 0) + goto out; + + status = system(helper_cmd); + free(helper_cmd); + + if (status < 0) { + weston_log("Error: failed to run calibration helper '%s'.\n", + helper); + goto out; + } + + if (!WIFEXITED(status)) { + weston_log("Error: calibration helper '%s' possibly killed.\n", + helper); + goto out; + } + + if (WEXITSTATUS(status) == 0) { + ret = 0; + } else { + weston_log("Calibration helper '%s' exited with status %d.\n", + helper, WEXITSTATUS(status)); + } + +out: + free(helper); + + return ret; +} + +static int weston_compositor_init_config(struct weston_compositor *ec, struct weston_config *config) { @@ -772,7 +830,9 @@ weston_compositor_init_config(struct weston_compositor *ec, struct weston_config_section *s; int repaint_msec; int vt_switching; + int cal; + /* weston.ini [keyboard] */ s = weston_config_get_section(config, "keyboard", NULL, NULL); weston_config_section_get_string(s, "keymap_rules", (char **) &xkb_names.rules, NULL); @@ -797,6 +857,7 @@ weston_compositor_init_config(struct weston_compositor *ec, &vt_switching, true); ec->vt_switching = vt_switching; + /* weston.ini [core] */ s = weston_config_get_section(config, "core", NULL, NULL); weston_config_section_get_int(s, "repaint-window", &repaint_msec, ec->repaint_msec); @@ -809,6 +870,13 @@ weston_compositor_init_config(struct weston_compositor *ec, weston_log("Output repaint window is %d ms maximum.\n", ec->repaint_msec); + /* weston.ini [libinput] */ + s = weston_config_get_section(config, "libinput", NULL, NULL); + weston_config_section_get_bool(s, "touchscreen_calibrator", &cal, 0); + if (cal) + weston_compositor_enable_touch_calibrator(ec, + save_touch_device_calibration); + return 0; } diff --git a/man/weston.ini.man b/man/weston.ini.man index f237fd60..b5668b5a 100644 --- a/man/weston.ini.man +++ b/man/weston.ini.man @@ -200,8 +200,47 @@ Available configuration are: .TP 7 .BI "enable_tap=" true enables tap to click on touchpad devices +.TP 7 +.BI "touchscreen_calibrator=" true +Advertise the touchscreen calibrator interface to all clients. This is a +potential denial-of-service attack vector, so it should only be enabled on +trusted userspace. Boolean, defaults to +.BR false . + +The interface is required for running touchscreen calibrator applications. It +provides the application raw touch events, bypassing the normal touch handling. +It also allows the application to upload a new calibration into the compositor. + +Even though this option is listed in the libinput section, it does affect all +Weston configurations regardless of the used backend. If the backend does not +use libinput, the interface can still be advertised, but it will not list any +devices. +.TP 7 +.BI "calibration_helper=" /bin/echo +An optional calibration helper program to permanently save a new touchscreen +calibration. String, defaults to unset. + +The given program will be executed with seven arguments when a calibrator +application requests the server to take a new calibration matrix into use. +The program is executed synchronously and will therefore block Weston for its +duration. If the program exit status is non-zero, Weston will not apply the +new calibration. If the helper is unset or the program exit status is zero, +Weston will use the new calibration immediately. + +The program is invoked as: +.PP +.RS 10 +.I calibration_helper syspath m1 m2 m3 m4 m5 m6 +.RE .RS .PP +.RI "where " syspath +is the udev sys path for the device and +.IR m1 " through " m6 +are the calibration matrix elements in libinput's +.BR LIBINPUT_CALIBRATION_MATRIX " udev property format." +The sys path is an absolute path and starts with the sys mount point. +.RE .SH "SHELL SECTION" The |