feat(input): show touchpad page only if touchpad exists on system

This commit is contained in:
Michael Aaron Murphy 2024-04-10 16:14:03 +02:00 committed by Michael Murphy
parent b75df3c35e
commit 44a333d070
3 changed files with 29 additions and 3 deletions

1
Cargo.lock generated
View file

@ -1329,6 +1329,7 @@ dependencies = [
"tokio",
"tracing",
"tracing-subscriber",
"udev",
"url",
"xkb-data",
]

View file

@ -47,6 +47,7 @@ clap = { version = "4.4.18", features = ["derive"] }
itoa = "1.0.10"
futures = { package = "futures-lite", version = "2.2.0" }
xkb-data = "0.1.0"
udev = "0.8.0"
[dependencies.i18n-embed]
version = "0.14.1"

View file

@ -1,4 +1,5 @@
use crate::app;
use clap::builder::OsStr;
use cosmic::{
cosmic_config::{self, ConfigGet, ConfigSet},
iced::{self, wayland::actions::window::SctkWindowSettings, window},
@ -205,8 +206,31 @@ impl page::Page<crate::pages::Message> for Page {
impl page::AutoBind<crate::pages::Message> for Page {
fn sub_pages(page: page::Insert<crate::pages::Message>) -> page::Insert<crate::pages::Message> {
page.sub_page::<keyboard::Page>()
.sub_page::<mouse::Page>()
.sub_page::<touchpad::Page>()
let insert = page.sub_page::<keyboard::Page>().sub_page::<mouse::Page>();
if system_has_touchpad() {
insert.sub_page::<touchpad::Page>()
} else {
insert
}
}
}
/// Uses `udev` to check if a touchpad device exists on the system.
fn system_has_touchpad() -> bool {
let Ok(mut enumerator) = udev::Enumerator::new() else {
return false;
};
let _res = enumerator.match_subsystem("input");
let Ok(mut devices) = enumerator.scan_devices() else {
return false;
};
devices.any(|device| {
device
.property_value("ID_INPUT_TOUCHPAD")
.map_or(false, |value| value == "1")
})
}