emscripten: Patched to compile with new joystick interfaces.

This commit is contained in:
Ryan C. Gordon 2018-08-10 14:32:30 -04:00
parent 941f8ecffd
commit b692c35237
3 changed files with 66 additions and 53 deletions

View File

@ -61,6 +61,9 @@ static SDL_JoystickDriver *SDL_joystick_drivers[] = {
#ifdef SDL_JOYSTICK_ANDROID #ifdef SDL_JOYSTICK_ANDROID
&SDL_ANDROID_JoystickDriver, &SDL_ANDROID_JoystickDriver,
#endif #endif
#ifdef SDL_JOYSTICK_EMSCRIPTEN
&SDL_EMSCRIPTEN_JoystickDriver,
#endif
#ifdef SDL_JOYSTICK_HIDAPI #ifdef SDL_JOYSTICK_HIDAPI
&SDL_HIDAPI_JoystickDriver, &SDL_HIDAPI_JoystickDriver,
#endif #endif

View File

@ -140,6 +140,7 @@ typedef struct _SDL_JoystickDriver
extern SDL_JoystickDriver SDL_ANDROID_JoystickDriver; extern SDL_JoystickDriver SDL_ANDROID_JoystickDriver;
extern SDL_JoystickDriver SDL_DARWIN_JoystickDriver; extern SDL_JoystickDriver SDL_DARWIN_JoystickDriver;
extern SDL_JoystickDriver SDL_DUMMY_JoystickDriver; extern SDL_JoystickDriver SDL_DUMMY_JoystickDriver;
extern SDL_JoystickDriver SDL_EMSCRIPTEN_JoystickDriver;
extern SDL_JoystickDriver SDL_HIDAPI_JoystickDriver; extern SDL_JoystickDriver SDL_HIDAPI_JoystickDriver;
extern SDL_JoystickDriver SDL_IOS_JoystickDriver; extern SDL_JoystickDriver SDL_IOS_JoystickDriver;
extern SDL_JoystickDriver SDL_LINUX_JoystickDriver; extern SDL_JoystickDriver SDL_LINUX_JoystickDriver;

View File

@ -156,11 +156,34 @@ Emscripten_JoyStickDisconnected(int eventType, const EmscriptenGamepadEvent *gam
return 1; return 1;
} }
/* Function to perform any system-specific joystick related cleanup */
static void
EMSCRIPTEN_JoystickQuit(void)
{
SDL_joylist_item *item = NULL;
SDL_joylist_item *next = NULL;
for (item = SDL_joylist; item; item = next) {
next = item->next;
SDL_free(item->mapping);
SDL_free(item->name);
SDL_free(item);
}
SDL_joylist = SDL_joylist_tail = NULL;
numjoysticks = 0;
instance_counter = 0;
emscripten_set_gamepadconnected_callback(NULL, 0, NULL);
emscripten_set_gamepaddisconnected_callback(NULL, 0, NULL);
}
/* Function to scan the system for joysticks. /* Function to scan the system for joysticks.
* It should return 0, or -1 on an unrecoverable fatal error. * It should return 0, or -1 on an unrecoverable fatal error.
*/ */
int static int
SDL_SYS_JoystickInit(void) EMSCRIPTEN_JoystickInit(void)
{ {
int retval, i, numjs; int retval, i, numjs;
EmscriptenGamepadEvent gamepadState; EmscriptenGamepadEvent gamepadState;
@ -190,7 +213,7 @@ SDL_SYS_JoystickInit(void)
Emscripten_JoyStickConnected); Emscripten_JoyStickConnected);
if(retval != EMSCRIPTEN_RESULT_SUCCESS) { if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
SDL_SYS_JoystickQuit(); EMSCRIPTEN_JoystickQuit();
return SDL_SetError("Could not set gamepad connect callback"); return SDL_SetError("Could not set gamepad connect callback");
} }
@ -198,7 +221,7 @@ SDL_SYS_JoystickInit(void)
0, 0,
Emscripten_JoyStickDisconnected); Emscripten_JoyStickDisconnected);
if(retval != EMSCRIPTEN_RESULT_SUCCESS) { if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
SDL_SYS_JoystickQuit(); EMSCRIPTEN_JoystickQuit();
return SDL_SetError("Could not set gamepad disconnect callback"); return SDL_SetError("Could not set gamepad disconnect callback");
} }
@ -239,26 +262,25 @@ JoystickByIndex(int index)
return item; return item;
} }
int static int
SDL_SYS_NumJoysticks(void) EMSCRIPTEN_JoystickGetCount(void)
{ {
return numjoysticks; return numjoysticks;
} }
void static void
SDL_SYS_JoystickDetect(void) EMSCRIPTEN_JoystickDetect(void)
{ {
} }
/* Function to get the device-dependent name of a joystick */ static const char *
const char * EMSCRIPTEN_JoystickGetDeviceName(int device_index)
SDL_SYS_JoystickNameForDeviceIndex(int device_index)
{ {
return JoystickByDeviceIndex(device_index)->name; return JoystickByDeviceIndex(device_index)->name;
} }
/* Function to perform the mapping from device index to the instance id for this index */ static SDL_JoystickID
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index) EMSCRIPTEN_JoystickGetDeviceInstanceID(int device_index)
{ {
return JoystickByDeviceIndex(device_index)->device_instance; return JoystickByDeviceIndex(device_index)->device_instance;
} }
@ -268,8 +290,8 @@ SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
This should fill the nbuttons and naxes fields of the joystick structure. This should fill the nbuttons and naxes fields of the joystick structure.
It returns 0, or -1 if there is an error. It returns 0, or -1 if there is an error.
*/ */
int static int
SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index) EMSCRIPTEN_JoystickOpen(SDL_Joystick * joystick, int device_index)
{ {
SDL_joylist_item *item = JoystickByDeviceIndex(device_index); SDL_joylist_item *item = JoystickByDeviceIndex(device_index);
@ -300,8 +322,8 @@ SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index)
* but instead should call SDL_PrivateJoystick*() to deliver events * but instead should call SDL_PrivateJoystick*() to deliver events
* and update joystick device state. * and update joystick device state.
*/ */
void static void
SDL_SYS_JoystickUpdate(SDL_Joystick * joystick) EMSCRIPTEN_JoystickUpdate(SDL_Joystick * joystick)
{ {
EmscriptenGamepadEvent gamepadState; EmscriptenGamepadEvent gamepadState;
SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata; SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
@ -340,8 +362,8 @@ SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
} }
/* Function to close a joystick after use */ /* Function to close a joystick after use */
void static void
SDL_SYS_JoystickClose(SDL_Joystick * joystick) EMSCRIPTEN_JoystickClose(SDL_Joystick * joystick)
{ {
SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata; SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
if (item) { if (item) {
@ -349,49 +371,36 @@ SDL_SYS_JoystickClose(SDL_Joystick * joystick)
} }
} }
/* Function to perform any system-specific joystick related cleanup */ static SDL_JoystickGUID
void EMSCRIPTEN_JoystickGetDeviceGUID(int device_index)
SDL_SYS_JoystickQuit(void)
{
SDL_joylist_item *item = NULL;
SDL_joylist_item *next = NULL;
for (item = SDL_joylist; item; item = next) {
next = item->next;
SDL_free(item->mapping);
SDL_free(item->name);
SDL_free(item);
}
SDL_joylist = SDL_joylist_tail = NULL;
numjoysticks = 0;
instance_counter = 0;
emscripten_set_gamepadconnected_callback(NULL, 0, NULL);
emscripten_set_gamepaddisconnected_callback(NULL, 0, NULL);
}
SDL_JoystickGUID
SDL_SYS_JoystickGetDeviceGUID(int device_index)
{ {
SDL_JoystickGUID guid; SDL_JoystickGUID guid;
/* the GUID is just the first 16 chars of the name for now */ /* the GUID is just the first 16 chars of the name for now */
const char *name = SDL_SYS_JoystickNameForDeviceIndex(device_index); const char *name = EMSCRIPTEN_JoystickGetDeviceName(device_index);
SDL_zero(guid); SDL_zero(guid);
SDL_memcpy(&guid, name, SDL_min(sizeof(guid), SDL_strlen(name))); SDL_memcpy(&guid, name, SDL_min(sizeof(guid), SDL_strlen(name)));
return guid; return guid;
} }
SDL_JoystickGUID static int
SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick) EMSCRIPTEN_JoystickRumble(SDL_Joystick * joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms)
{ {
SDL_JoystickGUID guid; return SDL_Unsupported();
/* the GUID is just the first 16 chars of the name for now */
const char *name = joystick->name;
SDL_zero(guid);
SDL_memcpy(&guid, name, SDL_min(sizeof(guid), SDL_strlen(name)));
return guid;
} }
SDL_JoystickDriver SDL_EMSCRIPTEN_JoystickDriver =
{
EMSCRIPTEN_JoystickInit,
EMSCRIPTEN_JoystickGetCount,
EMSCRIPTEN_JoystickDetect,
EMSCRIPTEN_JoystickGetDeviceName,
EMSCRIPTEN_JoystickGetDeviceGUID,
EMSCRIPTEN_JoystickGetDeviceInstanceID,
EMSCRIPTEN_JoystickOpen,
EMSCRIPTEN_JoystickRumble,
EMSCRIPTEN_JoystickUpdate,
EMSCRIPTEN_JoystickClose,
EMSCRIPTEN_JoystickQuit,
};
#endif /* SDL_JOYSTICK_EMSCRIPTEN */ #endif /* SDL_JOYSTICK_EMSCRIPTEN */