From bd4d92bad86f0a2bbac69c645df54955883b45b1 Mon Sep 17 00:00:00 2001 From: SnowNF Date: Wed, 20 Mar 2024 03:32:41 +0800 Subject: [PATCH] libinput: add support for touchscreen set matrix My android pad emit a strange touch input from libinput, need to rotate it in 270 degree clockwise to fix. --- docs/rc.xml.all | 4 ++++ include/config/libinput.h | 16 +++++++++------- src/config/libinput.c | 1 + src/config/rcxml.c | 6 ++++++ src/seat.c | 8 ++++++++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 65a6ab54..546ee010 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -504,6 +504,9 @@ - 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 --> @@ -519,6 +522,7 @@ + diff --git a/include/config/libinput.h b/include/config/libinput.h index 912009ea..59fbf76a 100644 --- a/include/config/libinput.h +++ b/include/config/libinput.h @@ -23,13 +23,15 @@ struct libinput_category { 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); diff --git a/src/config/libinput.c b/src/config/libinput.c index 93ab9af2..65ee42c8 100644 --- a/src/config/libinput.c +++ b/src/config/libinput.c @@ -25,6 +25,7 @@ libinput_category_init(struct libinput_category *l) l->dwt = -1; l->click_method = -1; l->send_events_mode = -1; + l->no_calibration_matrix = true; } enum lab_libinput_device_type diff --git a/src/config/rcxml.c b/src/config/rcxml.c index f749821b..83adc4f0 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -611,6 +611,12 @@ fill_libinput_category(char *nodename, char *content) } 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; + } } } diff --git a/src/seat.c b/src/seat.c index 8da507e7..89750886 100644 --- a/src/seat.c +++ b/src/seat.c @@ -237,6 +237,14 @@ configure_libinput(struct wlr_input_device *wlr_input_device) 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 *