event.rs

 1use x11rb::protocol::{
 2    xinput,
 3    xproto::{self, ModMask},
 4};
 5
 6use crate::{Modifiers, MouseButton, NavigationDirection};
 7
 8pub(crate) fn button_of_key(detail: xproto::Button) -> Option<MouseButton> {
 9    Some(match detail {
10        1 => MouseButton::Left,
11        2 => MouseButton::Middle,
12        3 => MouseButton::Right,
13        8 => MouseButton::Navigate(NavigationDirection::Back),
14        9 => MouseButton::Navigate(NavigationDirection::Forward),
15        _ => return None,
16    })
17}
18
19pub(crate) fn modifiers_from_state(state: xproto::KeyButMask) -> Modifiers {
20    Modifiers {
21        control: state.contains(xproto::KeyButMask::CONTROL),
22        alt: state.contains(xproto::KeyButMask::MOD1),
23        shift: state.contains(xproto::KeyButMask::SHIFT),
24        platform: state.contains(xproto::KeyButMask::MOD4),
25        function: false,
26    }
27}
28
29pub(crate) fn modifiers_from_xinput_info(modifier_info: xinput::ModifierInfo) -> Modifiers {
30    Modifiers {
31        control: modifier_info.effective as u16 & ModMask::CONTROL.bits()
32            == ModMask::CONTROL.bits(),
33        alt: modifier_info.effective as u16 & ModMask::M1.bits() == ModMask::M1.bits(),
34        shift: modifier_info.effective as u16 & ModMask::SHIFT.bits() == ModMask::SHIFT.bits(),
35        platform: modifier_info.effective as u16 & ModMask::M4.bits() == ModMask::M4.bits(),
36        function: false,
37    }
38}
39
40pub(crate) fn pressed_button_from_mask(button_mask: u32) -> Option<MouseButton> {
41    Some(if button_mask & 2 == 2 {
42        MouseButton::Left
43    } else if button_mask & 4 == 4 {
44        MouseButton::Middle
45    } else if button_mask & 8 == 8 {
46        MouseButton::Right
47    } else {
48        return None;
49    })
50}