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