changeset 858:5db50aa5bf08

Date: Wed, 25 Feb 2004 06:41:17 -0500 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.
author Sam Lantinga <slouken@libsdl.org>
date Thu, 26 Feb 2004 13:45:22 +0000
parents ce05e92d909b
children 6b28c91bf3d2
files src/joystick/darwin/SDL_sysjoystick.c
diffstat 1 files changed, 40 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/joystick/darwin/SDL_sysjoystick.c	Thu Feb 26 08:57:32 2004 +0000
+++ b/src/joystick/darwin/SDL_sysjoystick.c	Thu Feb 26 13:45:22 2004 +0000
@@ -92,6 +92,9 @@
 	recElement* firstButton;
 	recElement* firstHat;
 
+	int removed;
+	int uncentered;
+
 	struct joystick_hwdata* pNext;			// next device
 };
 typedef struct joystick_hwdata recDevice;
@@ -161,6 +164,19 @@
 		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
  */
@@ -193,6 +209,9 @@
 		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;
 }
@@ -722,7 +741,27 @@
 	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)