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