leftwm_core/utils/
modmask_lookup.rsuse bitflags::bitflags;
use serde::{de::Visitor, Deserialize, Serialize};
bitflags! {
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ModMask: u16 {
const Zero = 0;
const Any = 1;
const Shift = 1 << 1;
const Control = 1 << 2;
const Alt = 1 << 3;
const NumLock = 1 << 4;
const Mod3 = 1 << 5;
const Super = 1 << 6;
const Mod5 = 1 << 7;
}
}
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
pub enum Button {
None,
Main,
Middle,
Secondary,
ScrollUp,
ScrollDown,
}
impl From<u8> for Button {
fn from(value: u8) -> Self {
match value {
1 => Self::Main,
2 => Self::Middle,
3 => Self::Secondary,
4 => Self::ScrollUp,
5 => Self::ScrollDown,
_ => Self::None,
}
}
}
impl From<Button> for u8 {
fn from(value: Button) -> Self {
match value {
Button::None => 0,
Button::Main => 1,
Button::Middle => 2,
Button::Secondary => 3,
Button::ScrollUp => 4,
Button::ScrollDown => 5,
}
}
}
#[must_use]
pub fn into_modmask(keys: &[String]) -> ModMask {
let mut mask = ModMask::Zero;
for s in keys {
mask |= into_mod(s);
}
mask.remove(ModMask::NumLock);
mask.intersection(
ModMask::Shift
| ModMask::Control
| ModMask::Alt
| ModMask::Mod3
| ModMask::Super
| ModMask::Mod5,
)
}
#[must_use]
pub fn into_mod(key: &str) -> ModMask {
match key {
"None" => ModMask::Any,
"Shift" => ModMask::Shift,
"Control" => ModMask::Control,
"Mod1" | "Alt" => ModMask::Alt,
"Mod3" => ModMask::Mod3,
"Mod4" | "Super" => ModMask::Super,
"Mod5" => ModMask::Mod5,
_ => ModMask::Zero,
}
}
impl Serialize for ModMask {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_u16(self.bits())
}
}
impl<'de> Deserialize<'de> for ModMask {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
struct ModmaskVisitor;
impl<'de> Visitor<'de> for ModmaskVisitor {
type Value = ModMask;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("a bitfield on 8 bits")
}
fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(ModMask::from_bits_retain(u16::from(v)))
}
fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(ModMask::from_bits_retain(v))
}
}
deserializer.deserialize_u16(ModmaskVisitor)
}
}