Cocoa Port:

- Users can now take advantage of the new input handling system with a completely redesigned user interface. Check it out in the input preferences!
- New feature: Touch input can be mapped to any input device. In addition, touch coordinates can now be user-defined.
- New feature: Multiple inputs may be assigned to the same command at the same time.
- Enhancement: It is now possible to remove all input mappings from a command.
- Also, many new commands are available for mapping. They are: Execute/Pause, Reset, Mute/Unmute, Load State Slot, Save State Slot, Copy Screen, Set Speed, Enable/Disable Speed Limiter, Enable/Disable Auto Frame Skip, Enable/Disable Cheats, and Enable/Disable GPU State.
This commit is contained in:
rogerman 2013-03-12 09:13:29 +00:00
parent 4577cc9c92
commit 5cd1cdef80
18 changed files with 7050 additions and 8380 deletions

View File

@ -2,6 +2,38 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CommandTagList</key>
<array>
<string>Up</string>
<string>Down</string>
<string>Left</string>
<string>Right</string>
<string>A</string>
<string>B</string>
<string>X</string>
<string>Y</string>
<string>L</string>
<string>R</string>
<string>Start</string>
<string>Select</string>
<string>Touch</string>
<string>Microphone</string>
<string>Lid</string>
<string>Debug</string>
<string>Execute/Pause</string>
<string>Reset</string>
<string>Mute/Unmute</string>
<string>Load State Slot</string>
<string>Save State Slot</string>
<string>Copy Screen</string>
<string>Set Speed</string>
<string>Enable/Disable Speed Limiter</string>
<string>Enable/Disable Auto Frame Skip</string>
<string>Enable/Disable Cheats</string>
<string>Enable/Disable GPU State</string>
</array>
<key>DefaultInputMappings</key>
<dict>
<key>Up</key>
<array>
<dict>
@ -169,12 +201,8 @@
<string>0</string>
<key>elementName</key>
<string>Primary Button</string>
<key>useDeviceValues</key>
<key>useInputForIntCoord</key>
<true/>
<key>pointX</key>
<integer>0</integer>
<key>pointY</key>
<real>0</real>
</dict>
</array>
<key>Microphone</key>
@ -187,20 +215,9 @@
<key>elementCode</key>
<string>50</string>
<key>elementName</key>
<string>`</string>
</dict>
</array>
<key>Debug</key>
<array>
<dict>
<key>deviceCode</key>
<string>NSEventKeyboard</string>
<key>deviceName</key>
<string>Keyboard</string>
<key>elementCode</key>
<string>42</string>
<key>elementName</key>
<string>\</string>
<string>` (Accent)</string>
<key>intValue1</key>
<string>1</string>
</dict>
</array>
<key>Lid</key>
@ -216,7 +233,7 @@
<string>Delete (Backspace)</string>
</dict>
</array>
<key>Speed Half</key>
<key>Debug</key>
<array>
<dict>
<key>deviceCode</key>
@ -224,26 +241,9 @@
<key>deviceName</key>
<string>Keyboard</string>
<key>elementCode</key>
<string>27</string>
<string>42</string>
<key>elementName</key>
<string>-</string>
<key>floatValue</key>
<string>0.5</string>
</dict>
</array>
<key>Speed Double</key>
<array>
<dict>
<key>deviceCode</key>
<string>NSEventKeyboard</string>
<key>deviceName</key>
<string>Keyboard</string>
<key>elementCode</key>
<string>24</string>
<key>elementName</key>
<string>=</string>
<key>floatValue</key>
<integer>2</integer>
<string>\</string>
</dict>
</array>
<key>HUD</key>
@ -259,7 +259,7 @@
<string>H</string>
</dict>
</array>
<key>Execute</key>
<key>Execute/Pause</key>
<array>
<dict>
<key>deviceCode</key>
@ -272,19 +272,6 @@
<string>Forward Delete</string>
</dict>
</array>
<key>Pause</key>
<array>
<dict>
<key>deviceCode</key>
<string>NSEventKeyboard</string>
<key>deviceName</key>
<string>Keyboard</string>
<key>elementCode</key>
<string>119</string>
<key>elementName</key>
<string>End</string>
</dict>
</array>
<key>Reset</key>
<array>
<dict>
@ -298,7 +285,7 @@
<string>Page Down</string>
</dict>
</array>
<key>Mute</key>
<key>Mute/Unmute</key>
<array>
<dict>
<key>deviceCode</key>
@ -311,5 +298,47 @@
<string>Numpad Clear</string>
</dict>
</array>
<key>Load State Slot</key>
<array/>
<key>Save State Slot</key>
<array/>
<key>Copy Screen</key>
<array/>
<key>Set Speed</key>
<array>
<dict>
<key>deviceCode</key>
<string>NSEventKeyboard</string>
<key>deviceName</key>
<string>Keyboard</string>
<key>elementCode</key>
<string>27</string>
<key>elementName</key>
<string>-</string>
<key>floatValue0</key>
<string>0.5</string>
</dict>
<dict>
<key>deviceCode</key>
<string>NSEventKeyboard</string>
<key>deviceName</key>
<string>Keyboard</string>
<key>elementCode</key>
<string>24</string>
<key>elementName</key>
<string>=</string>
<key>floatValue0</key>
<integer>2</integer>
</dict>
</array>
<key>Enable/Disable Speed Limiter</key>
<array/>
<key>Enable/Disable Auto Frame Skip</key>
<array/>
<key>Enable/Disable Cheats</key>
<array/>
<key>Enable/Disable GPU State</key>
<array/>
</dict>
</dict>
</plist>

View File

@ -113,7 +113,7 @@
<key>80</key>
<string>F19</string>
<key>50</key>
<string>`</string>
<string>` (Accent)</string>
<key>27</key>
<string>-</string>
<key>24</key>

View File

@ -57,9 +57,9 @@ enum
- (id) initWithMic:(CocoaDSMic *)theMic;
- (void) setSoundInputMode:(NSInteger)inputMode;
- (void) setControllerState:(BOOL)theState controlID:(NSUInteger)controlID;
- (void) setTouchState:(BOOL)theState location:(NSPoint)theLocation;
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID;
- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation;
- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode;
- (void) flush;
@end

View File

