1 /* -*- Mode: C; indent-tabs-mode: t; tab-width: 4 -*-
2 // ---------------------------------------------------------------------------
4 // Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
5 // ---------------------------------------------------------------------------
6 // SquirrelJME is under the Mozilla Public License Version 2.0.
7 // See license.mkd for licensing and copyright information.
8 // -------------------------------------------------------------------------*/
12 #include "sjme/nvm/nvm.h"
13 #include "sjme/debug.h"
14 #include "3rdparty/libretro/libretro.h"
15 #include "frontend/libretro/shared.h"
17 /** The description of input controls. */
18 const struct retro_controller_description sjme_libretro_inputControlDesc
[] =
20 {"Dial Pad", RETRO_DEVICE_JOYPAD
},
21 {"Game Pad", RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD
, 1)}
24 /** Controller information. */
25 const struct retro_controller_info sjme_libretro_inputControllers
[] =
27 {sjme_libretro_inputControlDesc
, 2},
31 /** Input descriptions:
32 * [SOFT LEFT] [SOFT RIGHT]
34 * [1 o~o] [2 abc] [3 def]
35 * [4 ghi] [5 jkl] [6 mno]
36 * [7 pqrs] [8 tuv] [9 wxyz]
37 * [* shf] [0 +] [# spac]
38 * RetroPad looks like so:
43 static const struct retro_input_descriptor sjme_libretro_descDialPad
[] =
46 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
47 RETRO_DEVICE_ID_JOYPAD_SELECT
, "Soft 1 (Left Shoulder)"},
50 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
51 RETRO_DEVICE_ID_JOYPAD_START
, "Soft 2 (Right Shoulder)"},
54 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
55 RETRO_DEVICE_ID_JOYPAD_X
, "1 Voicemail (Game A)"},
58 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
59 RETRO_DEVICE_ID_JOYPAD_UP
, "2 ABC (Game Up)"},
62 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
63 RETRO_DEVICE_ID_JOYPAD_A
, "3 DEF (Game B)"},
66 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
67 RETRO_DEVICE_ID_JOYPAD_LEFT
, "4 GHI (Game Left)"},
70 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
71 RETRO_DEVICE_ID_JOYPAD_L2
, "5 JKL (Game Fire/Select)"},
74 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
75 RETRO_DEVICE_ID_JOYPAD_RIGHT
, "6 MNO (Game Right)"},
78 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
79 RETRO_DEVICE_ID_JOYPAD_Y
, "7 PQRS (Game C)"},
82 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
83 RETRO_DEVICE_ID_JOYPAD_DOWN
, "8 TUV (Game Down)"},
86 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
87 RETRO_DEVICE_ID_JOYPAD_B
, "9 WXYZ (Game D)"},
90 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
91 RETRO_DEVICE_ID_JOYPAD_L
, "Star (Shift)"},
94 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
95 RETRO_DEVICE_ID_JOYPAD_R2
, "0 Operator (Plus)"},
98 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
99 RETRO_DEVICE_ID_JOYPAD_R
, "Pound (Space)"},
101 /* Touchscreen (via pointer). */
102 {SJME_LIBRETRO_POINTER_PORT
, RETRO_DEVICE_POINTER
, 0,
103 RETRO_DEVICE_ID_POINTER_X
, "Touchscreen X"},
104 {SJME_LIBRETRO_POINTER_PORT
, RETRO_DEVICE_POINTER
, 0,
105 RETRO_DEVICE_ID_POINTER_Y
, "Touchscreen Y"},
106 {SJME_LIBRETRO_POINTER_PORT
, RETRO_DEVICE_POINTER
, 0,
107 RETRO_DEVICE_ID_POINTER_PRESSED
, "Touchscreen Pressed"},
113 /** Game pad controller. */
114 static const struct retro_input_descriptor sjme_libretro_descGamePad
[] =
117 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
118 RETRO_DEVICE_ID_JOYPAD_SELECT
, "Soft 1 (Left Command)"},
119 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
120 RETRO_DEVICE_ID_JOYPAD_START
, "Soft 2 (Right Command)"},
123 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
124 RETRO_DEVICE_ID_JOYPAD_UP
, "Digital Up"},
125 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
126 RETRO_DEVICE_ID_JOYPAD_DOWN
, "Digital Down"},
127 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
128 RETRO_DEVICE_ID_JOYPAD_LEFT
, "Digital Left"},
129 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
130 RETRO_DEVICE_ID_JOYPAD_RIGHT
, "Digital Right"},
131 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
132 RETRO_DEVICE_ID_JOYPAD_L
, "Digital Center"},
134 /* Just Game Keys. */
135 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
136 RETRO_DEVICE_ID_JOYPAD_R
, "Game Fire/Select"},
137 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
138 RETRO_DEVICE_ID_JOYPAD_X
, "Game A"},
139 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
140 RETRO_DEVICE_ID_JOYPAD_A
, "Game B"},
141 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
142 RETRO_DEVICE_ID_JOYPAD_Y
, "Game C"},
143 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
144 RETRO_DEVICE_ID_JOYPAD_B
, "Game D"},
146 /* Touchscreen (via pointer). */
147 {SJME_LIBRETRO_POINTER_PORT
, RETRO_DEVICE_POINTER
, 0,
148 RETRO_DEVICE_ID_POINTER_X
, "Touchscreen X"},
149 {SJME_LIBRETRO_POINTER_PORT
, RETRO_DEVICE_POINTER
, 0,
150 RETRO_DEVICE_ID_POINTER_Y
, "Touchscreen Y"},
151 {SJME_LIBRETRO_POINTER_PORT
, RETRO_DEVICE_POINTER
, 0,
152 RETRO_DEVICE_ID_POINTER_PRESSED
, "Touchscreen Pressed"},
158 #if defined(RETRO_ENVIRONMENT_SET_EXTENDED_RETROPAD)
159 /** Extra core buttons. */
160 static const struct retro_core_extended_retropad_button
161 sjme_libretro_descExtPad
[] =
163 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
164 SJME_LIBRETRO_EXTRA_ID_SOFT_THREE
,
165 "Soft 3 (Middle Command)", NULL
},
167 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
168 SJME_LIBRETRO_EXTRA_ID_VOLUME_UP
,
170 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
171 SJME_LIBRETRO_EXTRA_ID_VOLUME_DOWN
,
172 "Volume Down", NULL
},
174 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
175 SJME_LIBRETRO_EXTRA_ID_START_CALL
,
177 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
178 SJME_LIBRETRO_EXTRA_ID_END_CALL
,
181 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
182 SJME_LIBRETRO_EXTRA_ID_IAPPLI
,
183 "i-Appli/i-Mode Button", NULL
},
184 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
185 SJME_LIBRETRO_EXTRA_ID_CAMERA
,
186 "Camera Button", NULL
},
187 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
188 SJME_LIBRETRO_EXTRA_ID_WEB_BROWSER
,
189 "Web Browser Button", NULL
},
190 {SJME_LIBRETRO_JOYPAD_PORT
, RETRO_DEVICE_JOYPAD
, 0,
191 SJME_LIBRETRO_EXTRA_ID_STOREFRONT
,
192 "Storefront Button", NULL
},
195 {0, 0, 0, 0, NULL
, NULL
}
198 static void sjme_libretro_inputSetExtPad(void)
200 struct retro_core_extended_retropad config
;
203 memset(&config
, 0, sizeof(config
));
204 config
.actions
= sjme_libretro_descExtPad
;
206 /* Initialize extra commands accordingly. */
207 sjme_libretro_envCallback(RETRO_ENVIRONMENT_SET_EXTENDED_RETROPAD
,
212 sjme_attrUnused RETRO_API
void retro_set_input_poll(retro_input_poll_t poll
)
214 static sjme_jint trigger
;
216 sjme_message("Impl. %s?", __func__
);
219 sjme_attrUnused RETRO_API
void retro_set_input_state(
220 retro_input_state_t state
)
222 static sjme_jint trigger
;
224 sjme_message("Impl. %s?", __func__
);
227 sjme_attrUnused RETRO_API
void retro_set_controller_port_device(
228 unsigned port
, unsigned device
)
230 const struct retro_input_descriptor
* baseDesc
;
231 sjme_jint numBaseDesc
, at
;
233 /* Which device to use? */
234 if (device
== RETRO_DEVICE_JOYPAD
)
235 baseDesc
= sjme_libretro_descDialPad
;
237 baseDesc
= sjme_libretro_descGamePad
;
239 /* Count the number of base desc items. */
241 for (at
= 0; baseDesc
[at
].description
!= NULL
; at
++)
244 /* Extended controls. */
245 #if defined(RETRO_ENVIRONMENT_SET_EXTENDED_RETROPAD)
246 sjme_libretro_inputSetExtPad();
249 /* Set standard controls. */
250 sjme_libretro_envCallback(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS
,
253 /* Set input controllers. */
254 sjme_libretro_envCallback(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO
,
255 (void*)&sjme_libretro_inputControllers
);