1 #include "lr_input.h"
2 #include "retro_callbacks.h"
3 #include "lr_input_crosshair.h"
4 
5 #include <libretro.h>
6 
7 #include <string.h>
8 
9 static
10 uint32_t
setup_joypad_desc(struct retro_input_descriptor * desc_,const unsigned port_,const unsigned id_,const char * str_)11 setup_joypad_desc(struct retro_input_descriptor *desc_,
12                   const unsigned                 port_,
13                   const unsigned                 id_,
14                   const char                    *str_)
15 {
16   desc_->port        = port_;
17   desc_->device      = RETRO_DEVICE_JOYPAD;
18   desc_->index       = 0;
19   desc_->id          = id_;
20   desc_->description = str_;
21 
22   return 1;
23 }
24 
25 static
26 uint32_t
setup_analog_left_desc(struct retro_input_descriptor * desc_,const unsigned port_,const unsigned id_,const char * str_)27 setup_analog_left_desc(struct retro_input_descriptor *desc_,
28                        const unsigned                 port_,
29                        const unsigned                 id_,
30                        const char                    *str_)
31 {
32   desc_->port        = port_;
33   desc_->device      = RETRO_DEVICE_ANALOG;
34   desc_->index       = RETRO_DEVICE_INDEX_ANALOG_LEFT;
35   desc_->id          = id_;
36   desc_->description = str_;
37 
38   return 1;
39 }
40 
41 static
42 uint32_t
setup_analog_right_desc(struct retro_input_descriptor * desc_,const unsigned port_,const unsigned id_,const char * str_)43 setup_analog_right_desc(struct retro_input_descriptor *desc_,
44                         const unsigned                 port_,
45                         const unsigned                 id_,
46                         const char                    *str_)
47 {
48   desc_->port        = port_;
49   desc_->device      = RETRO_DEVICE_ANALOG;
50   desc_->index       = RETRO_DEVICE_INDEX_ANALOG_RIGHT;
51   desc_->id          = id_;
52   desc_->description = str_;
53 
54   return 1;
55 }
56 
57 static
58 uint32_t
setup_mouse_desc(struct retro_input_descriptor * desc_,const unsigned port_,const unsigned id_,const char * str_)59 setup_mouse_desc(struct retro_input_descriptor *desc_,
60                  const unsigned                 port_,
61                  const unsigned                 id_,
62                  const char                    *str_)
63 {
64   desc_->port        = port_;
65   desc_->device      = RETRO_DEVICE_MOUSE;
66   desc_->index       = 0;
67   desc_->id          = id_;
68   desc_->description = str_;
69 
70   return 1;
71 }
72 
73 static
74 uint32_t
setup_lightgun_desc(struct retro_input_descriptor * desc_,const unsigned port_,const unsigned id_,const char * str_)75 setup_lightgun_desc(struct retro_input_descriptor *desc_,
76                     const unsigned                 port_,
77                     const unsigned                 id_,
78                     const char                    *str_)
79 {
80   desc_->port        = port_;
81   desc_->device      = RETRO_DEVICE_LIGHTGUN;
82   desc_->index       = 0;
83   desc_->id          = id_;
84   desc_->description = str_;
85 
86   return 1;
87 }
88 
89 static
90 uint32_t
setup_joypad_descs(struct retro_input_descriptor * desc_,const unsigned port_)91 setup_joypad_descs(struct retro_input_descriptor *desc_,
92                    const unsigned                 port_)
93 {
94   uint32_t rv;
95 
96   rv = 0;
97   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_LEFT,"D-Pad Left");
98   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_UP,"D-Pad Up");
99   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_DOWN,"D-Pad Down");
100   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_RIGHT,"D-Pad Right");
101   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_Y,"A");
102   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_B,"B");
103   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_A,"C");
104   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_L,"L");
105   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_R,"R");
106   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_SELECT,"X (Stop)");
107   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_START,"P (Play/Pause)");
108   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_X,"P (Play/Pause)");
109 
110   return rv;
111 }
112 
113 static
114 uint32_t
setup_flightstick_descs(struct retro_input_descriptor * desc_,const unsigned port_)115 setup_flightstick_descs(struct retro_input_descriptor *desc_,
116                         const unsigned                 port_)
117 {
118   int rv;
119 
120   rv = 0;
121   rv += setup_analog_left_desc(desc_++,port_,RETRO_DEVICE_ID_ANALOG_X,"Horizontal (X)");
122   rv += setup_analog_left_desc(desc_++,port_,RETRO_DEVICE_ID_ANALOG_Y,"Vertical (Y)");
123   rv += setup_analog_right_desc(desc_++,port_,RETRO_DEVICE_ID_ANALOG_Y,"Depth (Z)");
124   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_LEFT,"D-Pad Left");
125   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_UP,"D-Pad Up");
126   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_DOWN,"D-Pad Down");
127   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_RIGHT,"D-Pad Right");
128   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_Y,"A");
129   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_B,"B");
130   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_A,"C");
131   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_L,"L");
132   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_R,"R");
133   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_R2,"Fire");
134   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_SELECT,"X (Stop)");
135   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_START,"P (Play/Pause)");
136   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_X,"P (Play/Pause)");
137 
138   return rv;
139 }
140 
141 static
142 uint32_t
setup_mouse_descs(struct retro_input_descriptor * desc_,const unsigned port_)143 setup_mouse_descs(struct retro_input_descriptor *desc_,
144                   const unsigned                 port_)
145 {
146   uint32_t rv;
147 
148   rv = 0;
149   rv += setup_mouse_desc(desc_++,port_,RETRO_DEVICE_ID_MOUSE_X,"Horizontal Axis");
150   rv += setup_mouse_desc(desc_++,port_,RETRO_DEVICE_ID_MOUSE_Y,"Vertical Axis");
151   rv += setup_mouse_desc(desc_++,port_,RETRO_DEVICE_ID_MOUSE_LEFT,"Left Button");
152   rv += setup_mouse_desc(desc_++,port_,RETRO_DEVICE_ID_MOUSE_MIDDLE,"Middle Button");
153   rv += setup_mouse_desc(desc_++,port_,RETRO_DEVICE_ID_MOUSE_RIGHT,"Right Button");
154 
155   return rv;
156 }
157 
158 static
159 uint32_t
setup_lightgun_descs(struct retro_input_descriptor * desc_,const unsigned port_)160 setup_lightgun_descs(struct retro_input_descriptor *desc_,
161                      const unsigned                 port_)
162 {
163   uint32_t rv;
164 
165   rv = 0;
166   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X,"X Coord");
167   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y,"Y Coord");
168   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_TRIGGER,"Trigger");
169   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_SELECT,"Option");
170   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_RELOAD,"Reload");
171 
172   return rv;
173 }
174 
175 static
176 uint32_t
setup_lightgun_arcade_descs(struct retro_input_descriptor * desc_,const unsigned port_)177 setup_lightgun_arcade_descs(struct retro_input_descriptor *desc_,
178                             const unsigned                 port_)
179 {
180   uint32_t rv;
181 
182   rv = 0;
183   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X,"X Coord");
184   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y,"Y Coord");
185   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_TRIGGER,"Trigger");
186   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_AUX_A,"Service");
187   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_SELECT,"Coins");
188   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_START,"Start");
189   rv += setup_lightgun_desc(desc_++,port_,RETRO_DEVICE_ID_LIGHTGUN_RELOAD,"Holster");
190 
191   return rv;
192 }
193 
194 static
195 uint32_t
setup_orbatak_descs(struct retro_input_descriptor * desc_,const unsigned port_)196 setup_orbatak_descs(struct retro_input_descriptor *desc_,
197                     const unsigned                 port_)
198 {
199   uint32_t rv;
200 
201   rv = 0;
202   rv += setup_analog_left_desc(desc_++,port_,RETRO_DEVICE_ID_ANALOG_X,"Trackball (Horizontal)");
203   rv += setup_analog_left_desc(desc_++,port_,RETRO_DEVICE_ID_ANALOG_Y,"Trackball (Vertical)");
204   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_SELECT,"Start (P1)");
205   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_START,"Start (P2)");
206   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_L,"Coin (P1)");
207   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_R,"Coin (P2)");
208   rv += setup_joypad_desc(desc_++,port_,RETRO_DEVICE_ID_JOYPAD_R2,"Service");
209 
210   return rv;
211 }
212 
213 void
lr_input_device_set_with_descs(const uint32_t port_,const uint32_t device_)214 lr_input_device_set_with_descs(const uint32_t port_,
215                                const uint32_t device_)
216 {
217   uint32_t i;
218   uint32_t rv;
219   struct retro_input_descriptor desc[256];
220 
221   lr_input_device_set(port_,device_);
222 
223   rv = 0;
224   lr_input_crosshair_reset(port_);
225   for(i = 0; i < LR_INPUT_MAX_DEVICES; i++)
226     {
227       switch(lr_input_device_get(i))
228         {
229         case RETRO_DEVICE_NONE:
230           break;
231         default:
232         case RETRO_DEVICE_JOYPAD:
233           rv += setup_joypad_descs(&desc[rv],i);
234           break;
235         case RETRO_DEVICE_FLIGHTSTICK:
236           rv += setup_flightstick_descs(&desc[rv],i);
237           break;
238         case RETRO_DEVICE_MOUSE:
239           rv += setup_mouse_descs(&desc[rv],i);
240           break;
241         case RETRO_DEVICE_LIGHTGUN:
242           rv += setup_lightgun_descs(&desc[rv],i);
243           break;
244         case RETRO_DEVICE_ARCADE_LIGHTGUN:
245           rv += setup_lightgun_arcade_descs(&desc[rv],i);
246           break;
247         case RETRO_DEVICE_ORBATAK_TRACKBALL:
248           rv += setup_orbatak_descs(&desc[rv],i);
249           break;
250         }
251     }
252 
253   memset(&desc[rv],0,sizeof(struct retro_input_descriptor));
254 
255   retro_environment_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS,desc);
256 }
257