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>
This commit is contained in:
parent
83630983ad
commit
5a1b0cf0e7
@ -764,6 +764,64 @@ load_modules(struct weston_compositor *ec, const char *modules,
|
||||
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
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user