cosmic-comp/src/config/types.rs

88 lines
2.4 KiB
Rust
Raw Normal View History

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::{
backend::input::KeyState,
2022-08-31 13:01:23 +02:00
input::keyboard::{keysyms as KeySyms, Keysym, XkbConfig as WlXkbConfig},
output::{Mode, Output},
2022-04-25 23:00:30 +02:00
reexports::input::{AccelProfile, ClickMethod, ScrollMethod, TapButtonMap},
utils::{Logical, Physical, Point, Size, Transform},
};
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};
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
}
}