xmirror-event 0.2.0

Cross-platform input event types for xmirror.
Documentation
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub enum Event {
    KeyDown(Key),
    KeyUp(Key),
    Mods(Mods),

    MouseDown(Mouse),
    MouseUp(Mouse),
    MouseMove { dx: i8, dy: i8 },
    Scroll { dx: i8, dy: i8 },
}

#[rustfmt::skip]
#[repr(u8)]
#[derive(Debug, Clone, Copy)]
pub enum Key {
    A, B, C, D, E, F, G, H, I, J, K, L, M,
    N, O, P, Q, R, S, T, U, V, W, X, Y, Z,

    Num1, Num2, Num3, Num4, Num5,
    Num6, Num7, Num8, Num9, Num0,

    Left,       Up,         Right,      Down,      Enter,
    Esc,        Backspace,  Tab,        Space,     Minus,
    Equal,      LeftBrace,  RightBrace, Backslash, SemiColon,
    Apostrophe, Grave,      Comma,      Dot,       Slash,
    CapsLock,   ScrollLock, Pause,      Print,     Insert,
    Delete,     Home,       End,        PageUp,    PageDown,

    F1, F2, F3, F4,  F5,  F6,
    F7, F8, F9, F10, F11, F12,
}

bitflags::bitflags! {
    #[rustfmt::skip]
    #[repr(C)]
    #[derive(Debug, Clone, Copy)]
    pub struct Mods: u8 {
        const Shift = 1 << 0;
        const Ctrl = 1 << 1;
        const Alt = 1 << 2;
        const Super = 1 << 3;
    }
}

#[repr(u8)]
#[derive(Debug, Clone, Copy)]
pub enum Mouse {
    Left,
    Right,
    Middle,
}

#[repr(u8)]
#[derive(Debug, Clone, Copy)]
pub enum Scroll {
    Up,
    Down,
    Left,
    Right,
}

macro_rules! impl_conversions {
    ( $to_fn:ident, $from_fn:ident, $( $variant:ident => $id:expr ),+ $(,)? ) => {
        pub fn $to_fn(self) -> u32 {
            match self {
                $( Self::$variant => $id, )+
            }
        }
        pub fn $from_fn(id: u32) -> Option<Self> {
            match id {
                $( $id => Some(Self::$variant), )+
                _ => None,
            }
        }
    };
}
macro_rules! impl_platform {
    (
        $to_fn:ident, $from_fn:ident,
        Key { $( $key:ident => $vk:expr ),+ $(,)? }
        Mods { $( $mods:ident => $vmod:expr ),+ $(,)? }
        Mouse { $( $mouse:ident => $vm:expr ),+ $(,)? }
        Scroll { $( $scroll:ident => $vs:expr ),+ $(,)? }
    ) => {
        impl Key { impl_conversions!{ $to_fn, $from_fn, $( $key => $vk ),* } }
        impl Mouse { impl_conversions!{ $to_fn, $from_fn, $( $mouse => $vm ),* } }
        impl Scroll { impl_conversions!{ $to_fn, $from_fn, $( $scroll => $vs ),* } }
        impl Mods {
            pub fn $to_fn(self) -> u32 {
                $( (if self.contains(Self::$mods) { $vmod } else { 0 }) )|*
            }
            pub fn $from_fn(id: u32) -> Self {
                $( (if id & $vmod > 0 { Self::$mods } else { Self::empty() }) )|*
            }
        }
    }
}

impl_platform! {
    to_x11, from_x11,
    Key {
        A => 38,  B => 56,  C => 54,  D => 40,  E => 26,  F => 41,  G => 42,  H => 43,  I => 31,  J => 44,  K => 45,  L => 46,  M => 58,
        N => 57,  O => 32,  P => 33,  Q => 24,  R => 27,  S => 39,  T => 28,  U => 30,  V => 55,  W => 25,  X => 53,  Y => 29,  Z => 52,

        Num1 => 10,  Num2 => 11,  Num3 => 12,  Num4 => 13,  Num5 => 14,
        Num6 => 15,  Num7 => 16,  Num8 => 17,  Num9 => 18,  Num0 => 19,

        Left       => 113,  Up         => 111,  Right      => 114,  Down      => 116,  Enter      =>  36,
        Esc        =>   9,  Backspace  =>  22,  Tab        =>  23,  Space     =>  65,  Minus      =>  20,
        Equal      =>  21,  LeftBrace  =>  34,  RightBrace =>  35,  Backslash =>  51,  SemiColon  =>  47,
        Apostrophe =>  48,  Grave      =>  49,  Comma      =>  59,  Dot       =>  60,  Slash      =>  61,
        CapsLock   =>  66,  ScrollLock =>  78,  Pause      => 127,  Print     => 107,  Insert     => 118,
        Delete     => 119,  Home       => 110,  End        => 115,  PageUp    => 112,  PageDown   => 117,

        F1 => 67,  F2 => 68,  F3 => 69,  F4 =>  70,  F5 =>  71,  F6 =>  72,
        F7 => 73,  F8 => 74,  F9 => 75,  F10 => 76,  F11 => 95,  F12 => 96,
    }
    Mods {
        Shift => 1,  Ctrl => 4,  Alt => 8,  Super => 64,
    }
    Mouse {
        Left => 1,  Middle => 2,  Right => 3,
    }
    Scroll {
        Left => 6,  Down => 4,  Up => 5,  Right => 7,
    }
}

impl_platform! {
    to_macos, from_macos,

    Key {
        A =>  0,  B => 11,  C =>  8,  D =>  2,  E => 14,  F =>  3,  G =>  5,  H =>  4,  I => 34,  J => 38,  K => 40,  L => 37,  M => 46,
        N => 45,  O => 31,  P => 35,  Q => 12,  R => 15,  S =>  1,  T => 17,  U => 32,  V =>  9,  W => 13,  X =>  7,  Y => 16,  Z =>  6,

        Num1 => 18,  Num2 => 19,  Num3 => 20,  Num4 => 21,  Num5 => 23,
        Num6 => 22,  Num7 => 26,  Num8 => 28,  Num9 => 25,  Num0 => 29,

        Left       => 123,  Up         => 126,  Right      => 124,  Down      => 125,  Enter      =>  36,
        Esc        =>  53,  Backspace  =>  51,  Tab        =>  48,  Space     =>  49,  Minus      =>  27,
        Equal      =>  24,  LeftBrace  =>  33,  RightBrace =>  30,  Backslash =>  42,  SemiColon  =>  41,
        Apostrophe =>  39,  Grave      =>  50,  Comma      =>  43,  Dot       =>  47,  Slash      =>  44,
        CapsLock   =>  57,  ScrollLock => 107,  Pause      => 113,  Print     => 105,  Insert     => 114,
        Delete     => 117,  Home       => 115,  End        => 119,  PageUp    => 116,  PageDown   => 121,

        F1 => 122,  F2 => 120,  F3 =>  99,  F4 => 118,  F5 =>  96,  F6 =>  97,
        F7 =>  98,  F8 => 100,  F9 => 101,  F10 => 109,  F11 => 103,  F12 => 111,
    }
    Mods {
        Shift => 0x2_0000,  Ctrl => 0x4_0000,  Alt => 0x8_0000,  Super => 0x10_0000,
    }
    Mouse {
        Left => 1,  Middle => 2,  Right => 3,
    }
    Scroll {
        Left => 1,  Down => 2,  Up => 3,  Right => 4,
    }
}