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>
dev
Louis-Francis Ratté-Boulianne 7 years ago committed by Pekka Paalanen
parent 83630983ad
commit 5a1b0cf0e7
  1. 68
      compositor/main.c
  2. 39
      man/weston.ini.man

@ -764,6 +764,64 @@ load_modules(struct weston_compositor *ec, const char *modules,
return 0; return 0;
} }
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 static int
weston_compositor_init_config(struct weston_compositor *ec, weston_compositor_init_config(struct weston_compositor *ec,
struct weston_config *config) struct weston_config *config)
@ -772,7 +830,9 @@ weston_compositor_init_config(struct weston_compositor *ec,
struct weston_config_section *s; struct weston_config_section *s;
int repaint_msec; int repaint_msec;
int vt_switching; int vt_switching;
int cal;
/* weston.ini [keyboard] */
s = weston_config_get_section(config, "keyboard", NULL, NULL); s = weston_config_get_section(config, "keyboard", NULL, NULL);
weston_config_section_get_string(s, "keymap_rules", weston_config_section_get_string(s, "keymap_rules",
(char **) &xkb_names.rules, NULL); (char **) &xkb_names.rules, NULL);
@ -797,6 +857,7 @@ weston_compositor_init_config(struct weston_compositor *ec,
&vt_switching, true); &vt_switching, true);
ec->vt_switching = vt_switching; ec->vt_switching = vt_switching;
/* weston.ini [core] */
s = weston_config_get_section(config, "core", NULL, NULL); s = weston_config_get_section(config, "core", NULL, NULL);
weston_config_section_get_int(s, "repaint-window", &repaint_msec, weston_config_section_get_int(s, "repaint-window", &repaint_msec,
ec->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", weston_log("Output repaint window is %d ms maximum.\n",
ec->repaint_msec); 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; return 0;
} }

@ -200,8 +200,47 @@ Available configuration are:
.TP 7 .TP 7
.BI "enable_tap=" true .BI "enable_tap=" true
enables tap to click on touchpad devices 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 .RS
.PP .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" .SH "SHELL SECTION"
The The

Loading…
Cancel
Save