My android pad emit a strange touch input from libinput, need to rotate it in 270 degree clockwise to fix.
- tapButtonMap [lrm|lmr]
- clickMethod [none|buttonAreas|clickfinger]
- sendEventsMode [yes|no|disabledOnExternalMouse]
+ - calibrationMatrix [six float values split by space],
+ visit https://wayland.freedesktop.org/libinput/doc/latest/absolute-axes.html#calibration-of-absolute-devices
+ for more information
-->
<libinput>
<device category="default">
<disableWhileTyping></disableWhileTyping>
<clickMethod></clickMethod>
<sendEventsMode></sendEventsMode>
+ <calibrationMatrix></calibrationMatrix>
</device>
</libinput>
int left_handed;
enum libinput_config_tap_state tap;
enum libinput_config_tap_button_map tap_button_map;
- int tap_and_drag; /* -1 or libinput_config_drag_state */
- int drag_lock; /* -1 or libinput_config_drag_lock_state */
- int accel_profile; /* -1 or libinput_config_accel_profile */
- int middle_emu; /* -1 or libinput_config_middle_emulation_state */
- 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 */
+ int tap_and_drag; /* -1 or libinput_config_drag_state */
+ int drag_lock; /* -1 or libinput_config_drag_lock_state */
+ int accel_profile; /* -1 or libinput_config_accel_profile */
+ int middle_emu; /* -1 or libinput_config_middle_emulation_state */
+ 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 */
};
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;
}
enum lab_libinput_device_type
} else if (!strcasecmp(nodename, "sendEventsMode")) {
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;
+ }
}
}
wlr_log(WLR_INFO, "send events mode configured");
libinput_device_config_send_events_set_mode(libinput_dev, dc->send_events_mode);
}
+
+ if (libinput_device_config_calibration_has_matrix(libinput_dev) == 0
+ || dc->no_calibration_matrix) {
+ wlr_log(WLR_INFO, "calibration matrix not configured");
+ } else {
+ wlr_log(WLR_INFO, "calibration matrix configured");
+ libinput_device_config_calibration_set_matrix(libinput_dev, dc->calibration_matrix);
+ }
}
static struct wlr_output *