retro_rs/
buttons.rs

1use rust_libretro_sys::{
2    RETRO_DEVICE_ID_JOYPAD_A, RETRO_DEVICE_ID_JOYPAD_B, RETRO_DEVICE_ID_JOYPAD_DOWN,
3    RETRO_DEVICE_ID_JOYPAD_L, RETRO_DEVICE_ID_JOYPAD_L2, RETRO_DEVICE_ID_JOYPAD_L3,
4    RETRO_DEVICE_ID_JOYPAD_LEFT, RETRO_DEVICE_ID_JOYPAD_R, RETRO_DEVICE_ID_JOYPAD_R2,
5    RETRO_DEVICE_ID_JOYPAD_R3, RETRO_DEVICE_ID_JOYPAD_RIGHT, RETRO_DEVICE_ID_JOYPAD_SELECT,
6    RETRO_DEVICE_ID_JOYPAD_START, RETRO_DEVICE_ID_JOYPAD_UP, RETRO_DEVICE_ID_JOYPAD_X,
7    RETRO_DEVICE_ID_JOYPAD_Y,
8};
9
10#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug)]
11pub struct Buttons(i16);
12impl From<Buttons> for i16 {
13    fn from(value: Buttons) -> Self {
14        value.0
15    }
16}
17impl Buttons {
18    #[must_use]
19    pub fn new() -> Self {
20        Buttons::default()
21    }
22    /// # Panics
23    /// If id is too large for the libretro controller API (0..16)
24    #[must_use]
25    pub fn get(self, id: u32) -> bool {
26        assert!(id < 16);
27        (self.0 & (1 << id)) != 0
28    }
29    /// # Panics: If id is too large for the libretro controller API (0..16)
30    fn mask_inout(self, b: bool, id: u32) -> Self {
31        assert!(id < 16);
32        if b {
33            Buttons(self.0 | (1 << id))
34        } else {
35            Buttons(self.0 & !(1 << id))
36        }
37    }
38    #[must_use]
39    pub fn up(self, b: bool) -> Self {
40        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_UP)
41    }
42    #[must_use]
43    pub fn down(self, b: bool) -> Self {
44        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_DOWN)
45    }
46    #[must_use]
47    pub fn left(self, b: bool) -> Self {
48        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_LEFT)
49    }
50    #[must_use]
51    pub fn right(self, b: bool) -> Self {
52        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_RIGHT)
53    }
54
55    #[must_use]
56    pub fn select(self, b: bool) -> Self {
57        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_SELECT)
58    }
59    #[must_use]
60    pub fn start(self, b: bool) -> Self {
61        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_START)
62    }
63    #[must_use]
64    pub fn a(self, b: bool) -> Self {
65        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_A)
66    }
67    #[must_use]
68    pub fn b(self, b: bool) -> Self {
69        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_B)
70    }
71    #[must_use]
72    pub fn y(self, b: bool) -> Self {
73        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_Y)
74    }
75    #[must_use]
76    pub fn x(self, b: bool) -> Self {
77        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_X)
78    }
79    #[must_use]
80    pub fn l1(self, b: bool) -> Self {
81        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_L)
82    }
83    #[must_use]
84    pub fn r1(self, b: bool) -> Self {
85        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_R)
86    }
87    #[must_use]
88    pub fn l2(self, b: bool) -> Self {
89        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_L2)
90    }
91    #[must_use]
92    pub fn r2(self, b: bool) -> Self {
93        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_R2)
94    }
95    #[must_use]
96    pub fn l3(self, b: bool) -> Self {
97        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_L3)
98    }
99    #[must_use]
100    pub fn r3(self, b: bool) -> Self {
101        self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_R3)
102    }
103
104    #[must_use]
105    pub fn get_up(self) -> bool {
106        self.get(RETRO_DEVICE_ID_JOYPAD_UP)
107    }
108    #[must_use]
109    pub fn get_down(self) -> bool {
110        self.get(RETRO_DEVICE_ID_JOYPAD_DOWN)
111    }
112    #[must_use]
113    pub fn get_left(self) -> bool {
114        self.get(RETRO_DEVICE_ID_JOYPAD_LEFT)
115    }
116    #[must_use]
117    pub fn get_right(self) -> bool {
118        self.get(RETRO_DEVICE_ID_JOYPAD_RIGHT)
119    }
120
121    #[must_use]
122    pub fn get_select(self) -> bool {
123        self.get(RETRO_DEVICE_ID_JOYPAD_SELECT)
124    }
125    #[must_use]
126    pub fn get_start(self) -> bool {
127        self.get(RETRO_DEVICE_ID_JOYPAD_START)
128    }
129    #[must_use]
130    pub fn get_a(self) -> bool {
131        self.get(RETRO_DEVICE_ID_JOYPAD_A)
132    }
133    #[must_use]
134    pub fn get_b(self) -> bool {
135        self.get(RETRO_DEVICE_ID_JOYPAD_B)
136    }
137    #[must_use]
138    pub fn get_y(self) -> bool {
139        self.get(RETRO_DEVICE_ID_JOYPAD_Y)
140    }
141    #[must_use]
142    pub fn get_x(self) -> bool {
143        self.get(RETRO_DEVICE_ID_JOYPAD_X)
144    }
145    #[must_use]
146    pub fn get_l1(self) -> bool {
147        self.get(RETRO_DEVICE_ID_JOYPAD_L)
148    }
149    #[must_use]
150    pub fn get_r1(self) -> bool {
151        self.get(RETRO_DEVICE_ID_JOYPAD_R)
152    }
153    #[must_use]
154    pub fn get_l2(self) -> bool {
155        self.get(RETRO_DEVICE_ID_JOYPAD_L2)
156    }
157    #[must_use]
158    pub fn get_r2(self) -> bool {
159        self.get(RETRO_DEVICE_ID_JOYPAD_R2)
160    }
161    #[must_use]
162    pub fn get_l3(self) -> bool {
163        self.get(RETRO_DEVICE_ID_JOYPAD_L3)
164    }
165    #[must_use]
166    pub fn get_r3(self) -> bool {
167        self.get(RETRO_DEVICE_ID_JOYPAD_R3)
168    }
169}