Skip to main content

pointer_types/mouse/
button.rs

1use crate::PointerButton;
2
3/// Identifies a button of a mouse controller.
4///
5/// ## Platform-specific
6///
7/// The first three buttons should be supported on all platforms.
8/// [`Self::Back`] and [`Self::Forward`] are supported on most platforms
9/// (when using a compatible mouse).
10///
11/// - **Android, iOS:** Currently not supported.
12/// - **Orbital:** Only left/right/middle buttons are supported at this time.
13/// - **Web, Windows:** Supports left/right/middle/back/forward buttons.
14/// - **Wayland:** Supports buttons 0..=15.
15/// - **macOS:** Supports all button variants.
16/// - **X11:** Technically supports further buttons than this (0..=250).
17#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19#[repr(u8)]
20pub enum MouseButton {
21  /// The primary (usually left) button
22  Left = 0,
23  /// The secondary (usually right) button
24  Right = 1,
25  /// The tertiary (usually middle) button
26  Middle = 2,
27  /// The first side button, frequently assigned a back function
28  Back = 3,
29  /// The second side button, frequently assigned a forward function
30  Forward = 4,
31  /// The sixth button
32  Button6 = 5,
33  /// The seventh button
34  Button7 = 6,
35  /// The eighth button
36  Button8 = 7,
37  /// The ninth button
38  Button9 = 8,
39  /// The tenth button
40  Button10 = 9,
41  /// The eleventh button
42  Button11 = 10,
43  /// The twelfth button
44  Button12 = 11,
45  /// The thirteenth button
46  Button13 = 12,
47  /// The fourteenth button
48  Button14 = 13,
49  /// The fifteenth button
50  Button15 = 14,
51  /// The sixteenth button
52  Button16 = 15,
53  Button17 = 16,
54  Button18 = 17,
55  Button19 = 18,
56  Button20 = 19,
57  Button21 = 20,
58  Button22 = 21,
59  Button23 = 22,
60  Button24 = 23,
61  Button25 = 24,
62  Button26 = 25,
63  Button27 = 26,
64  Button28 = 27,
65  Button29 = 28,
66  Button30 = 29,
67  Button31 = 30,
68  Button32 = 31,
69}
70
71impl From<MouseButton> for PointerButton {
72  fn from(button: MouseButton) -> Self {
73    match button {
74      MouseButton::Left => PointerButton::Primary,
75      MouseButton::Right => PointerButton::Secondary,
76      MouseButton::Middle => PointerButton::Tertiary,
77      MouseButton::Back => PointerButton::Back,
78      MouseButton::Forward => PointerButton::Forward,
79      MouseButton::Button6 => PointerButton::Eraser,
80      MouseButton::Button7 => PointerButton::Other(7),
81      MouseButton::Button8 => PointerButton::Other(8),
82      MouseButton::Button9 => PointerButton::Other(9),
83      MouseButton::Button10 => PointerButton::Other(10),
84      MouseButton::Button11 => PointerButton::Other(11),
85      MouseButton::Button12 => PointerButton::Other(12),
86      MouseButton::Button13 => PointerButton::Other(13),
87      MouseButton::Button14 => PointerButton::Other(14),
88      MouseButton::Button15 => PointerButton::Other(15),
89      MouseButton::Button16 => PointerButton::Other(16),
90      MouseButton::Button17 => PointerButton::Other(17),
91      MouseButton::Button18 => PointerButton::Other(18),
92      MouseButton::Button19 => PointerButton::Other(19),
93      MouseButton::Button20 => PointerButton::Other(20),
94      MouseButton::Button21 => PointerButton::Other(21),
95      MouseButton::Button22 => PointerButton::Other(22),
96      MouseButton::Button23 => PointerButton::Other(23),
97      MouseButton::Button24 => PointerButton::Other(24),
98      MouseButton::Button25 => PointerButton::Other(25),
99      MouseButton::Button26 => PointerButton::Other(26),
100      MouseButton::Button27 => PointerButton::Other(27),
101      MouseButton::Button28 => PointerButton::Other(28),
102      MouseButton::Button29 => PointerButton::Other(29),
103      MouseButton::Button30 => PointerButton::Other(30),
104      MouseButton::Button31 => PointerButton::Other(31),
105      MouseButton::Button32 => PointerButton::Other(32),
106    }
107  }
108}
109
110impl From<PointerButton> for MouseButton {
111  fn from(button: PointerButton) -> Self {
112    match button {
113      PointerButton::Primary => MouseButton::Left,
114      PointerButton::Secondary => MouseButton::Right,
115      PointerButton::Tertiary => MouseButton::Middle,
116      PointerButton::Back => MouseButton::Back,
117      PointerButton::Forward => MouseButton::Forward,
118      PointerButton::Eraser => MouseButton::Button6,
119      PointerButton::Other(n) => match n {
120        7 => MouseButton::Button7,
121        8 => MouseButton::Button8,
122        9 => MouseButton::Button9,
123        10 => MouseButton::Button10,
124        11 => MouseButton::Button11,
125        12 => MouseButton::Button12,
126        13 => MouseButton::Button13,
127        14 => MouseButton::Button14,
128        15 => MouseButton::Button15,
129        16 => MouseButton::Button16,
130        17 => MouseButton::Button17,
131        18 => MouseButton::Button18,
132        19 => MouseButton::Button19,
133        20 => MouseButton::Button20,
134        21 => MouseButton::Button21,
135        22 => MouseButton::Button22,
136        23 => MouseButton::Button23,
137        24 => MouseButton::Button24,
138        25 => MouseButton::Button25,
139        26 => MouseButton::Button26,
140        27 => MouseButton::Button27,
141        28 => MouseButton::Button28,
142        29 => MouseButton::Button29,
143        30 => MouseButton::Button30,
144        31 => MouseButton::Button31,
145        _ => unimplemented!("no mouse button for pointer button `{button:?}`"),
146      },
147    }
148  }
149}