mirror of
https://github.com/mauiaaron/apple2.git
synced 2025-01-10 06:31:13 +00:00
Joystick fixes for Mac
- Prevent spurious NSExceptions from harshing our mellow - Allow joystick hot-plugging by polling connectivity during link/timer callback
This commit is contained in:
parent
b6e329a3c6
commit
9c320c4de6
@ -1361,6 +1361,7 @@
|
|||||||
"DEBUGGER=1",
|
"DEBUGGER=1",
|
||||||
"KEYPAD_JOYSTICK=1",
|
"KEYPAD_JOYSTICK=1",
|
||||||
"AUDIO_ENABLED=1",
|
"AUDIO_ENABLED=1",
|
||||||
|
"VIDEO_OPENGL=1",
|
||||||
);
|
);
|
||||||
HEADER_SEARCH_PATHS = (
|
HEADER_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
@ -1388,6 +1389,7 @@
|
|||||||
"DEBUGGER=1",
|
"DEBUGGER=1",
|
||||||
"KEYPAD_JOYSTICK=1",
|
"KEYPAD_JOYSTICK=1",
|
||||||
"AUDIO_ENABLED=1",
|
"AUDIO_ENABLED=1",
|
||||||
|
"VIDEO_OPENGL=1",
|
||||||
);
|
);
|
||||||
HEADER_SEARCH_PATHS = (
|
HEADER_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html
|
// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html
|
||||||
|
|
||||||
#import "EmulatorGLView.h"
|
#import "EmulatorGLView.h"
|
||||||
|
#import "EmulatorJoystickController.h"
|
||||||
|
|
||||||
// Apple //e common routines
|
// Apple //e common routines
|
||||||
#import "common.h"
|
#import "common.h"
|
||||||
@ -279,6 +280,7 @@ static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
|
|||||||
video_driver_render();
|
video_driver_render();
|
||||||
CGLFlushDrawable([[self openGLContext] CGLContextObj]);
|
CGLFlushDrawable([[self openGLContext] CGLContextObj]);
|
||||||
CGLUnlockContext([[self openGLContext] CGLContextObj]);
|
CGLUnlockContext([[self openGLContext] CGLContextObj]);
|
||||||
|
[[EmulatorJoystickController sharedInstance] connectivityPoll];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
|
@ -11,5 +11,7 @@
|
|||||||
@interface EmulatorJoystickController : NSObject
|
@interface EmulatorJoystickController : NSObject
|
||||||
|
|
||||||
+ (EmulatorJoystickController *)sharedInstance;
|
+ (EmulatorJoystickController *)sharedInstance;
|
||||||
|
- (void)connectivityPoll;
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#import "common.h"
|
#import "common.h"
|
||||||
|
|
||||||
@interface EmulatorJoystickController()
|
@interface EmulatorJoystickController()
|
||||||
@property (nonatomic, retain) NSArray *allJoysticks;
|
@property (nonatomic, retain) NSDictionary *allJoysticks;
|
||||||
- (void)resetJoysticks;
|
- (void)resetJoysticks;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -52,22 +52,60 @@ void gldriver_joystick_reset(void) {
|
|||||||
|
|
||||||
- (void)resetJoysticks
|
- (void)resetJoysticks
|
||||||
{
|
{
|
||||||
for (DDHidJoystick *joystick in self.allJoysticks)
|
for (DDHidJoystick *joystick in [self.allJoysticks allValues])
|
||||||
{
|
{
|
||||||
[joystick setDelegate:nil];
|
@try {
|
||||||
[joystick stopListening];
|
[joystick setDelegate:nil];
|
||||||
|
[joystick stopListening];
|
||||||
|
} @catch (NSException *e) {
|
||||||
|
// hot-plugging joysticks can cause glitches
|
||||||
|
NSLog(@"Joystick device library raised exception on close : %@", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
self.allJoysticks = [DDHidJoystick allJoysticks];
|
NSArray *joysticks = [DDHidJoystick allJoysticks];
|
||||||
|
NSMutableDictionary *allJoysticks = [NSMutableDictionary dictionary];
|
||||||
|
for (DDHidJoystick *joystick in joysticks) {
|
||||||
|
NSString *key =[NSString stringWithFormat:@"%@-%@-%@", [joystick manufacturer], [joystick serialNumber], [joystick transport]];
|
||||||
|
[allJoysticks setObject:joystick forKey:key];
|
||||||
|
}
|
||||||
|
self.allJoysticks = allJoysticks;
|
||||||
dispatch_async(dispatch_get_main_queue(), ^ {
|
dispatch_async(dispatch_get_main_queue(), ^ {
|
||||||
for (DDHidJoystick *joystick in self.allJoysticks)
|
for (DDHidJoystick *joystick in [self.allJoysticks allValues])
|
||||||
{
|
{
|
||||||
NSLog(@"found joystick : '%@' '%@' '%@' %@", [joystick manufacturer], [joystick serialNumber], [joystick transport], joystick);
|
NSLog(@"found joystick : '%@' '%@' '%@' %@", [joystick manufacturer], [joystick serialNumber], [joystick transport], joystick);
|
||||||
[joystick setDelegate:self];
|
@try {
|
||||||
[joystick startListening];
|
[joystick setDelegate:self];
|
||||||
|
[joystick startListening];
|
||||||
|
} @catch (NSException *e) {
|
||||||
|
// hot-plugging joystick can cause glitches
|
||||||
|
NSLog(@"Joystick device library raised exception on start : %@", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark Joystick connectivity polling
|
||||||
|
|
||||||
|
- (void)connectivityPoll
|
||||||
|
{
|
||||||
|
NSArray *joysticks = [DDHidJoystick allJoysticks];
|
||||||
|
BOOL changed = ([joysticks count] != [self.allJoysticks count]);
|
||||||
|
for (DDHidJoystick *joystick in joysticks)
|
||||||
|
{
|
||||||
|
NSString *key =[NSString stringWithFormat:@"%@-%@-%@", [joystick manufacturer], [joystick serialNumber], [joystick transport]];
|
||||||
|
if (![self.allJoysticks objectForKey:key])
|
||||||
|
{
|
||||||
|
changed = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (changed)
|
||||||
|
{
|
||||||
|
[self resetJoysticks];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark NSObject(DDHidJoystickDelegate)
|
#pragma mark NSObject(DDHidJoystickDelegate)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user