jay_config/keyboard/mod.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
//! Tools affecting the keyboard behavior.
use {
crate::keyboard::{mods::Modifiers, syms::KeySym},
serde::{Deserialize, Serialize},
std::ops::{BitOr, BitOrAssign},
};
pub mod mods;
pub mod syms;
/// A keysym with zero or more modifiers
#[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;
}
}
/// A keymap.
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub struct Keymap(pub u64);
impl Keymap {
/// The invalid keymap.
pub const INVALID: Self = Self(0);
/// Returns whether this keymap is valid.
pub fn is_valid(self) -> bool {
self != Self::INVALID
}
/// Returns whether this keymap is invalid.
pub fn is_invalid(self) -> bool {
self == Self::INVALID
}
/// Destroys this reference to the keymap.
///
/// Seats that are currently using this keymap are unaffected.
pub fn destroy(self) {
if self.is_valid() {
get!().destroy_keymap(self);
}
}
}
/// Parses a keymap.
///
/// The returned keymap can later be used to set the keymap of a seat. If the keymap cannot
/// be parsed, returns an invalid keymap. Trying to set a seat's keymap to an invalid keymap
/// has no effect.
///
/// A simple keymap looks as follows:
///
/// ```text
/// xkb_keymap {
/// xkb_keycodes { include "evdev+aliases(qwerty)" };
/// xkb_types { include "complete" };
/// xkb_compat { include "complete" };
/// xkb_symbols { include "pc+inet(evdev)+us(basic)" };
/// };
/// ```
///
/// To use a programmer Dvorak, replace the corresponding line by
///
/// ```text
/// xkb_symbols { include "pc+inet(evdev)+us(dvp)" };
/// ```
///
/// To use a German keymap, replace the corresponding line by
///
/// ```text
/// xkb_symbols { include "pc+inet(evdev)+de(basic)" };
/// ```
///
/// You can also use a completely custom keymap that doesn't use any includes. See the
/// [default][default] Jay keymap for an example.
///
/// General information about the keymap format can be found in the [arch wiki][wiki].
///
/// [default]: https://github.com/mahkoh/jay/tree/master/src/keymap.xkb
/// [wiki]: https://wiki.archlinux.org/title/X_keyboard_extension
pub fn parse_keymap(keymap: &str) -> Keymap {
get!(Keymap::INVALID).parse_keymap(keymap)
}