2022-04-25 23:00:30 +02:00
|
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
|
#![allow(non_snake_case)]
|
|
|
|
|
|
2022-08-31 13:01:23 +02:00
|
|
|
use super::{KeyModifier, KeyModifiers};
|
2022-04-25 23:00:30 +02:00
|
|
|
use serde::{Deserialize, Serialize};
|
2023-09-29 21:33:16 +02:00
|
|
|
use smithay::reexports::x11rb::NO_SYMBOL;
|
2022-04-25 23:00:30 +02:00
|
|
|
pub use smithay::{
|
2024-06-27 16:42:41 +02:00
|
|
|
input::keyboard::{Keysym, XkbConfig as WlXkbConfig},
|
|
|
|
|
utils::Transform,
|
2022-04-25 23:00:30 +02:00
|
|
|
};
|
2023-02-24 17:41:52 +01:00
|
|
|
use tracing::warn;
|
2022-04-25 23:00:30 +02:00
|
|
|
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)]
|
2023-09-30 08:42:42 -05:00
|
|
|
pub fn deserialize_Keysym<'de, D>(deserializer: D) -> Result<Option<Keysym>, D::Error>
|
2022-04-25 23:00:30 +02:00
|
|
|
where
|
|
|
|
|
D: serde::Deserializer<'de>,
|
|
|
|
|
{
|
|
|
|
|
use serde::de::{Error, Unexpected};
|
|
|
|
|
|
2023-10-02 13:03:40 -05:00
|
|
|
let name = String::deserialize(deserializer)?;
|
2022-04-25 23:00:30 +02:00
|
|
|
//let name = format!("KEY_{}", code);
|
|
|
|
|
match xkb::keysym_from_name(&name, xkb::KEYSYM_NO_FLAGS) {
|
2023-09-29 21:33:16 +02:00
|
|
|
x if x.raw() == NO_SYMBOL => {
|
|
|
|
|
match xkb::keysym_from_name(&name, xkb::KEYSYM_CASE_INSENSITIVE) {
|
|
|
|
|
x if x.raw() == NO_SYMBOL => 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(Some(x))
|
|
|
|
|
}
|
2022-04-25 23:00:30 +02:00
|
|
|
}
|
2023-09-29 21:33:16 +02:00
|
|
|
}
|
2023-09-30 08:42:42 -05:00
|
|
|
x => Ok(Some(x)),
|
2022-04-25 23:00:30 +02:00
|
|
|
}
|
|
|
|
|
}
|