use {
crate::{
_private::{KeymapBuildParamsV1, KeymapBuildParamsV1Kind},
keyboard::{mods::Modifiers, syms::KeySym},
},
serde::{Deserialize, Serialize},
std::ops::{BitOr, BitOrAssign},
};
pub mod mods;
pub mod syms;
#[derive(Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub struct ModifiedKeySym {
pub mods: Modifiers,
pub sym: KeySym,
}
impl From<KeySym> for ModifiedKeySym {
fn from(sym: KeySym) -> Self {
Self {
mods: Modifiers(0),
sym,
}
}
}
impl BitOr<Modifiers> for ModifiedKeySym {
type Output = ModifiedKeySym;
fn bitor(self, rhs: Modifiers) -> Self::Output {
ModifiedKeySym {
mods: self.mods | rhs,
sym: self.sym,
}
}
}
impl BitOrAssign<Modifiers> for ModifiedKeySym {
fn bitor_assign(&mut self, rhs: Modifiers) {
self.mods |= rhs;
}
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub struct Keymap(pub u64);
impl Keymap {
pub const INVALID: Self = Self(0);
pub fn is_valid(self) -> bool {
self != Self::INVALID
}
pub fn is_invalid(self) -> bool {
self == Self::INVALID
}
pub fn destroy(self) {
if self.is_valid() {
get!().destroy_keymap(self);
}
}
pub fn builder<'a>() -> KeymapBuilder<'a> {
KeymapBuilder {
v1: KeymapBuildParamsV1 {
kind: None,
shortcuts_group: None,
},
}
}
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub struct Group<'a> {
pub layout: &'a str,
pub variant: &'a str,
}
pub fn parse_keymap(keymap: &str) -> Keymap {
get!(Keymap::INVALID).parse_keymap(keymap)
}
pub fn keymap_from_names(
rules: Option<&str>,
model: Option<&str>,
groups: Option<&[Group<'_>]>,
options: Option<&[&str]>,
) -> Keymap {
get!(Keymap::INVALID).keymap_from_names(rules, model, groups, options)
}
pub struct KeymapBuilder<'a> {
pub(crate) v1: KeymapBuildParamsV1<'a>,
}
impl<'a> KeymapBuilder<'a> {
pub fn build(self) -> Keymap {
get!(Keymap::INVALID).parse_keymap_2(self)
}
pub fn map(mut self, map: &'a str) -> Self {
self.v1.kind = Some(KeymapBuildParamsV1Kind::Map(map));
self
}
pub fn names(
mut self,
rules: Option<&'a str>,
model: Option<&'a str>,
groups: Option<&'a [Group<'a>]>,
options: Option<&'a [&'a str]>,
) -> Self {
self.v1.kind = Some(KeymapBuildParamsV1Kind::Names {
rules,
model,
groups: groups.map(|v| v.to_vec()),
options: options.map(|v| v.to_vec()),
});
self
}
pub fn shortcuts_group(mut self, group: u32) -> Self {
self.v1.shortcuts_group = Some(group);
self
}
}