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