int dwt; /* -1 or libinput_config_dwt_state */
int click_method; /* -1 or libinput_config_click_method */
int send_events_mode; /* -1 or libinput_config_send_events_mode */
- bool no_calibration_matrix; /* false if have calibration matrix */
- float calibration_matrix[6]; /* calibration matrix */
+ bool have_calibration_matrix;
+ float calibration_matrix[6];
};
enum lab_libinput_device_type get_device_type(const char *s);
l->dwt = -1;
l->click_method = -1;
l->send_events_mode = -1;
- l->no_calibration_matrix = true;
+ l->have_calibration_matrix = false;
}
enum lab_libinput_device_type
#define _POSIX_C_SOURCE 200809L
#include <assert.h>
#include <fcntl.h>
+#include <glib.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <stdbool.h>
current_libinput_category->send_events_mode =
get_send_events_mode(content);
} else if (!strcasecmp(nodename, "calibrationMatrix")) {
- float *m = current_libinput_category->calibration_matrix;
- int r = sscanf(content, "%f%f%f%f%f%f", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]);
- if (r == 6) {
- current_libinput_category->no_calibration_matrix = false;
+ errno = 0;
+ current_libinput_category->have_calibration_matrix = true;
+ float *mat = current_libinput_category->calibration_matrix;
+ gchar **elements = g_strsplit(content, " ", -1);
+ guint length = g_strv_length(elements);
+ for (guint i = 0; i < length; ++i) {
+ char *end_str = NULL;
+ mat[i] = strtof(elements[i], &end_str);
+ if (i == 6 || errno == ERANGE || !end_str) {
+ wlr_log(WLR_ERROR,
+ "bad calibration matrix value, expect six floats");
+ current_libinput_category->have_calibration_matrix = false;
+ errno = 0;
+ break;
+ }
}
+ g_strfreev(elements);
}
}
libinput_device_config_send_events_set_mode(libinput_dev, dc->send_events_mode);
}
+ /* Non-zero if the device can be calibrated, zero otherwise. */
if (libinput_device_config_calibration_has_matrix(libinput_dev) == 0
- || dc->no_calibration_matrix) {
+ || !dc->have_calibration_matrix) {
wlr_log(WLR_INFO, "calibration matrix not configured");
} else {
wlr_log(WLR_INFO, "calibration matrix configured");