This adds a `input-default` setting, which is used for input settings if a device isn't set in `input-devices`. More awkwardly, it also adds an `input-touchpad` setting, which is used instead of `input-default` for touchpad devices, so we can separate mouse and touchpad settings even though they use the same capability and settings. This no longer sets the input config, and only reads it. If we add a UI for per-device config, we'll need some IPC mechanism to list connected devices. (Assuming cosmic-settings can't use libinput directly for that.) This moves `InputConfig` and `XkbConfig` to a new `cosmic-comp-config` crate, so they can be used in `cosmic-settings`.
84 lines
2.3 KiB
Rust
84 lines
2.3 KiB
Rust
// SPDX-License-Identifier: GPL-3.0-only
|
|
#![allow(non_snake_case)]
|
|
|
|
use super::{KeyModifier, KeyModifiers};
|
|
use serde::{Deserialize, Serialize};
|
|
pub use smithay::{
|
|
backend::input::KeyState,
|
|
input::keyboard::{keysyms as KeySyms, Keysym, XkbConfig as WlXkbConfig},
|
|
output::{Mode, Output},
|
|
reexports::input::{AccelProfile, ClickMethod, ScrollMethod, TapButtonMap},
|
|
utils::{Logical, Physical, Point, Size, Transform},
|
|
};
|
|
use tracing::warn;
|
|
use xkbcommon::xkb;
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
#[serde(remote = "Transform")]
|
|
pub enum TransformDef {
|
|
Normal,
|
|
_90,
|
|
_180,
|
|
_270,
|
|
Flipped,
|
|
Flipped90,
|
|
Flipped180,
|
|
Flipped270,
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
#[serde(transparent)]
|
|
pub struct KeyModifiersDef(Vec<KeyModifier>);
|
|
|
|
impl From<KeyModifiersDef> for KeyModifiers {
|
|
fn from(src: KeyModifiersDef) -> Self {
|
|
src.0.into_iter().fold(
|
|
KeyModifiers {
|
|
ctrl: false,
|
|
alt: false,
|
|
shift: false,
|
|
logo: false,
|
|
},
|
|
|mut modis, modi: KeyModifier| {
|
|
modis += modi;
|
|
modis
|
|
},
|
|
)
|
|
}
|
|
}
|
|
|
|
#[allow(non_snake_case)]
|
|
pub fn deserialize_KeyModifiers<'de, D>(deserializer: D) -> Result<KeyModifiers, D::Error>
|
|
where
|
|
D: serde::Deserializer<'de>,
|
|
{
|
|
KeyModifiersDef::deserialize(deserializer).map(Into::into)
|
|
}
|
|
|
|
#[allow(non_snake_case)]
|
|
pub fn deserialize_Keysym<'de, D>(deserializer: D) -> Result<Keysym, D::Error>
|
|
where
|
|
D: serde::Deserializer<'de>,
|
|
{
|
|
use serde::de::{Error, Unexpected};
|
|
|
|
let name = String::deserialize(deserializer)?;
|
|
//let name = format!("KEY_{}", code);
|
|
match xkb::keysym_from_name(&name, xkb::KEYSYM_NO_FLAGS) {
|
|
KeySyms::KEY_NoSymbol => match xkb::keysym_from_name(&name, xkb::KEYSYM_CASE_INSENSITIVE) {
|
|
KeySyms::KEY_NoSymbol => Err(<D::Error as Error>::invalid_value(
|
|
Unexpected::Str(&name),
|
|
&"One of the keysym names of xkbcommon.h without the 'KEY_' prefix",
|
|
)),
|
|
x => {
|
|
warn!(
|
|
"Key-Binding '{}' only matched case insensitive for {:?}",
|
|
name,
|
|
xkb::keysym_get_name(x)
|
|
);
|
|
Ok(x)
|
|
}
|
|
},
|
|
x => Ok(x),
|
|
}
|
|
}
|