From 03c564736ae96de01de1aecd9e941ab112ea2af8 Mon Sep 17 00:00:00 2001
From: Szybet <53944559+Szybet@users.noreply.github.com>
Date: Tue, 30 Sep 2025 17:08:03 +0200
Subject: Support calibration-matrix in touch input config
---
docs/wiki/Configuration:-Input.md | 7 +++++--
niri-config/src/input.rs | 2 ++
niri-config/src/lib.rs | 1 +
src/input/mod.rs | 14 ++++++++++++++
4 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/docs/wiki/Configuration:-Input.md b/docs/wiki/Configuration:-Input.md
index 7d7c0d55..81a52e7a 100644
--- a/docs/wiki/Configuration:-Input.md
+++ b/docs/wiki/Configuration:-Input.md
@@ -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`:
Since: 25.08 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`: Since: 25.02 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.
+ - Since: 25.02 for `tablet`
+ - Since: next release for `touch`
Tablets and touchscreens are absolute pointing devices that can be mapped to a specific output like so:
diff --git a/niri-config/src/input.rs b/niri-config/src/input.rs
index cf3df973..12af80ae 100644
--- a/niri-config/src/input.rs
+++ b/niri-config/src/input.rs
@@ -371,6 +371,8 @@ pub struct Tablet {
pub struct Touch {
#[knuffel(child)]
pub off: bool,
+ #[knuffel(child, unwrap(arguments))]
+ pub calibration_matrix: Option>,
#[knuffel(child, unwrap(argument))]
pub map_to_output: Option,
}
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs
index 81971cff..eb6d48b3 100644
--- a/niri-config/src/lib.rs
+++ b/niri-config/src/lib.rs
@@ -993,6 +993,7 @@ mod tests {
},
touch: Touch {
off: false,
+ calibration_matrix: None,
map_to_output: Some(
"eDP-1",
),
diff --git a/src/input/mod.rs b/src/input/mod.rs
index ddd24c4a..163c7748 100644
--- a/src/input/mod.rs
+++ b/src/input/mod.rs
@@ -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),
+ );
}
}
--
cgit