Support calibration-matrix in touch input config

This commit is contained in:
Szybet
2025-09-30 17:08:03 +02:00
committed by Ivan Molodetskikh
parent 1b41ef146d
commit 03c564736a
4 changed files with 22 additions and 2 deletions

View File

@@ -96,6 +96,7 @@ input {
touch {
// off
map-to-output "eDP-1"
// calibration-matrix 1.0 0.0 0.0 0.0 1.0 0.0
}
// disable-power-key-handling
@@ -256,9 +257,11 @@ Settings specific to `touchpad` and `mouse`:
<sup>Since: 25.08</sup> You can also override horizontal and vertical scroll factor separately like so: `scroll-factor horizontal=2.0 vertical=-1.0`
Settings specific to `tablet`s:
Settings specific to `tablet` and `touch`:
- `calibration-matrix`: <sup>Since: 25.02</sup> set to six floating point numbers to change the calibration matrix. See the [`LIBINPUT_CALIBRATION_MATRIX` documentation](https://wayland.freedesktop.org/libinput/doc/latest/device-configuration-via-udev.html) for examples.
- `calibration-matrix`: set to six floating point numbers to change the calibration matrix. See the [`LIBINPUT_CALIBRATION_MATRIX` documentation](https://wayland.freedesktop.org/libinput/doc/latest/device-configuration-via-udev.html) for examples.
- <sup>Since: 25.02</sup> for `tablet`
- <sup>Since: next release</sup> for `touch`
Tablets and touchscreens are absolute pointing devices that can be mapped to a specific output like so:

View File

@@ -371,6 +371,8 @@ pub struct Tablet {
pub struct Touch {
#[knuffel(child)]
pub off: bool,
#[knuffel(child, unwrap(arguments))]
pub calibration_matrix: Option<Vec<f32>>,
#[knuffel(child, unwrap(argument))]
pub map_to_output: Option<String>,
}

View File

@@ -993,6 +993,7 @@ mod tests {
},
touch: Touch {
off: false,
calibration_matrix: None,
map_to_output: Some(
"eDP-1",
),

View File

@@ -4564,6 +4564,20 @@ pub fn apply_libinput_settings(config: &niri_config::Input, device: &mut input::
} else {
input::SendEventsMode::ENABLED
});
#[rustfmt::skip]
const IDENTITY_MATRIX: [f32; 6] = [
1., 0., 0.,
0., 1., 0.,
];
let _ = device.config_calibration_set_matrix(
c.calibration_matrix
.as_deref()
.and_then(|m| m.try_into().ok())
.or(device.config_calibration_default_matrix())
.unwrap_or(IDENTITY_MATRIX),
);
}
}