@ -62,14 +62,7 @@
[super dealloc];
}
- (void) setSoundInputMode:(NSInteger)inputMode
{
OSSpinLockLock(&spinlockControllerState);
self.cdsMic.mode = inputMode;
OSSpinLockUnlock(&spinlockControllerState);
}
- (void) setControllerState:(BOOL)theState controlID:(NSUInteger)controlID
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID
{
if (controlID >= DSControllerState_StatesCount)
{
@ -81,7 +74,7 @@
OSSpinLockUnlock(&spinlockControllerState);
}
- (void) setTouchState:(BOOL)theState location:(NSPoint)theLocation
- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation
{
OSSpinLockLock(&spinlockControllerState);
controllerState[DSControllerState_Touch] = (theState) ? true : false;
@ -89,6 +82,14 @@
OSSpinLockUnlock(&spinlockControllerState);
}
- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode
{
OSSpinLockLock(&spinlockControllerState);
controllerState[DSControllerState_Microphone] = (theState) ? true : false;
self.cdsMic.mode = inputMode;
OSSpinLockUnlock(&spinlockControllerState);
}
- (void) flush
{
OSSpinLockLock(&spinlockControllerState);
@ -140,15 +141,15 @@
{
if (micMode == MICMODE_NONE)
{
[self.cdsMic fillWithNullSamples];
[cdsMic fillWithNullSamples];
}
else if (micMode == MICMODE_INTERNAL_NOISE)
{
[self.cdsMic fillWithInternalNoise];
[cdsMic fillWithInternalNoise];
}
else if (micMode == MICMODE_WHITE_NOISE)
{
[self.cdsMic fillWithWhiteNoise];
[cdsMic fillWithWhiteNoise];
}
else if (micMode == MICMODE_SOUND_FILE)
{

File diff suppressed because it is too large Load Diff

View File

@ -75,6 +75,15 @@ enum OGLVertexAttributeID
OGLVertexAttributeID_TexCoord0 = 8
};
#ifndef MAC_OS_X_VERSION_10_7
// In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here.
static size_t strnlen(const char *s, size_t n)
{
const char *p = (const char *)memchr(s, 0, n);
return(p ? p-s : n);
}
#endif // MAC_OS_X_VERSION_10_7
@implementation DisplayWindowController
@synthesize emuControl;
@ -1310,10 +1319,11 @@ enum OGLVertexAttributeID
- (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue
{
BOOL isHandled = NO;
std::string inputStr;
DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate];
InputAttributesList inputList = InputManagerEncodeHIDQueue(hidQueue);
char inputStr[INPUT_HANDLER_STRING_LENGTH*2];
memset(inputStr, '\0', INPUT_HANDLER_STRING_LENGTH*2);
const size_t inputCount = inputList.size();
@ -1321,16 +1331,18 @@ enum OGLVertexAttributeID
{
const InputAttributes &inputAttr = inputList[i];
if (inputAttr.inputState == INPUT_ATTRIBUTE_STATE_ON)
if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON)
{
inputStr = inputAttr.deviceName + ":" + inputAttr.elementName;
strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2);
break;
}
}
if (!inputStr.empty())
if (strnlen(inputStr, INPUT_HANDLER_STRING_LENGTH*2) != 0)
{
[[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr.c_str() encoding:NSUTF8StringEncoding]];
[[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]];
}
CommandAttributesList cmdList = [inputManager generateCommandListUsingInputList:&inputList];
@ -1355,8 +1367,12 @@ enum OGLVertexAttributeID
if (keyPressed && [theEvent window] != nil)
{
std::string inputStr = inputAttr.deviceName + ":" + inputAttr.elementName;
[[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr.c_str() encoding:NSUTF8StringEncoding]];
char inputStr[INPUT_HANDLER_STRING_LENGTH*2];
strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2);
[[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]];
}
isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr];
@ -1383,10 +1399,15 @@ enum OGLVertexAttributeID
if (buttonPressed && [theEvent window] != nil)
{
char inputCoordBuf[256] = {0};
snprintf(inputCoordBuf, 256, " X:%i Y:%i", (int)inputAttr.floatValue[0], (int)inputAttr.floatValue[1]);
snprintf(inputCoordBuf, 256, " X:%i Y:%i", (int)inputAttr.intCoordX, (int)inputAttr.intCoordY);
std::string inputStr = inputAttr.deviceName + ":" + inputAttr.elementName + std::string(inputCoordBuf);
[[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr.c_str() encoding:NSUTF8StringEncoding]];
char inputStr[INPUT_HANDLER_STRING_LENGTH*2];
strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputStr, inputCoordBuf, INPUT_HANDLER_STRING_LENGTH*2);
[[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]];
}
isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr];

View File

