Skip to content

Commit

Permalink
Date: Wed, 25 Feb 2004 06:41:17 -0500
Browse files Browse the repository at this point in the history
From: "Ryan C. Gordon"
Subject: Re: MacOS X bugs...

This isn't an ideal patch (trying to open a joystick that has previously
been unplugged will report success, but it'll just never give any input,
etc), but it handles the worst case of deadlock in the event subsystem.
  • Loading branch information
slouken committed Feb 26, 2004
1 parent 373cc42 commit 9337e77
Showing 1 changed file with 40 additions and 1 deletion.
41 changes: 40 additions & 1 deletion src/joystick/darwin/SDL_sysjoystick.c
Expand Up @@ -92,6 +92,9 @@ struct joystick_hwdata
recElement* firstButton;
recElement* firstHat;

int removed;
int uncentered;

struct joystick_hwdata* pNext; // next device
};
typedef struct joystick_hwdata recDevice;
Expand Down Expand Up @@ -161,6 +164,19 @@ SInt32 HIDScaledCalibratedValue (recDevice *pDevice, recElement *pElement, long
return ((value - pElement->minReport) * deviceScale / readScale) + min;
}


static void HIDRemovalCallback(void * target,
IOReturn result,
void * refcon,
void * sender)
{
recDevice *device = (recDevice *) refcon;
device->removed = 1;
device->uncentered = 1;
}



/* Create and open an interface to device, required prior to extracting values or building queues.
* Note: appliction now owns the device and must close and release it prior to exiting
*/
Expand Down Expand Up @@ -193,6 +209,9 @@ IOReturn HIDCreateOpenDeviceInterface (io_object_t hidDevice, recDevice *pDevice
result = (*(pDevice->interface))->open (pDevice->interface, 0);
if (kIOReturnSuccess != result)
HIDReportErrorNum ("Failed to open pDevice->interface via open.", result);
else
(*(pDevice->interface))->setRemovalCallback (pDevice->interface, HIDRemovalCallback, pDevice, pDevice);

}
return result;
}
Expand Down Expand Up @@ -722,7 +741,27 @@ void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
recElement *element;
SInt32 value;
int i;


if (device->removed) /* device was unplugged; ignore it. */
{
if (device->uncentered)
{
device->uncentered = 0;

/* Tell the app that everything is centered/unpressed... */
for (i = 0; i < device->axes; i++)
SDL_PrivateJoystickAxis(joystick, i, 0);

for (i = 0; i < device->buttons; i++)
SDL_PrivateJoystickButton(joystick, i, 0);

for (i = 0; i < device->hats; i++)
SDL_PrivateJoystickHat(joystick, i, SDL_HAT_CENTERED);
}

return;
}

element = device->firstAxis;
i = 0;
while (element)
Expand Down

0 comments on commit 9337e77

Please sign in to comment.