diff --git a/.github/workflows/build_docs.yaml b/.github/workflows/build_docs.yaml
index 674eee8ac..623106502 100644
--- a/.github/workflows/build_docs.yaml
+++ b/.github/workflows/build_docs.yaml
@@ -35,7 +35,7 @@ jobs:
- name: Set up crate rustdoc link
run: |
rgb_version=`grep 'rgb = ' internal/core/Cargo.toml | sed 's/^.*"\(.*\)"/\1/'`
- echo "RUSTDOCFLAGS=$RUSTDOCFLAGS --extern-html-root-url rgb=https://docs.rs/rgb/$rgb_version/ --extern-html-root-url android_activity=https://docs.rs/android-activity/0.5/ --extern-html-root-url raw_window_handle=https://docs.rs/raw_window_handle/0.6 --extern-html-root-url winit=https://docs.rs/winit/0.30 --extern-html-root-url wgpu=https://docs.rs/wgpu/26" >> $GITHUB_ENV
+ echo "RUSTDOCFLAGS=$RUSTDOCFLAGS --extern-html-root-url rgb=https://docs.rs/rgb/$rgb_version/ --extern-html-root-url android_activity=https://docs.rs/android-activity/0.5/ --extern-html-root-url raw_window_handle=https://docs.rs/raw_window_handle/0.6 --extern-html-root-url winit=https://docs.rs/winit/0.30 --extern-html-root-url wgpu=https://docs.rs/wgpu/26 --extern-html-root-url input=https://docs.rs/input/0.9" >> $GITHUB_ENV
- uses: actions/setup-node@v4
with:
node-version: 20
diff --git a/Cargo.toml b/Cargo.toml
index f5895bc51..62c9d22b9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -167,6 +167,7 @@ unicode-segmentation = { version = "1.12.0" }
glow = { version = "0.16" }
tikv-jemallocator = { version = "0.6" }
wgpu-26 = { package = "wgpu", version = "26", default-features = false }
+input = { version = "0.9.0", default-features = false }
[profile.release]
lto = true
diff --git a/api/rs/slint/Cargo.toml b/api/rs/slint/Cargo.toml
index 7d18afd6e..5166911a2 100644
--- a/api/rs/slint/Cargo.toml
+++ b/api/rs/slint/Cargo.toml
@@ -215,6 +215,20 @@ unstable-wgpu-26 = ["i-slint-core/unstable-wgpu-26", "i-slint-backend-selector/u
## ```
unstable-winit-030 = ["backend-winit", "dep:i-slint-backend-winit", "i-slint-backend-selector/unstable-winit-030"]
+
+## Enable support for exposing [libinput](https://docs.rs/input/latest/input/index.html) related APIs in the LinuxKMS backend.
+##
+## APIs guarded with this feature are *NOT* subject to the usual Slint API stability guarantees. This feature as well as the APIs changed or removed
+## in future minor releases of Slint, likely to be replaced by a feature with a similar name but the input version suffix being bumped.
+##
+## To avoid unintended compilation failures, we recommend to use the [tilde requirement](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#tilde-requirements)
+## in your `Cargo.toml` when enabling this feature:
+##
+## ```toml
+## slint = { version = "~1.13", features = ["unstable-input-09"] }
+## ```
+unstable-input-09 = ["i-slint-backend-selector/unstable-input-09"]
+
[dependencies]
i-slint-core = { workspace = true }
slint-macros = { workspace = true }
@@ -273,5 +287,6 @@ features = [
"raw-window-handle-06",
"unstable-wgpu-26",
"unstable-winit-030",
+ "unstable-input-09",
]
rustdoc-args = ["--generate-link-to-definition"]
diff --git a/internal/backends/linuxkms/Cargo.toml b/internal/backends/linuxkms/Cargo.toml
index 5edcf889d..f22707f54 100644
--- a/internal/backends/linuxkms/Cargo.toml
+++ b/internal/backends/linuxkms/Cargo.toml
@@ -33,7 +33,7 @@ i-slint-renderer-skia = { workspace = true, features = ["default", "kms"], optio
i-slint-renderer-femtovg = { workspace = true, features = ["default"], optional = true }
[target.'cfg(target_os = "linux")'.dependencies]
-input = { version = "0.9.0" }
+input = { workspace = true, default-features = true }
xkbcommon = { version = "0.8.0" }
calloop = { version = "0.14.1" }
libseat = { version = "0.2.1", optional = true, default-features = false }
diff --git a/internal/backends/linuxkms/calloop_backend.rs b/internal/backends/linuxkms/calloop_backend.rs
index ec9919e66..23f4bde0c 100644
--- a/internal/backends/linuxkms/calloop_backend.rs
+++ b/internal/backends/linuxkms/calloop_backend.rs
@@ -17,6 +17,7 @@ use calloop::EventLoop;
use i_slint_core::platform::PlatformError;
use crate::fullscreenwindowadapter::FullscreenWindowAdapter;
+use crate::BackendBuilder;
#[cfg(not(any(target_family = "windows", target_vendor = "apple", target_arch = "wasm32")))]
mod input;
@@ -76,16 +77,14 @@ pub struct Backend {
>,
sel_clipboard: RefCell