@ -65,6 +65,10 @@
NSInteger selectedExportRomSaveID;
NSInteger selectedRomSaveTypeID;
CGFloat lastSetSpeedScalar;
BOOL isSoundMuted;
float lastSetVolumeValue;
NSImage *iconVolumeFull;
NSImage *iconVolumeTwoThird;
NSImage *iconVolumeOneThird;
@ -200,7 +204,7 @@
- (void) cmdCopyScreen:(NSValue *)cmdAttrValue;
- (void) cmdToggleSpeedScalar:(NSValue *)cmdAttrValue;
- (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue;
- (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue;
- (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue;
- (void) cmdToggleCheats:(NSValue *)cmdAttrValue;

View File

@ -118,6 +118,10 @@
selectedRomSaveTypeID = ROMSAVETYPE_AUTOMATIC;
selectedExportRomSaveID = 0;
lastSetSpeedScalar = 1.0f;
isSoundMuted = NO;
lastSetVolumeValue = MAX_VOLUME;
iconExecute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]];
iconPause = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]];
iconSpeedNormal = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed1x_420x420" ofType:@"png"]];
@ -275,14 +279,20 @@
else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW)
{
newImage = iconVolumeOneThird;
isSoundMuted = NO;
lastSetVolumeValue = vol;
}
else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH)
{
newImage = iconVolumeTwoThird;
isSoundMuted = NO;
lastSetVolumeValue = vol;
}
else
{
newImage = iconVolumeFull;
isSoundMuted = NO;
lastSetVolumeValue = vol;
}
if (newImage != currentImage)
@ -639,14 +649,12 @@
- (IBAction) loadEmuSaveStateSlot:(id)sender
{
const NSInteger slotNumber = [CocoaDSUtil getIBActionSenderTag:sender];
[inputManager dispatchCommandUsingIBAction:_cmd tag:slotNumber];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) saveEmuSaveStateSlot:(id)sender
{
const NSInteger slotNumber = [CocoaDSUtil getIBActionSenderTag:sender];
[inputManager dispatchCommandUsingIBAction:_cmd tag:slotNumber];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) importRomSave:(id)sender
@ -708,22 +716,22 @@
- (IBAction) toggleExecutePause:(id)sender
{
[inputManager dispatchCommandUsingIBAction:_cmd tag:0];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) reset:(id)sender
{
[inputManager dispatchCommandUsingIBAction:_cmd tag:0];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) toggleSpeedLimiter:(id)sender
{
[inputManager dispatchCommandUsingIBAction:_cmd tag:0];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) toggleAutoFrameSkip:(id)sender
{
[inputManager dispatchCommandUsingIBAction:_cmd tag:0];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender
@ -753,8 +761,7 @@
- (IBAction) toggleGPUState:(id)sender
{
const NSInteger bitNumber = [CocoaDSUtil getIBActionSenderTag:sender];
[inputManager dispatchCommandUsingIBAction:_cmd tag:bitNumber];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) changeRomSaveType:(id)sender
@ -768,13 +775,15 @@
- (IBAction) toggleCheats:(id)sender
{
[inputManager dispatchCommandUsingIBAction:_cmd tag:0];
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
}
- (IBAction) changeCoreSpeed:(id)sender
{
CGFloat newSpeedScalar = (CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f;
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setSpeedScalar:(CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f];
[cdsCore setSpeedScalar:newSpeedScalar];
lastSetSpeedScalar = newSpeedScalar;
}
- (IBAction) changeCoreEmuFlags:(id)sender
@ -985,14 +994,18 @@
[cmdAttrValue getValue:&cmdAttr];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
NSUInteger controlID = (NSUInteger)cmdAttr.commandID;
BOOL theState = (cmdAttr.inputState == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO;
const NSUInteger controlID = cmdAttr.intValue[0];
const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO;
if (controlID == DSControllerState_Touch)
{
NSPoint touchLoc = NSMakePoint(cmdAttr.floatValue[0], cmdAttr.floatValue[1]);
const NSPoint touchLoc = (cmdAttr.useInputForIntCoord) ? NSMakePoint(cmdAttr.input.intCoordX, cmdAttr.input.intCoordY) : NSMakePoint(cmdAttr.intValue[1], cmdAttr.intValue[2]);
[[cdsCore cdsController] setTouchState:theState location:touchLoc];
}
else if (controlID == DSControllerState_Microphone)
{
[[cdsCore cdsController] setMicrophoneState:theState inputMode:cmdAttr.intValue[1]];
}
else
{
[[cdsCore cdsController] setControllerState:theState controlID:controlID];
@ -1004,6 +1017,11 @@
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF)
{
return;
}
NSString *saveStatePath = [[CocoaDSFile saveStateURL] path];
if (saveStatePath == nil)
{
@ -1011,7 +1029,7 @@
return;
}
const NSInteger slotNumber = cmdAttr.integerValue[0];
const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0];
if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS)
{
return;
@ -1037,6 +1055,11 @@
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF)
{
return;
}
NSString *saveStatePath = [[CocoaDSFile saveStateURL] path];
if (saveStatePath == nil)
{
@ -1051,7 +1074,7 @@
return;
}
const NSInteger slotNumber = cmdAttr.integerValue[0];
const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0];
if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS)
{
return;
@ -1077,18 +1100,26 @@
[mainWindow copy:nil];
}
- (void) cmdToggleSpeedScalar:(NSValue *)cmdAttrValue
- (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue
{
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
CGFloat speedScalar = cmdAttr.floatValue[0];
const float speedScalar = (cmdAttr.useInputForScalar) ? cmdAttr.input.scalar : cmdAttr.floatValue[0];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setSpeedScalar:speedScalar];
[cdsCore setSpeedScalar:(cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) ? lastSetSpeedScalar : speedScalar];
}
- (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue
{
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF)
{
return;
}
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
if ([cdsCore isSpeedLimitEnabled])
@ -1105,6 +1136,14 @@
- (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue
{
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF)
{
return;
}
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
if ([cdsCore isFrameSkipEnabled])
@ -1121,6 +1160,14 @@
- (void) cmdToggleCheats:(NSValue *)cmdAttrValue
{
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF)
{
return;
}
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
if ([cdsCore isCheatingEnabled])
@ -1137,15 +1184,20 @@
- (void) cmdToggleExecutePause:(NSValue *)cmdAttrValue
{
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil)
{
return;
}
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
if ([cdsCore coreState] == CORESTATE_PAUSE)
{
if ([self currentRom] != nil)
{
[self executeCore];
}
}
else
{
[self pauseCore];
@ -1154,7 +1206,10 @@
- (void) cmdReset:(NSValue *)cmdAttrValue
{
if ([self currentRom] == nil)
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil)
{
return;
}
@ -1187,13 +1242,46 @@
}
}
- (void) cmdToggleMute:(NSValue *)cmdAttrValue
{
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF)
{
return;
}
float vol = 0.0f;
if (isSoundMuted)
{
isSoundMuted = NO;
vol = lastSetVolumeValue;
[self setStatusText:@"Sound unmuted."];
}
else
{
isSoundMuted = YES;
[self setStatusText:@"Sound muted."];
}
[self setCurrentVolumeValue:vol];
[CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol];
}
- (void) cmdToggleGPUState:(NSValue *)cmdAttrValue
{
CommandAttributes cmdAttr;
[cmdAttrValue getValue:&cmdAttr];
if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF)
{
return;
}
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
const NSInteger bitNumber = cmdAttr.integerValue[0];
const NSInteger bitNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0];
const UInt32 flagBit = [cdsCore.cdsGPU gpuStateFlags] ^ (1 << bitNumber);
[cdsCore.cdsGPU setGpuStateFlags:flagBit];
@ -1837,13 +1925,9 @@
[(NSMenuItem*)theItem setState:NSOnState];
}
}
else if (speedScalar == [theItem tag])
{
[(NSMenuItem*)theItem setState:NSOnState];
}
else
{
[(NSMenuItem*)theItem setState:NSOffState];
[(NSMenuItem*)theItem setState:(speedScalar == [theItem tag]) ? NSOnState : NSOffState];
}
}
else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]])
@ -1866,56 +1950,28 @@
{
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
{
if ([cdsCore isSpeedLimitEnabled])
{
[(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_SPEED_LIMIT];
}
else
{
[(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_SPEED_LIMIT];
}
[(NSMenuItem*)theItem setTitle:([cdsCore isSpeedLimitEnabled]) ? NSSTRING_TITLE_DISABLE_SPEED_LIMIT : NSSTRING_TITLE_ENABLE_SPEED_LIMIT];
}
}
else if (theAction == @selector(toggleAutoFrameSkip:))
{
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
{
if ([cdsCore isFrameSkipEnabled])
{
[(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP];
}
else
{
[(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP];
[(NSMenuItem*)theItem setTitle:([cdsCore isFrameSkipEnabled]) ? NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP : NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP];
}
}
}
else if (theAction == @selector(cheatsDisable:))
else if (theAction == @selector(toggleCheats:))
{
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
{
if ([cdsCore isCheatingEnabled])
{
[(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_CHEATS];
}
else
{
[(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_CHEATS];
}
[(NSMenuItem*)theItem setTitle:([cdsCore isCheatingEnabled]) ? NSSTRING_TITLE_DISABLE_CHEATS : NSSTRING_TITLE_ENABLE_CHEATS];
}
}
else if (theAction == @selector(changeRomSaveType:))
{
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
{
if ([self selectedRomSaveTypeID] == [theItem tag])
{
[(NSMenuItem*)theItem setState:NSOnState];
}
else
{
[(NSMenuItem*)theItem setState:NSOffState];
}
[(NSMenuItem*)theItem setState:([self selectedRomSaveTypeID] == [theItem tag]) ? NSOnState : NSOffState];
}
}
else if (theAction == @selector(openEmuSaveState:) ||
@ -1940,14 +1996,7 @@
{
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
{
if ([cdsCore.cdsGPU gpuStateByBit:[theItem tag]])
{
[(NSMenuItem*)theItem setState:NSOnState];
}
else
{
[(NSMenuItem*)theItem setState:NSOffState];
}
[(NSMenuItem*)theItem setState:([cdsCore.cdsGPU gpuStateByBit:[theItem tag]]) ? NSOnState : NSOffState];
}
}
else if (theAction == @selector(changeScale:))
@ -1979,13 +2028,9 @@
[(NSMenuItem*)theItem setState:NSOnState];
}
}
else if (viewRotation == [theItem tag])
{
[(NSMenuItem*)theItem setState:NSOnState];
}
else
{
[(NSMenuItem*)theItem setState:NSOffState];
[(NSMenuItem*)theItem setState:(viewRotation == [theItem tag]) ? NSOnState : NSOffState];
}
}
}

View File

@ -23,9 +23,9 @@
#include <string>
#include <vector>
#define INPUT_HANDLER_MAX_ATTRIBUTE_VALUES 4
#define INPUT_HANDLER_STRING_LENGTH 256
enum
enum InputAttributeState
{
INPUT_ATTRIBUTE_STATE_OFF = 0,
INPUT_ATTRIBUTE_STATE_ON,
@ -46,38 +46,41 @@ enum
typedef struct
{
std::string deviceName;
std::string deviceCode;
std::string elementName;
std::string elementCode;
char deviceName[INPUT_HANDLER_STRING_LENGTH];
char deviceCode[INPUT_HANDLER_STRING_LENGTH];
char elementName[INPUT_HANDLER_STRING_LENGTH];
char elementCode[INPUT_HANDLER_STRING_LENGTH];
NSInteger inputState;
NSInteger integerValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
CGFloat floatValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
id object[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
InputAttributeState state; // The input state that is sent on command dispatch
int32_t intCoordX; // The X-coordinate as an int for commands that require a location
int32_t intCoordY; // The Y-coordinate as an int for commands that require a location
float floatCoordX; // The X-coordinate as a float for commands that require a location
float floatCoordY; // The Y-coordinate as a float for commands that require a location
float scalar; // A scalar value for commands that require a scalar
id sender; // An object for commands that require an object
} InputAttributes;
typedef struct
{
SEL selector;
NSInteger commandID;
NSInteger inputState;
char tag[INPUT_HANDLER_STRING_LENGTH]; // A string identifier for these attributes
SEL selector; // The selector that is called on command dispatch
int32_t intValue[4]; // Context dependent int values
float floatValue[4]; // Context dependent float values
id object[4]; // Context dependent objects
NSInteger integerValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
BOOL useIntegerInputValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
bool useInputForIntCoord; // The command will prefer the input device's int coordinate
bool useInputForFloatCoord; // The command will prefer the input device's float coordinate
bool useInputForScalar; // The command will prefer the input device's scalar
bool useInputForSender; // The command will prefer the input device's sender
CGFloat floatValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
BOOL useFloatInputValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
id object[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
BOOL useObjectInputValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES];
InputAttributes input; // The input device's attributes
} CommandAttributes;
typedef std::vector<InputAttributes> InputAttributesList;
typedef std::vector<CommandAttributes> CommandAttributesList;
typedef std::tr1::unordered_map<std::string, std::string> CommandTagMap; // Key = Input key in deviceCode:elementCode format, Value = Command Tag
typedef std::tr1::unordered_map<std::string, CommandAttributes> InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes
typedef std::tr1::unordered_map<std::string, CommandAttributes> CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes
typedef std::tr1::unordered_map<std::string, SEL> CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector
#pragma mark -
@interface InputHIDDevice : NSObject
@ -141,36 +144,58 @@ void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSen
@interface InputManager : NSObject
{
EmuControllerDelegate *emuControl;
NSOutlineView *inputPrefsOutlineView;
id<InputHIDManagerTarget> hidInputTarget;
InputHIDManager *hidManager;
NSMutableDictionary *inputMappings;
CommandTagMap commandMap;
CommandAttributesMap commandMasterList;
InputCommandMap commandMap;
CommandAttributesMap defaultCommandAttributes;
CommandSelectorMap commandSelector;
}
@property (assign) IBOutlet EmuControllerDelegate *emuControl;
@property (readonly) IBOutlet EmuControllerDelegate *emuControl;
@property (readonly) IBOutlet NSOutlineView *inputPrefsOutlineView;
@property (retain) id<InputHIDManagerTarget> hidInputTarget;
@property (retain) NSMutableDictionary *inputMappings;
- (void) addMappingsUsingUserDefaults;
- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceDict commandTag:(const char *)commandTag;
- (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(const char *)commandTag;
- (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandTag:(const char *)commandTag;
- (void) addMappingForIBAction:(const SEL)theSelector commandTag:(const char *)commandTag;
- (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandTag:(const char *)commandTag;
- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceDict commandAttributes:(const CommandAttributes *)cmdAttr;
- (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandAttributes:(const CommandAttributes *)cmdAttr;
- (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandAttributes:(const CommandAttributes *)cmdAttr;
- (void) addMappingForIBAction:(const SEL)theSelector commandAttributes:(const CommandAttributes *)cmdAttr;
- (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandAttributes:(const CommandAttributes *)cmdAttr;
- (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode;
- (void) removeAllMappingsOfCommandTag:(const char *)commandTag;
- (void) removeAllMappingsForCommandTag:(const char *)commandTag;
- (CommandAttributesList) generateCommandListUsingInputList:(const InputAttributesList *)inputList;
- (void) dispatchCommandList:(const CommandAttributesList *)cmdList;
- (BOOL) dispatchCommandUsingInputAttributes:(const InputAttributes *)inputAttr;
- (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector tag:(const NSInteger)tagValue;
- (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector sender:(id)sender;
- (void) writeUserDefaultsMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(const char *)commandTag;
- (void) writeDefaultsInputMappings;
- (SEL) selectorOfCommandTag:(const char *)commandTag;
- (CommandAttributes) defaultCommandAttributesForCommandTag:(const char *)commandTag;
- (CommandAttributes) mappedCommandAttributesOfDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode;
- (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode;
- (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag;
CommandAttributes NewDefaultCommandAttributes(const char *commandTag);
CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector);
CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID);
void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo);
NSDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr,
NSString *deviceCode,
NSString *deviceName,
NSString *elementCode,
NSString *elementName);
InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue);
InputAttributes InputManagerEncodeKeyboardInput(const unsigned short keyCode, BOOL keyPressed);
InputAttributes InputManagerEncodeMouseButtonInput(const NSInteger buttonNumber, const NSPoint touchLoc, BOOL buttonPressed);
InputAttributes InputManagerEncodeIBAction(const SEL theSelector, const NSInteger tagValue);
InputAttributes InputManagerEncodeIBAction(const SEL theSelector, id sender);
@end

File diff suppressed because it is too large Load Diff

View File

@ -105,7 +105,6 @@
- (void) setupSlotMenuItems;
- (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber;
- (void) setupUserDefaults;
- (void) updateInputDisplayFields;
- (IBAction) showMigrationWindow:(id)sender;
- (IBAction) handleMigrationWindow:(id)sender;
- (void) setRomInfoPanelBoxTitleColors;

View File

@ -201,6 +201,8 @@
// Setup the applications settings from the user defaults file.
[self setupUserDefaults];
[inputPrefsView initSettingsSheets];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
@ -471,9 +473,6 @@
[prefBindings setValue:[cheatDatabasePath lastPathComponent] forKey:@"R4CheatDatabaseName"];
}
// Set the sound input mode per user preferences.
[[cdsCore cdsController] setSoundInputMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"Input_AudioInputMode"]];
// Update the SPU Sync controls in the Preferences window.
if ([[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"] == SPU_SYNC_MODE_DUAL_SYNC_ASYNC)
{
@ -495,9 +494,6 @@
[prefBindings setValue:nil forKey:@"AutoloadRomName"];
}
// Update all of the input display fields.
[self updateInputDisplayFields];
// Set the menu for the display rotation.
const double displayRotation = (double)[[NSUserDefaults standardUserDefaults] floatForKey:@"DisplayView_Rotation"];
[prefWindowDelegate updateDisplayRotationMenu:displayRotation];
@ -506,40 +502,6 @@
[prefWindowDelegate updateVolumeIcon:nil];
[emuControl setupUserDefaults];
[inputManager addMappingsUsingUserDefaults];
}
- (void) updateInputDisplayFields
{
PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate];
NSMutableDictionary *prefBindings = [prefWindowDelegate bindings];
if ([[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"] == nil)
{
return;
}
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Up"] forKey:@"Input_Up"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Down"] forKey:@"Input_Down"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Left"] forKey:@"Input_Left"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Right"] forKey:@"Input_Right"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"A"] forKey:@"Input_A"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"B"] forKey:@"Input_B"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"X"] forKey:@"Input_X"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Y"] forKey:@"Input_Y"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"L"] forKey:@"Input_L"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"R"] forKey:@"Input_R"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Start"] forKey:@"Input_Start"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Select"] forKey:@"Input_Select"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Microphone"] forKey:@"Input_Microphone"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Lid"] forKey:@"Input_Lid"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Debug"] forKey:@"Input_Debug"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Speed Half"] forKey:@"Input_SpeedHalf"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Speed Double"] forKey:@"Input_SpeedDouble"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"HUD"] forKey:@"Input_HUD"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Execute"] forKey:@"Input_Execute"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Pause"] forKey:@"Input_Pause"];
[prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Reset"] forKey:@"Input_Reset"];
}
- (IBAction) showMigrationWindow:(id)sender

View File

@ -21,27 +21,72 @@
@class CocoaDSController;
@interface InputPrefProperties : NSObject
{
NSString *commandTag;
NSImage *icon;
NSWindow *settingsSheet;
}
@interface InputPrefsView : NSView <InputHIDManagerTarget>
@property (retain) NSString *commandTag;
@property (retain) NSImage *icon;
@property (retain) NSWindow *settingsSheet;
- (id) initWithCommandTag:(NSString *)theCommandTag icon:(NSImage *)theIcon sheet:(NSWindow *)theSheet;
@end
#pragma mark -
@interface InputPrefsView : NSView <InputHIDManagerTarget, NSOutlineViewDelegate, NSOutlineViewDataSource>
{
NSWindow *prefWindow;
NSOutlineView *inputPrefOutlineView;
NSObjectController *inputSettingsController;
NSWindow *inputSettingsMicrophone;
NSWindow *inputSettingsTouch;
NSWindow *inputSettingsLoadStateSlot;
NSWindow *inputSettingsSaveStateSlot;
NSWindow *inputSettingsSetSpeedLimit;
NSWindow *inputSettingsGPUState;
InputManager *inputManager;
NSButton *lastConfigButton;
NSInteger configInputTargetID;
NSString *configInputTargetID;
NSMutableDictionary *configInputList;
std::tr1::unordered_map<NSInteger, std::string> commandTagMap; // Key = Command ID, Value = Command Tag
NSDictionary *displayStringBindings;
NSDictionary *inputPrefProperties;
NSDictionary *inputSettingsMappings;
NSArray *commandTagList;
}
@property (readonly) IBOutlet NSWindow *prefWindow;
@property (readonly) IBOutlet NSOutlineView *inputPrefOutlineView;
@property (readonly) IBOutlet NSObjectController *inputSettingsController;
@property (readonly) IBOutlet NSWindow *inputSettingsMicrophone;
@property (readonly) IBOutlet NSWindow *inputSettingsTouch;
@property (readonly) IBOutlet NSWindow *inputSettingsLoadStateSlot;
@property (readonly) IBOutlet NSWindow *inputSettingsSaveStateSlot;
@property (readonly) IBOutlet NSWindow *inputSettingsSetSpeedLimit;
@property (readonly) IBOutlet NSWindow *inputSettingsGPUState;
@property (readonly) IBOutlet InputManager *inputManager;
@property (assign) NSInteger configInputTargetID;
@property (retain) NSString *configInputTargetID;
- (void) initSettingsSheets;
- (NSString *) commandTagFromInputList:(NSArray *)inputList;
- (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed;
- (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed;
- (NSString *) parseMappingDisplayString:(const char *)commandTag;
- (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag;
- (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo;
- (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
- (IBAction) inputButtonSet:(id)sender;
- (IBAction) setInputAdd:(id)sender;
- (IBAction) removeInput:(id)sender;
- (IBAction) changeSpeed:(id)sender;
- (IBAction) showSettingsSheet:(id)sender;
- (IBAction) closeSettingsSheet:(id)sender;
@end

View File

@ -21,12 +21,61 @@
#import "cocoa_globals.h"
#import "cocoa_input.h"
#import "cocoa_util.h"
#define INPUT_HOLD_TIME 0.1 // Time in seconds to hold a button in its on state when mapping an input.
@implementation InputPrefProperties
@synthesize commandTag;
@synthesize icon;
@synthesize settingsSheet;
- (id)init
{
return [self initWithCommandTag:@"" icon:nil sheet:nil];
}
- (id) initWithCommandTag:(NSString *)theCommandTag icon:(NSImage *)theIcon sheet:(NSWindow *)theSheet
{
self = [super init];
if (self == nil)
{
return self;
}
commandTag = [theCommandTag retain];
icon = [theIcon retain];
settingsSheet = [theSheet retain];
return self;
}
- (void)dealloc
{
[self setCommandTag:nil];
[self setIcon:nil];
[self setSettingsSheet:nil];
[super dealloc];
}
@end
#pragma mark -
@implementation InputPrefsView
@synthesize prefWindow;
@synthesize inputPrefOutlineView;
@synthesize inputSettingsController;
@synthesize inputSettingsMicrophone;
@synthesize inputSettingsTouch;
@synthesize inputSettingsLoadStateSlot;
@synthesize inputSettingsSaveStateSlot;
@synthesize inputSettingsSetSpeedLimit;
@synthesize inputSettingsGPUState;
@synthesize inputManager;
@dynamic configInputTargetID;
@ -38,57 +87,34 @@
return self;
}
lastConfigButton = nil;
configInputTargetID = 0;
configInputList = [[NSMutableDictionary alloc] initWithCapacity:32];
configInputTargetID = nil;
configInputList = [[NSMutableDictionary alloc] initWithCapacity:128];
displayStringBindings = [[NSDictionary alloc] initWithObjectsAndKeys:
@"Input_Up", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_UP],
@"Input_Down", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_DOWN],
@"Input_Left", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_LEFT],
@"Input_Right", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_RIGHT],
@"Input_A", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_A],
@"Input_B", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_B],
@"Input_X", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_X],
@"Input_Y", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_Y],
@"Input_L", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_L],
@"Input_R", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_R],
@"Input_Start", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_START],
@"Input_Select", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SELECT],
@"Input_Microphone", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SIM_MIC],
@"Input_Lid", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_LID],
@"Input_Debug", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_DEBUG],
@"Input_SpeedHalf", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SPEED_HALF],
@"Input_SpeedDouble", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SPEED_DOUBLE],
@"Input_HUD", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_TOGGLE_HUD],
@"Input_Execute", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_EXECUTE],
@"Input_Pause", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_PAUSE],
@"Input_Reset", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_RESET],
@"Input_Touch", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_TOUCH],
inputPrefProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"UNKNOWN COMMAND",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowUp_420x420" ofType:@"png"]] autorelease], @"Up",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowDown_420x420" ofType:@"png"]] autorelease], @"Down",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowLeft_420x420" ofType:@"png"]] autorelease], @"Left",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowRight_420x420" ofType:@"png"]] autorelease], @"Right",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonA_420x420" ofType:@"png"]] autorelease], @"A",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonB_420x420" ofType:@"png"]] autorelease], @"B",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonX_420x420" ofType:@"png"]] autorelease], @"X",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonY_420x420" ofType:@"png"]] autorelease], @"Y",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonL_420x420" ofType:@"png"]] autorelease], @"L",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonR_420x420" ofType:@"png"]] autorelease], @"R",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonStart_420x420" ofType:@"png"]] autorelease], @"Start",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Select",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Microphone_420x420" ofType:@"png"]] autorelease], @"Microphone",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ShowHUD_420x420" ofType:@"png"]] autorelease], @"HUD",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]] autorelease], @"Pause",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute/Pause",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Reset_420x420" ofType:@"png"]] autorelease], @"Reset",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Touch",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]] autorelease], @"Mute/Unmute",
nil];
commandTagMap[PREF_INPUT_BUTTON_UP] = "Up";
commandTagMap[PREF_INPUT_BUTTON_DOWN] = "Down";
commandTagMap[PREF_INPUT_BUTTON_LEFT] = "Left";
commandTagMap[PREF_INPUT_BUTTON_RIGHT] = "Right";
commandTagMap[PREF_INPUT_BUTTON_A] = "A";
commandTagMap[PREF_INPUT_BUTTON_B] = "B";
commandTagMap[PREF_INPUT_BUTTON_X] = "X";
commandTagMap[PREF_INPUT_BUTTON_Y] = "Y";
commandTagMap[PREF_INPUT_BUTTON_L] = "L";
commandTagMap[PREF_INPUT_BUTTON_R] = "R";
commandTagMap[PREF_INPUT_BUTTON_START] = "Start";
commandTagMap[PREF_INPUT_BUTTON_SELECT] = "Select";
commandTagMap[PREF_INPUT_BUTTON_SIM_MIC] = "Microphone";
commandTagMap[PREF_INPUT_BUTTON_LID] = "Lid";
commandTagMap[PREF_INPUT_BUTTON_DEBUG] = "Debug";
commandTagMap[PREF_INPUT_BUTTON_SPEED_HALF] = "Speed Half";
commandTagMap[PREF_INPUT_BUTTON_SPEED_DOUBLE] = "Speed Double";
commandTagMap[PREF_INPUT_BUTTON_TOGGLE_HUD] = "HUD";
commandTagMap[PREF_INPUT_BUTTON_EXECUTE] = "Execute";
commandTagMap[PREF_INPUT_BUTTON_PAUSE] = "Pause";
commandTagMap[PREF_INPUT_BUTTON_RESET] = "Reset";
commandTagMap[PREF_INPUT_BUTTON_TOUCH] = "Touch";
commandTagList = [[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]] valueForKey:@"CommandTagList"] retain];
return self;
}
@ -96,102 +122,163 @@
- (void)dealloc
{
[configInputList release];
[displayStringBindings release];
[inputPrefProperties release];
[inputSettingsMappings release];
[commandTagList release];
[super dealloc];
}
#pragma mark Dynamic Properties
- (void) setConfigInputTargetID:(NSInteger)targetID
- (void) setConfigInputTargetID:(NSString *)targetID
{
if (targetID == 0)
if (targetID == nil)
{
[lastConfigButton setState:NSOffState];
lastConfigButton = nil;
[configInputTargetID release];
}
configInputTargetID = targetID;
[[self inputManager] setHidInputTarget:(targetID == 0) ? nil : self];
configInputTargetID = [targetID retain];
[[self inputManager] setHidInputTarget:(targetID == nil) ? nil : self];
}
- (NSInteger) configInputTargetID
- (NSString *) configInputTargetID
{
return configInputTargetID;
}
#pragma mark Class Methods
- (void) initSettingsSheets
{
inputSettingsMappings = [[NSDictionary alloc] initWithObjectsAndKeys:
inputSettingsMicrophone, @"Microphone",
inputSettingsTouch, @"Touch",
inputSettingsLoadStateSlot, @"Load State Slot",
inputSettingsSaveStateSlot, @"Save State Slot",
inputSettingsSetSpeedLimit, @"Set Speed",
inputSettingsGPUState, @"Enable/Disable GPU State",
nil];
}
- (NSString *) commandTagFromInputList:(NSArray *)inputList
{
NSString *commandTag = nil;
if (inputList == nil)
{
return commandTag;
}
NSDictionary *inputMappings = [inputManager inputMappings];
for (NSString *tag in inputMappings)
{
if (inputList == [inputMappings valueForKey:tag])
{
commandTag = tag;
break;
}
}
return commandTag;
}
- (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed
{
BOOL isHandled = NO;
if ([self configInputTargetID] == 0)
{
return isHandled;
}
std::string commandTag = commandTagMap[[self configInputTargetID]];
if (commandTag.empty())
{
return isHandled;
}
InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed);
[inputManager addMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()];
[inputManager writeUserDefaultsMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()];
NSMutableDictionary *prefWindowBindings = [(PreferencesWindowDelegate *)[prefWindow delegate] bindings];
NSString *displayBinding = (NSString *)[displayStringBindings valueForKey:[NSString stringWithFormat:@"%i", [self configInputTargetID]]];
[prefWindowBindings setValue:[self parseMappingDisplayString:commandTag.c_str()] forKey:displayBinding];
[self setConfigInputTargetID:0];
isHandled = YES;
return isHandled;
const InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed);
return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]];
}
- (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed
{
BOOL isHandled = NO;
if ([self configInputTargetID] == 0)
{
return isHandled;
}
std::string commandTag = commandTagMap[[self configInputTargetID]];
if (commandTag.empty())
{
return isHandled;
}
InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([mouseEvent buttonNumber], NSMakePoint(0.0f, 0.0f), buttonPressed);
[inputManager addMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()];
[inputManager writeUserDefaultsMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()];
NSMutableDictionary *prefWindowBindings = [(PreferencesWindowDelegate *)[prefWindow delegate] bindings];
NSString *displayBinding = (NSString *)[displayStringBindings valueForKey:[NSString stringWithFormat:@"%i", [self configInputTargetID]]];
[prefWindowBindings setValue:[self parseMappingDisplayString:commandTag.c_str()] forKey:displayBinding];
[self setConfigInputTargetID:0];
isHandled = YES;
return isHandled;
const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([mouseEvent buttonNumber], NSMakePoint(0.0f, 0.0f), buttonPressed);
return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]];
}
- (NSString *) parseMappingDisplayString:(const char *)commandTag
- (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag
{
NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"];
NSArray *mappingList = (NSArray *)[userMappings valueForKey:[NSString stringWithCString:commandTag encoding:NSUTF8StringEncoding]];
NSDictionary *mapping = (NSDictionary *)[mappingList objectAtIndex:0];
NSString *deviceName = (NSString *)[mapping valueForKey:@"deviceName"];
NSString *elementName = (NSString *)[mapping valueForKey:@"elementName"];
BOOL didMap = NO;
NSString *displayString = [NSString stringWithString:deviceName];
displayString = [displayString stringByAppendingString:@": "];
displayString = [displayString stringByAppendingString:elementName];
if (commandTag == nil)
{
return didMap;
}
return displayString;
const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding];
if (cmdTag == NULL)
{
return didMap;
}
// Add the input mapping.
const CommandAttributes cmdAttr = [inputManager defaultCommandAttributesForCommandTag:cmdTag];
[inputManager addMappingUsingInputAttributes:inputAttr commandAttributes:&cmdAttr];
[inputManager writeDefaultsInputMappings];
// Deselect the row of the command tag.
NSDictionary *inputMappings = [inputManager inputMappings];
NSArray *mappingList = (NSArray *)[inputMappings valueForKey:[self configInputTargetID]];
const NSInteger rowNumber = [inputPrefOutlineView rowForItem:mappingList];
if (rowNumber != -1)
{
[inputPrefOutlineView deselectRow:rowNumber];
}
// Update all expanded command tags.
for (NSString *tag in inputMappings)
{
NSArray *inputList = (NSArray *)[inputMappings valueForKey:tag];
if ([inputPrefOutlineView isItemExpanded:inputList])
{
[inputPrefOutlineView reloadItem:inputList reloadChildren:YES];
}
}
[self setConfigInputTargetID:nil];
didMap = YES;
return didMap;
}
- (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo
{
if (deviceInfo == nil)
{
return;
}
NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"];
NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"];
const char *devCode = [deviceCode cStringUsingEncoding:NSUTF8StringEncoding];
const char *elCode = [elementCode cStringUsingEncoding:NSUTF8StringEncoding];
CommandAttributes cmdAttr = [inputManager mappedCommandAttributesOfDeviceCode:devCode elementCode:elCode];
UpdateCommandAttributesWithDeviceInfoDictionary(&cmdAttr, deviceInfo);
[inputManager updateInputSettingsSummaryInDeviceInfoDictionary:deviceInfo commandTag:cmdAttr.tag];
[inputManager setMappedCommandAttributes:&cmdAttr deviceCode:devCode elementCode:elCode];
[inputManager writeDefaultsInputMappings];
}
- (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
[sheet orderOut:self];
NSOutlineView *outlineView = (NSOutlineView *)contextInfo;
NSMutableDictionary *deviceInfo = (NSMutableDictionary *)[inputSettingsController content];
switch (returnCode)
{
case NSCancelButton:
break;
case NSOKButton:
[self setMappingUsingDeviceInfoDictionary:deviceInfo];
[outlineView reloadItem:deviceInfo reloadChildren:NO];
break;
default:
break;
}
[inputSettingsController setContent:nil];
}
#pragma mark InputHIDManagerTarget Protocol
@ -199,7 +286,7 @@
{
BOOL isHandled = NO;
if ([self configInputTargetID] == 0)
if ([self configInputTargetID] == nil)
{
ClearHIDQueue(hidQueue);
return isHandled;
@ -211,11 +298,15 @@
for (unsigned int i = 0; i < inputCount; i++)
{
const InputAttributes &inputAttr = inputList[i];
const std::string inputKey = inputAttr.deviceCode + ":" + inputAttr.elementCode;
NSString *inputKeyStr = [NSString stringWithCString:inputKey.c_str() encoding:NSUTF8StringEncoding];
char inputKey[INPUT_HANDLER_STRING_LENGTH*2];
strlcpy(inputKey, inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputKey, ":", INPUT_HANDLER_STRING_LENGTH*2);
strlcat(inputKey, inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH*2);
NSString *inputKeyStr = [NSString stringWithCString:inputKey encoding:NSUTF8StringEncoding];
NSDate *inputOnDate = [configInputList valueForKey:inputKeyStr];
if (inputAttr.inputState == INPUT_ATTRIBUTE_STATE_ON)
if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON)
{
if (inputOnDate == nil)
{
@ -233,21 +324,7 @@
}
else
{
std::string commandTag = commandTagMap[[self configInputTargetID]];
if (commandTag.empty())
{
continue;
}
// Add the input mapping.
[inputManager addMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()];
[inputManager writeUserDefaultsMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()];
NSMutableDictionary *prefWindowBindings = [(PreferencesWindowDelegate *)[prefWindow delegate] bindings];
NSString *displayBinding = (NSString *)[displayStringBindings valueForKey:[NSString stringWithFormat:@"%i", [self configInputTargetID]]];
[prefWindowBindings setValue:[self parseMappingDisplayString:commandTag.c_str()] forKey:displayBinding];
[self setConfigInputTargetID:0];
isHandled = [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]];
break;
}
}
@ -258,6 +335,199 @@
return isHandled;
}
#pragma mark NSOutlineViewDelegate Protocol
- (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView
{
return NO;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
if ([(NSString *)[tableColumn identifier] isEqualToString:@"InputCommandTagColumn"] ||
[(NSString *)[tableColumn identifier] isEqualToString:@"InputSettingsColumn"] ||
[(NSString *)[tableColumn identifier] isEqualToString:@"RemoveInputColumn"])
{
return YES;
}
return NO;
}
- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
NSString *columnID = (NSString *)[tableColumn identifier];
NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]];
if ([columnID isEqualToString:@"InputCommandTagColumn"])
{
if ([item isKindOfClass:[NSArray class]])
{
NSString *commandTag = [self commandTagFromInputList:item];
if (commandTag != nil)
{
NSImage *buttonImage = (NSImage *)[inputPrefProperties valueForKey:commandTag];
if (buttonImage == nil)
{
buttonImage = (NSImage *)[inputPrefProperties valueForKey:@"UNKNOWN COMMAND"];
}
[outCell setTitle:commandTag];
[outCell setImage:buttonImage];
}
else
{
outCell = [[[NSCell alloc] init] autorelease];
}
}
else
{
outCell = [[[NSCell alloc] init] autorelease];
}
}
else if ([columnID isEqualToString:@"InputDeviceColumn"])
{
NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName]
traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0
weight:0
size:[[outCell font] pointSize]];
[outCell setFont:newFont];
}
else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"])
{
NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName]
traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0
weight:0
size:[[outCell font] pointSize]];
[outCell setFont:newFont];
}
else if ([columnID isEqualToString:@"InputSettingsColumn"])
{
if ([item isKindOfClass:[NSDictionary class]])
{
NSString *commandTag = [self commandTagFromInputList:[outlineView parentForItem:item]];
NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag];
[outCell setEnabled:(theSheet == nil) ? NO : YES];
}
else
{
outCell = [[[NSCell alloc] init] autorelease];
}
}
else if ([columnID isEqualToString:@"RemoveInputColumn"])
{
if (![item isKindOfClass:[NSDictionary class]])
{
outCell = [[[NSCell alloc] init] autorelease];
}
}
return outCell;
}
#pragma mark NSOutlineViewDataSource Protocol
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
{
if (item == nil)
{
NSString *commandTag = [commandTagList objectAtIndex:index];
return [[inputManager inputMappings] valueForKey:commandTag];
}
else if ([item isKindOfClass:[NSArray class]])
{
return [(NSArray *)item objectAtIndex:index];
}
return nil;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
if ([item isKindOfClass:[NSArray class]])
{
return YES;
}
return NO;
}
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
NSInteger numberChildren = 0;
if (item == nil)
{
numberChildren = [commandTagList count];
}
else if ([item isKindOfClass:[NSArray class]])
{
numberChildren = [(NSArray *)item count];
}
return numberChildren;
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
NSString *columnID = (NSString *)[tableColumn identifier];
if ([columnID isEqualToString:@"InputCommandTagColumn"])
{
if ([item isKindOfClass:[NSDictionary class]])
{
return nil;
}
}
else if ([columnID isEqualToString:@"InputDeviceColumn"])
{
if ([item isKindOfClass:[NSArray class]])
{
const unsigned long inputCount = (unsigned long)[(NSArray *)item count];
return [NSString stringWithFormat:(inputCount != 1) ? @"%ld Inputs Mapped" : @"%ld Input Mapped", inputCount];
}
else if ([item isKindOfClass:[NSDictionary class]])
{
return [item valueForKey:@"deviceInfoSummary"];
}
return @"";
}
else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"])
{
NSString *settingsSummary = @"";
if ([item isKindOfClass:[NSDictionary class]])
{
settingsSummary = [item valueForKey:@"inputSettingsSummary"];
}
return settingsSummary;
}
else if ([columnID isEqualToString:@"InputSettingsColumn"])
{
return nil;
}
else if ([columnID isEqualToString:@"RemoveInputColumn"])
{
return nil;
}
return item;
}
- (id)outlineView:(NSOutlineView *)outlineView persistentObjectForItem:(id)item
{
return [self commandTagFromInputList:item];
}
- (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object
{
NSString *commandTag = (NSString *)object;
NSArray *inputList = (NSArray *)[[inputManager inputMappings] valueForKey:commandTag];
return inputList;
}
#pragma mark NSResponder Methods
- (void)keyDown:(NSEvent *)theEvent
@ -328,25 +598,81 @@
#pragma mark IBAction Methods
- (IBAction) inputButtonSet:(id)sender
- (IBAction) setInputAdd:(id)sender
{
NSButton *theButton = (NSButton *)sender;
NSOutlineView *outlineView = (NSOutlineView *)sender;
const NSInteger rowNumber = [outlineView clickedRow];
if ([self configInputTargetID] != 0 && lastConfigButton != theButton)
{
[lastConfigButton setState:NSOffState];
}
if ([theButton state] == NSOnState)
{
lastConfigButton = theButton;
[configInputList removeAllObjects];
[self setConfigInputTargetID:[theButton tag]];
if ([outlineView isRowSelected:rowNumber])
{
[outlineView deselectRow:rowNumber];
[self setConfigInputTargetID:nil];
}
else
{
[self setConfigInputTargetID:0];
[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:rowNumber] byExtendingSelection:NO];
NSArray *inputList = (NSArray *)[outlineView itemAtRow:rowNumber];
[self setConfigInputTargetID:[self commandTagFromInputList:inputList]];
[prefWindow makeFirstResponder:self];
}
}
- (IBAction) removeInput:(id)sender
{
NSOutlineView *outlineView = (NSOutlineView *)sender;
const NSInteger rowNumber = [outlineView clickedRow];
NSDictionary *deviceInfo = (NSDictionary *)[outlineView itemAtRow:rowNumber];
[inputManager removeMappingUsingDeviceCode:[(NSString *)[deviceInfo valueForKey:@"deviceCode"] cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[(NSString *)[deviceInfo valueForKey:@"elementCode"] cStringUsingEncoding:NSUTF8StringEncoding]];
NSMutableArray *inputList = (NSMutableArray *)[outlineView parentForItem:deviceInfo];
[inputList removeObject:deviceInfo];
[outlineView reloadItem:inputList reloadChildren:YES];
[inputManager writeDefaultsInputMappings];
}
- (IBAction) changeSpeed:(id)sender
{
NSMutableDictionary *deviceInfo = (NSMutableDictionary *)[inputSettingsController content];
if (deviceInfo != nil)
{
const float speedScalar = (float)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f;
[deviceInfo setObject:[NSNumber numberWithFloat:speedScalar] forKey:@"floatValue0"];
}
}
- (IBAction) showSettingsSheet:(id)sender
{
NSOutlineView *outlineView = (NSOutlineView *)sender;
const NSInteger rowNumber = [outlineView clickedRow];
NSMutableDictionary *item = (NSMutableDictionary *)[outlineView itemAtRow:rowNumber];
NSString *commandTag = [self commandTagFromInputList:[outlineView parentForItem:item]];
NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag];
if (theSheet == nil)
{
return;
}
[inputSettingsController setContent:item];
[NSApp beginSheet:theSheet
modalForWindow:prefWindow
modalDelegate:self
didEndSelector:@selector(didEndSettingsSheet:returnCode:contextInfo:)
contextInfo:outlineView];
}
- (IBAction) closeSettingsSheet:(id)sender
{
NSWindow *sheet = [(NSControl *)sender window];
[sheet makeFirstResponder:nil]; // Force end of editing of any text fields.
[NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]];
}
@end

View File

@ -97,8 +97,6 @@
- (IBAction) chooseCheatDatabase:(id)sender;
- (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
- (IBAction) selectSoundInputMode:(id)sender;
- (IBAction) selectDisplayMode:(id)sender;
- (IBAction) selectDisplaySize:(id)sender;
- (IBAction) selectDisplayRotation:(id)sender;

View File

@ -377,12 +377,6 @@
}
}
- (IBAction) selectSoundInputMode:(id)sender
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore.cdsController setSoundInputMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"Input_AudioInputMode"]];
}
- (IBAction) selectDisplayMode:(id)sender
{
const NSInteger displayMode = [(NSMenuItem *)sender tag];
@ -762,7 +756,7 @@
{
[prefWindowController setContent:bindings];
if ([viewInput configInputTargetID] != 0)
if ([viewInput configInputTargetID] != nil)
{
[[viewInput inputManager] setHidInputTarget:viewInput];
}
@ -770,7 +764,7 @@
- (void)windowWillClose:(NSNotification *)notification
{
[viewInput setConfigInputTargetID:0];
[viewInput setConfigInputTargetID:nil];
}
@end