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}