haiku: Patched to compile with new joystick interfaces.

This commit is contained in:
Ryan C. Gordon 2018-08-10 15:04:08 -04:00
parent e1ac643b32
commit 67a48ad13a
3 changed files with 48 additions and 32 deletions

View File

@ -64,6 +64,9 @@ static SDL_JoystickDriver *SDL_joystick_drivers[] = {
#ifdef SDL_JOYSTICK_EMSCRIPTEN #ifdef SDL_JOYSTICK_EMSCRIPTEN
&SDL_EMSCRIPTEN_JoystickDriver, &SDL_EMSCRIPTEN_JoystickDriver,
#endif #endif
#ifdef SDL_JOYSTICK_HAIKU
&SDL_HAIKU_JoystickDriver,
#endif
#ifdef SDL_JOYSTICK_USBHID /* !!! FIXME: "USBHID" is a generic name, and doubly-confusing with HIDAPI next to it. This is the *BSD interface, rename this. */ #ifdef SDL_JOYSTICK_USBHID /* !!! FIXME: "USBHID" is a generic name, and doubly-confusing with HIDAPI next to it. This is the *BSD interface, rename this. */
&SDL_BSD_JoystickDriver, &SDL_BSD_JoystickDriver,
#endif #endif

View File

@ -142,6 +142,7 @@ extern SDL_JoystickDriver SDL_BSD_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_EMSCRIPTEN_JoystickDriver;
extern SDL_JoystickDriver SDL_HAIKU_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

@ -50,13 +50,13 @@ extern "C"
int16 *new_axes; int16 *new_axes;
}; };
static int SDL_SYS_numjoysticks = 0; static int numjoysticks = 0;
/* Function to scan the system for joysticks. /* Function to scan the system for joysticks.
* Joystick 0 should be the system default joystick. * Joystick 0 should be the system default joystick.
* It should return 0, or -1 on an unrecoverable fatal error. * It should return 0, or -1 on an unrecoverable fatal error.
*/ */
int SDL_SYS_JoystickInit(void) static int HAIKU_JoystickInit(void)
{ {
BJoystick joystick; BJoystick joystick;
int i; int i;
@ -65,52 +65,54 @@ extern "C"
/* Search for attached joysticks */ /* Search for attached joysticks */
nports = joystick.CountDevices(); nports = joystick.CountDevices();
SDL_SYS_numjoysticks = 0; numjoysticks = 0;
SDL_memset(SDL_joyport, 0, (sizeof SDL_joyport)); SDL_memset(SDL_joyport, 0, (sizeof SDL_joyport));
SDL_memset(SDL_joyname, 0, (sizeof SDL_joyname)); SDL_memset(SDL_joyname, 0, (sizeof SDL_joyname));
for (i = 0; (SDL_SYS_numjoysticks < MAX_JOYSTICKS) && (i < nports); ++i) for (i = 0; (numjoysticks < MAX_JOYSTICKS) && (i < nports); ++i)
{ {
if (joystick.GetDeviceName(i, name) == B_OK) { if (joystick.GetDeviceName(i, name) == B_OK) {
if (joystick.Open(name) != B_ERROR) { if (joystick.Open(name) != B_ERROR) {
BString stick_name; BString stick_name;
joystick.GetControllerName(&stick_name); joystick.GetControllerName(&stick_name);
SDL_joyport[SDL_SYS_numjoysticks] = SDL_strdup(name); SDL_joyport[numjoysticks] = SDL_strdup(name);
SDL_joyname[SDL_SYS_numjoysticks] = SDL_strdup(stick_name.String()); SDL_joyname[numjoysticks] = SDL_strdup(stick_name.String());
SDL_SYS_numjoysticks++; numjoysticks++;
joystick.Close(); joystick.Close();
} }
} }
} }
return (SDL_SYS_numjoysticks); return (numjoysticks);
} }
int SDL_SYS_NumJoysticks(void) static int HAIKU_JoystickGetCount(void)
{ {
return SDL_SYS_numjoysticks; return numjoysticks;
} }
void SDL_SYS_JoystickDetect(void) static void HAIKU_JoystickDetect(void)
{ {
} }
/* Function to get the device-dependent name of a joystick */ /* Function to get the device-dependent name of a joystick */
const char *SDL_SYS_JoystickNameForDeviceIndex(int device_index) static const char *HAIKU_JoystickGetDeviceName(int device_index)
{ {
return SDL_joyname[device_index]; return SDL_joyname[device_index];
} }
/* Function to perform the mapping from device index to the instance id for this index */ /* Function to perform the mapping from device index to the instance id for this index */
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index) static SDL_JoystickID HAIKU_JoystickGetDeviceInstanceID(int device_index)
{ {
return device_index; return device_index;
} }
static void HAIKU_JoystickClose(SDL_Joystick * joystick);
/* Function to open a joystick for use. /* Function to open a joystick for use.
The joystick to open is specified by the device index. The joystick to open is specified by the 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 SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index) static int HAIKU_JoystickOpen(SDL_Joystick * joystick, int device_index)
{ {
BJoystick *stick; BJoystick *stick;
@ -127,7 +129,7 @@ extern "C"
/* Open the requested joystick for use */ /* Open the requested joystick for use */
if (stick->Open(SDL_joyport[device_index]) == B_ERROR) { if (stick->Open(SDL_joyport[device_index]) == B_ERROR) {
SDL_SYS_JoystickClose(joystick); HAIKU_JoystickClose(joystick);
return SDL_SetError("Unable to open joystick"); return SDL_SetError("Unable to open joystick");
} }
@ -144,12 +146,12 @@ extern "C"
joystick->hwdata->new_hats = (uint8 *) joystick->hwdata->new_hats = (uint8 *)
SDL_malloc(joystick->nhats * sizeof(uint8)); SDL_malloc(joystick->nhats * sizeof(uint8));
if (!joystick->hwdata->new_hats || !joystick->hwdata->new_axes) { if (!joystick->hwdata->new_hats || !joystick->hwdata->new_axes) {
SDL_SYS_JoystickClose(joystick); HAIKU_JoystickClose(joystick);
return SDL_OutOfMemory(); return SDL_OutOfMemory();
} }
/* We're done! */ /* We're done! */
return (0); return 0;
} }
/* Function to update the state of a joystick - called as a device poll. /* Function to update the state of a joystick - called as a device poll.
@ -157,7 +159,7 @@ extern "C"
* 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 SDL_SYS_JoystickUpdate(SDL_Joystick * joystick) static void HAIKU_JoystickUpdate(SDL_Joystick * joystick)
{ {
static const Uint8 hat_map[9] = { static const Uint8 hat_map[9] = {
SDL_HAT_CENTERED, SDL_HAT_CENTERED,
@ -206,7 +208,7 @@ extern "C"
} }
/* Function to close a joystick after use */ /* Function to close a joystick after use */
void SDL_SYS_JoystickClose(SDL_Joystick * joystick) static void HAIKU_JoystickClose(SDL_Joystick * joystick)
{ {
if (joystick->hwdata) { if (joystick->hwdata) {
joystick->hwdata->stick->Close(); joystick->hwdata->stick->Close();
@ -218,42 +220,52 @@ extern "C"
} }
/* Function to perform any system-specific joystick related cleanup */ /* Function to perform any system-specific joystick related cleanup */
void SDL_SYS_JoystickQuit(void) static void HAIKU_JoystickQuit(void)
{ {
int i; int i;
for (i = 0; i < SDL_SYS_numjoysticks; ++i) { for (i = 0; i < numjoysticks; ++i) {
SDL_free(SDL_joyport[i]); SDL_free(SDL_joyport[i]);
} }
SDL_joyport[0] = NULL; SDL_joyport[0] = NULL;
for (i = 0; i < SDL_SYS_numjoysticks; ++i) { for (i = 0; i < numjoysticks; ++i) {
SDL_free(SDL_joyname[i]); SDL_free(SDL_joyname[i]);
} }
SDL_joyname[0] = NULL; SDL_joyname[0] = NULL;
} }
SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID( int device_index ) static SDL_JoystickGUID HAIKU_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 = HAIKU_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 SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick) static int HAIKU_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;
} }
}; // extern "C" SDL_JoystickDriver SDL_HAIKU_JoystickDriver =
{
HAIKU_JoystickInit,
HAIKU_JoystickGetCount,
HAIKU_JoystickDetect,
HAIKU_JoystickGetDeviceName,
HAIKU_JoystickGetDeviceGUID,
HAIKU_JoystickGetDeviceInstanceID,
HAIKU_JoystickOpen,
HAIKU_JoystickRumble,
HAIKU_JoystickUpdate,
HAIKU_JoystickClose,
HAIKU_JoystickQuit,
};
} // extern "C"
#endif /* SDL_JOYSTICK_HAIKU */ #endif /* SDL_JOYSTICK_HAIKU */