diff --git a/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj b/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj index 69b945351..5289bc187 100644 --- a/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj +++ b/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj @@ -57,6 +57,11 @@ AB126D09182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; AB126D0A182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; AB126D0B182ECB9500EBCF22 /* slot2_passme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */; }; + AB142026186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; + AB142027186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; + AB142028186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; + AB142029186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; + AB14202A186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; }; AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; @@ -622,7 +627,6 @@ AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; - AB711F281481C35F009011C8 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; @@ -864,6 +868,18 @@ AB7DDA6E173DC399004F3D07 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; AB7DDA6F173DC39E004F3D07 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; AB7DDA70173DC3A3004F3D07 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; + AB8C6CBF186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; + AB8C6CC0186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; + AB8C6CC1186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; + AB8C6CC2186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; + AB8C6CC3186A950C00E3EC64 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */; }; + AB8C6E57186CD07E00E3EC64 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; + AB8FFCB4186F8E5400C10085 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; + AB8FFE4A1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; + AB8FFE4B1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; + AB8FFE4C1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; + AB8FFE4D1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; + AB8FFE4E1872032B00C10085 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8FFE491872032B00C10085 /* Image_PaddleController.png */; }; AB97C554169646D1002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D5E516964F3B002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D60916964F48002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; @@ -1061,6 +1077,21 @@ ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; + ABAE2F7B18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; + ABAE2F7C18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; + ABAE2F7D18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; + ABAE2F7E18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; + ABAE2F7F18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */; }; + ABAE2F8418682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; + ABAE2F8518682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; + ABAE2F8618682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; + ABAE2F8718682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; + ABAE2F8818682B8F00C92F4F /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */; }; + ABAE30BB1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; + ABAE30BC1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; + ABAE30BD1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; + ABAE30BE1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; + ABAE30BF1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; ABB9212117CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABB9212217CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; @@ -1077,6 +1108,10 @@ ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; ABD0A53A1501AA5A0074A094 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; ABD0A53B1501AA5A0074A094 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; + ABEF84721873576300E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; + ABEF84831873578F00E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; + ABEF84841873579400E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; + ABEF84851873579700E99ADC /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */; }; ABF50ABA169F5FDA0018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7B169F5FDA0018C08D /* assembler.cpp */; }; ABF50ABB169F5FDA0018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7D169F5FDA0018C08D /* assert.cpp */; }; ABF50ABC169F5FDA0018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7F169F5FDA0018C08D /* buffer.cpp */; }; @@ -1201,6 +1236,7 @@ AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ShowHUD_420x420.png; path = images/Icon_ShowHUD_420x420.png; sourceTree = ""; }; AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = ""; }; AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_passme.cpp; sourceTree = ""; }; + AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_MemoryExpansionPak.png; path = images/Image_MemoryExpansionPak.png; sourceTree = ""; }; AB213D43170CB141006DDB0F /* InputProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputProfileController.h; sourceTree = ""; }; AB213D44170CB141006DDB0F /* InputProfileController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputProfileController.mm; sourceTree = ""; }; AB213E981710D074006DDB0F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -1282,6 +1318,9 @@ AB80E050142BC4FA00A52038 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; AB817A34143EE2DB00A7DFE9 /* videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = videofilter.h; sourceTree = ""; }; AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = videofilter.cpp; sourceTree = ""; }; + AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PassME.png; path = images/Image_PassME.png; sourceTree = ""; }; + AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = System/Library/Frameworks/ForceFeedback.framework; sourceTree = SDKROOT; }; + AB8FFE491872032B00C10085 /* Image_PaddleController.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PaddleController.png; path = images/Image_PaddleController.png; sourceTree = ""; }; AB901BDF1420706B00348EEC /* Japanese */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Japanese; path = translations/Japanese.lproj/Localizable.strings; sourceTree = ""; }; AB901BE01420706F00348EEC /* French */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = French; path = translations/French.lproj/Localizable.strings; sourceTree = ""; }; AB901BE11420707400348EEC /* Italian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Italian; path = translations/Italian.lproj/Localizable.strings; sourceTree = ""; }; @@ -1299,6 +1338,11 @@ ABAAFBE8172122B6005DDDBE /* FileMigrationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMigrationDelegate.h; sourceTree = ""; }; ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileMigrationDelegate.mm; sourceTree = ""; }; ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + ABAE2F7918682B6C00C92F4F /* Slot2WindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Slot2WindowDelegate.h; sourceTree = ""; }; + ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Slot2WindowDelegate.mm; sourceTree = ""; }; + ABAE2F8218682B8F00C92F4F /* cocoa_slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_slot2.h; sourceTree = ""; }; + ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_slot2.mm; sourceTree = ""; }; + ABAE30BA1869484F00C92F4F /* Image_Piano.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_Piano.png; path = images/Image_Piano.png; sourceTree = ""; }; ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; ABB9211F17CEB4110049D4C5 /* slot1comp_protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slot1comp_protocol.h; sourceTree = ""; }; ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1comp_protocol.cpp; sourceTree = ""; }; @@ -1601,14 +1645,15 @@ files = ( AB2A9A6D1725F00F0062C1A1 /* Accelerate.framework in Frameworks */, AB2A9A6E1725F00F0062C1A1 /* AppKit.framework in Frameworks */, + AB2A9A751725F00F0062C1A1 /* AudioToolbox.framework in Frameworks */, AB2A9A6F1725F00F0062C1A1 /* AudioUnit.framework in Frameworks */, + ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */, AB2A9A701725F00F0062C1A1 /* Cocoa.framework in Frameworks */, AB2A9A711725F00F0062C1A1 /* Foundation.framework in Frameworks */, + ABEF84851873579700E99ADC /* ForceFeedback.framework in Frameworks */, AB2A9A721725F00F0062C1A1 /* IOKit.framework in Frameworks */, - AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */, AB2A9A741725F00F0062C1A1 /* libz.dylib in Frameworks */, - AB2A9A751725F00F0062C1A1 /* AudioToolbox.framework in Frameworks */, - ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */, + AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1618,14 +1663,15 @@ files = ( AB97D60C16964F54002AC11B /* Accelerate.framework in Frameworks */, AB2F3C3B15CF9C6000858373 /* AppKit.framework in Frameworks */, + AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */, AB2F3C3C15CF9C6000858373 /* AudioUnit.framework in Frameworks */, + AB7DDA70173DC3A3004F3D07 /* Carbon.framework in Frameworks */, AB2F3C3D15CF9C6000858373 /* Cocoa.framework in Frameworks */, AB2F3C3E15CF9C6000858373 /* Foundation.framework in Frameworks */, + ABEF84841873579400E99ADC /* ForceFeedback.framework in Frameworks */, AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */, - AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */, AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */, - AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */, - AB7DDA70173DC3A3004F3D07 /* Carbon.framework in Frameworks */, + AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1635,14 +1681,15 @@ files = ( AB97C554169646D1002AC11B /* Accelerate.framework in Frameworks */, AB711F771481C35F009011C8 /* AppKit.framework in Frameworks */, + AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */, AB711F751481C35F009011C8 /* AudioUnit.framework in Frameworks */, + AB7DDA6D173DC38F004F3D07 /* Carbon.framework in Frameworks */, AB711F741481C35F009011C8 /* Cocoa.framework in Frameworks */, + AB8C6E57186CD07E00E3EC64 /* ForceFeedback.framework in Frameworks */, AB711F781481C35F009011C8 /* Foundation.framework in Frameworks */, AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */, - AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */, ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */, - AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */, - AB7DDA6D173DC38F004F3D07 /* Carbon.framework in Frameworks */, + AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1652,14 +1699,15 @@ files = ( AB97D5E516964F3B002AC11B /* Accelerate.framework in Frameworks */, AB73AA291507C9F500A310C8 /* AppKit.framework in Frameworks */, + AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, AB73AA2A1507C9F500A310C8 /* AudioUnit.framework in Frameworks */, + AB7DDA6E173DC399004F3D07 /* Carbon.framework in Frameworks */, AB73AA2B1507C9F500A310C8 /* Cocoa.framework in Frameworks */, + ABEF84721873576300E99ADC /* ForceFeedback.framework in Frameworks */, AB73AA2C1507C9F500A310C8 /* Foundation.framework in Frameworks */, AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */, - AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */, AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */, - AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, - AB7DDA6E173DC399004F3D07 /* Carbon.framework in Frameworks */, + AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1669,14 +1717,15 @@ files = ( AB97D60916964F48002AC11B /* Accelerate.framework in Frameworks */, ABAD103F15ACE7A00000EC47 /* AppKit.framework in Frameworks */, + AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, ABAD104015ACE7A00000EC47 /* AudioUnit.framework in Frameworks */, + AB7DDA6F173DC39E004F3D07 /* Carbon.framework in Frameworks */, ABAD104115ACE7A00000EC47 /* Cocoa.framework in Frameworks */, ABAD104215ACE7A00000EC47 /* Foundation.framework in Frameworks */, + ABEF84831873578F00E99ADC /* ForceFeedback.framework in Frameworks */, ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */, - ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */, ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */, - AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, - AB7DDA6F173DC39E004F3D07 /* Carbon.framework in Frameworks */, + ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1703,6 +1752,7 @@ ABD103FF1346652500AF11D1 /* cocoa_input.h */, AB3E34C7134AF4500056477A /* cocoa_output.h */, ABD104001346652500AF11D1 /* cocoa_rom.h */, + ABAE2F8218682B8F00C92F4F /* cocoa_slot2.h */, AB80E050142BC4FA00A52038 /* cocoa_util.h */, ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, ABD0A5361501AA5A0074A094 /* coreaudiosound.h */, @@ -1718,6 +1768,7 @@ ABD104111346652500AF11D1 /* cocoa_input.mm */, AB3E34C8134AF4500056477A /* cocoa_output.mm */, ABD104131346652500AF11D1 /* cocoa_rom.mm */, + ABAE2F8318682B8F00C92F4F /* cocoa_slot2.mm */, AB80E04C142BC4A800A52038 /* cocoa_util.mm */, ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, ); @@ -1733,6 +1784,7 @@ ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, @@ -1827,6 +1879,7 @@ AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB213D43170CB141006DDB0F /* InputProfileController.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, + ABAE2F7918682B6C00C92F4F /* Slot2WindowDelegate.h */, ABA0356E169127BB00817C69 /* troubleshootingWindowDelegate.h */, AB3ACB6714C2361100D7D192 /* appDelegate.mm */, AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, @@ -1837,6 +1890,7 @@ AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB213D44170CB141006DDB0F /* InputProfileController.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, + ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */, ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */, ); path = userinterface; @@ -1923,6 +1977,10 @@ ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, + AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */, + AB8FFE491872032B00C10085 /* Image_PaddleController.png */, + AB8C6CBE186A950C00E3EC64 /* Image_PassME.png */, + ABAE30BA1869484F00C92F4F /* Image_Piano.png */, AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, ); name = Images; @@ -2535,6 +2593,10 @@ AB2A99EC1725F00F0062C1A1 /* README.MAC in Resources */, AB2A99ED1725F00F0062C1A1 /* AppIcon_FirmwareConfig.icns in Resources */, AB2A99EE1725F00F0062C1A1 /* DisplayWindow.xib in Resources */, + ABAE30BF1869484F00C92F4F /* Image_Piano.png in Resources */, + AB8C6CC3186A950C00E3EC64 /* Image_PassME.png in Resources */, + AB14202A186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, + AB8FFE4E1872032B00C10085 /* Image_PaddleController.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2614,6 +2676,10 @@ AB2F3BC215CF9C6000858373 /* README.MAC in Resources */, AB2F3BC315CF9C6000858373 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBA16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, + ABAE30BB1869484F00C92F4F /* Image_Piano.png in Resources */, + AB8C6CBF186A950C00E3EC64 /* Image_PassME.png in Resources */, + AB142026186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, + AB8FFE4A1872032B00C10085 /* Image_PaddleController.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2693,6 +2759,10 @@ AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */, AB75226F14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBB16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, + ABAE30BC1869484F00C92F4F /* Image_Piano.png in Resources */, + AB8C6CC0186A950C00E3EC64 /* Image_PassME.png in Resources */, + AB142027186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, + AB8FFE4B1872032B00C10085 /* Image_PaddleController.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2772,6 +2842,10 @@ AB73A9B01507C9F500A310C8 /* README.MAC in Resources */, AB73A9B11507C9F500A310C8 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBD16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, + ABAE30BE1869484F00C92F4F /* Image_Piano.png in Resources */, + AB8C6CC2186A950C00E3EC64 /* Image_PassME.png in Resources */, + AB142029186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, + AB8FFE4D1872032B00C10085 /* Image_PaddleController.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2851,6 +2925,10 @@ ABAD0FB815ACE7A00000EC47 /* README.MAC in Resources */, ABAD0FB915ACE7A00000EC47 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBC16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, + ABAE30BD1869484F00C92F4F /* Image_Piano.png in Resources */, + AB8C6CC1186A950C00E3EC64 /* Image_PassME.png in Resources */, + AB142028186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */, + AB8FFE4C1872032B00C10085 /* Image_PaddleController.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3142,6 +3220,8 @@ AB126D0B182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518318313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518A18313E4E00CCD532 /* slot2.cpp in Sources */, + ABAE2F7F18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, + ABAE2F8818682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3282,6 +3362,8 @@ AB126D08182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518018313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518718313E4E00CCD532 /* slot2.cpp in Sources */, + ABAE2F7B18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, + ABAE2F8418682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3346,7 +3428,6 @@ AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */, AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */, AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */, - AB711F281481C35F009011C8 /* slot2_mpcf.cpp in Sources */, AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */, AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */, AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */, @@ -3452,6 +3533,9 @@ AB126D07182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53517F18313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518618313E4E00CCD532 /* slot2.cpp in Sources */, + ABAE2F7C18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, + ABAE2F8518682B8F00C92F4F /* cocoa_slot2.mm in Sources */, + AB8FFCB4186F8E5400C10085 /* slot2_mpcf.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3622,6 +3706,8 @@ AB126D0A182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518218313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518918313E4E00CCD532 /* slot2.cpp in Sources */, + ABAE2F7E18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, + ABAE2F8718682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3762,6 +3848,8 @@ AB126D09182ECB9500EBCF22 /* slot2_passme.cpp in Sources */, AB53518118313E3100CCD532 /* slot2_auto.cpp in Sources */, AB53518818313E4E00CCD532 /* slot2.cpp in Sources */, + ABAE2F7D18682B6C00C92F4F /* Slot2WindowDelegate.mm in Sources */, + ABAE2F8618682B8F00C92F4F /* cocoa_slot2.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj b/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj index 96096dd27..7fc1402f2 100644 --- a/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj +++ b/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj @@ -541,6 +541,21 @@ ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; + ABC9ED16187501FD001A7D02 /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC9ED15187501FD001A7D02 /* Slot2WindowDelegate.mm */; }; + ABC9ED17187501FD001A7D02 /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC9ED15187501FD001A7D02 /* Slot2WindowDelegate.mm */; }; + ABC9ED1C18750221001A7D02 /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1818750221001A7D02 /* Image_MemoryExpansionPak.png */; }; + ABC9ED1D18750221001A7D02 /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1818750221001A7D02 /* Image_MemoryExpansionPak.png */; }; + ABC9ED1E18750221001A7D02 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1918750221001A7D02 /* Image_PaddleController.png */; }; + ABC9ED1F18750221001A7D02 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1918750221001A7D02 /* Image_PaddleController.png */; }; + ABC9ED2018750221001A7D02 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1A18750221001A7D02 /* Image_PassME.png */; }; + ABC9ED2118750221001A7D02 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1A18750221001A7D02 /* Image_PassME.png */; }; + ABC9ED2218750221001A7D02 /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1B18750221001A7D02 /* Image_Piano.png */; }; + ABC9ED2318750221001A7D02 /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC9ED1B18750221001A7D02 /* Image_Piano.png */; }; + ABC9ED2618750244001A7D02 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC9ED2518750244001A7D02 /* cocoa_slot2.mm */; }; + ABC9ED2718750244001A7D02 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC9ED2518750244001A7D02 /* cocoa_slot2.mm */; }; + ABC9ED2818750244001A7D02 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABC9ED2518750244001A7D02 /* cocoa_slot2.mm */; }; + ABC9ED2A1875028E001A7D02 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC9ED291875028E001A7D02 /* ForceFeedback.framework */; }; + ABC9ED2B187502A2001A7D02 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC9ED291875028E001A7D02 /* ForceFeedback.framework */; }; ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; @@ -904,6 +919,15 @@ ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; ABC570D4134431DA00E7B0B1 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultKeyMappings.plist; sourceTree = ""; }; + ABC9ED14187501FD001A7D02 /* Slot2WindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Slot2WindowDelegate.h; sourceTree = ""; }; + ABC9ED15187501FD001A7D02 /* Slot2WindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Slot2WindowDelegate.mm; sourceTree = ""; }; + ABC9ED1818750221001A7D02 /* Image_MemoryExpansionPak.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_MemoryExpansionPak.png; path = images/Image_MemoryExpansionPak.png; sourceTree = ""; }; + ABC9ED1918750221001A7D02 /* Image_PaddleController.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PaddleController.png; path = images/Image_PaddleController.png; sourceTree = ""; }; + ABC9ED1A18750221001A7D02 /* Image_PassME.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PassME.png; path = images/Image_PassME.png; sourceTree = ""; }; + ABC9ED1B18750221001A7D02 /* Image_Piano.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_Piano.png; path = images/Image_Piano.png; sourceTree = ""; }; + ABC9ED2418750244001A7D02 /* cocoa_slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_slot2.h; sourceTree = ""; }; + ABC9ED2518750244001A7D02 /* cocoa_slot2.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_slot2.mm; sourceTree = ""; }; + ABC9ED291875028E001A7D02 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = System/Library/Frameworks/ForceFeedback.framework; sourceTree = SDKROOT; }; ABD103FE1346652500AF11D1 /* cocoa_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_core.h; sourceTree = ""; }; ABD103FF1346652500AF11D1 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = ""; }; ABD104001346652500AF11D1 /* cocoa_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_rom.h; sourceTree = ""; }; @@ -1135,12 +1159,13 @@ ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */, ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */, ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */, + AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */, + ABC9ED2B187502A2001A7D02 /* ForceFeedback.framework in Frameworks */, AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */, ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */, AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */, - AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1154,6 +1179,7 @@ AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */, AB74EC8A1738499C0026C41E /* Carbon.framework in Frameworks */, AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */, + ABC9ED2A1875028E001A7D02 /* ForceFeedback.framework in Frameworks */, AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */, AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */, AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */, @@ -1202,6 +1228,7 @@ ABD103FF1346652500AF11D1 /* cocoa_input.h */, AB3E34C7134AF4500056477A /* cocoa_output.h */, ABD104001346652500AF11D1 /* cocoa_rom.h */, + ABC9ED2418750244001A7D02 /* cocoa_slot2.h */, AB80E050142BC4FA00A52038 /* cocoa_util.h */, ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, AB1B9E611501A78000464647 /* coreaudiosound.h */, @@ -1217,6 +1244,7 @@ ABD104111346652500AF11D1 /* cocoa_input.mm */, AB3E34C8134AF4500056477A /* cocoa_output.mm */, ABD104131346652500AF11D1 /* cocoa_rom.mm */, + ABC9ED2518750244001A7D02 /* cocoa_slot2.mm */, AB80E04C142BC4A800A52038 /* cocoa_util.mm */, ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, ); @@ -1232,6 +1260,7 @@ ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, AB74EC891738499C0026C41E /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + ABC9ED291875028E001A7D02 /* ForceFeedback.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, @@ -1325,6 +1354,7 @@ AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB01005C170D07AF00D70FBE /* InputProfileController.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, + ABC9ED14187501FD001A7D02 /* Slot2WindowDelegate.h */, ABF2B9F81690412A000FF7C0 /* troubleshootingWindowDelegate.h */, AB3ACB6714C2361100D7D192 /* appDelegate.mm */, AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, @@ -1335,6 +1365,7 @@ AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB01005D170D07B000D70FBE /* InputProfileController.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, + ABC9ED15187501FD001A7D02 /* Slot2WindowDelegate.mm */, ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */, ); path = userinterface; @@ -1513,6 +1544,10 @@ ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, + ABC9ED1818750221001A7D02 /* Image_MemoryExpansionPak.png */, + ABC9ED1918750221001A7D02 /* Image_PaddleController.png */, + ABC9ED1A18750221001A7D02 /* Image_PassME.png */, + ABC9ED1B18750221001A7D02 /* Image_Piano.png */, AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, ); name = Images; @@ -2008,6 +2043,10 @@ AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */, AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, AB8967DE16D2ED2700F826F1 /* DisplayWindow.xib in Resources */, + ABC9ED1D18750221001A7D02 /* Image_MemoryExpansionPak.png in Resources */, + ABC9ED1F18750221001A7D02 /* Image_PaddleController.png in Resources */, + ABC9ED2118750221001A7D02 /* Image_PassME.png in Resources */, + ABC9ED2318750221001A7D02 /* Image_Piano.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2087,6 +2126,10 @@ AB796CEC15CDCBA200C59155 /* README.MAC in Resources */, AB796CED15CDCBA200C59155 /* AppIcon_FirmwareConfig.icns in Resources */, AB8967DD16D2ED2700F826F1 /* DisplayWindow.xib in Resources */, + ABC9ED1C18750221001A7D02 /* Image_MemoryExpansionPak.png in Resources */, + ABC9ED1E18750221001A7D02 /* Image_PaddleController.png in Resources */, + ABC9ED2018750221001A7D02 /* Image_PassME.png in Resources */, + ABC9ED2218750221001A7D02 /* Image_Piano.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2359,6 +2402,8 @@ AB107686182ECB29000D6F67 /* slot2_passme.cpp in Sources */, AB1B702D18313D7700E64141 /* slot2_auto.cpp in Sources */, AB1B703118313D9000E64141 /* slot2.cpp in Sources */, + ABC9ED17187501FD001A7D02 /* Slot2WindowDelegate.mm in Sources */, + ABC9ED2718750244001A7D02 /* cocoa_slot2.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2530,6 +2575,8 @@ AB107685182ECB29000D6F67 /* slot2_passme.cpp in Sources */, AB1B702C18313D7700E64141 /* slot2_auto.cpp in Sources */, AB1B703018313D9000E64141 /* slot2.cpp in Sources */, + ABC9ED16187501FD001A7D02 /* Slot2WindowDelegate.mm in Sources */, + ABC9ED2618750244001A7D02 /* cocoa_slot2.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2691,6 +2738,7 @@ AB1B702E18313D7700E64141 /* slot2_auto.cpp in Sources */, AB1B703218313D9000E64141 /* slot2.cpp in Sources */, AB4806BC18472EF20085F59B /* cocoa_cheat.mm in Sources */, + ABC9ED2818750244001A7D02 /* cocoa_slot2.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/desmume/src/cocoa/DeSmuME (Xcode 5).xcodeproj/project.pbxproj b/desmume/src/cocoa/DeSmuME (Xcode 5).xcodeproj/project.pbxproj index a451b99a2..a40fb8db8 100644 --- a/desmume/src/cocoa/DeSmuME (Xcode 5).xcodeproj/project.pbxproj +++ b/desmume/src/cocoa/DeSmuME (Xcode 5).xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AB0038A71872A96700B0B055 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0038A61872A96700B0B055 /* Image_PaddleController.png */; }; + AB0038A81872A96700B0B055 /* Image_PaddleController.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0038A61872A96700B0B055 /* Image_PaddleController.png */; }; AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB00E87E14205EBC00DE561F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB01005E170D07B000D70FBE /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB01005D170D07B000D70FBE /* InputProfileController.mm */; }; @@ -197,6 +199,19 @@ AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; + AB5648FF186E6EA8002740F4 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */; }; + AB564900186E6EA8002740F4 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */; }; + AB564901186E6EA8002740F4 /* cocoa_slot2.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */; }; + AB564904186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */; }; + AB564905186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */; }; + AB564907186E6F0C002740F4 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB564906186E6F0C002740F4 /* ForceFeedback.framework */; }; + AB564908186E6F1F002740F4 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB564906186E6F0C002740F4 /* ForceFeedback.framework */; }; + AB564910186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */; }; + AB564911186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */; }; + AB564912186E6F67002740F4 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490A186E6F67002740F4 /* Image_PassME.png */; }; + AB564913186E6F67002740F4 /* Image_PassME.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490A186E6F67002740F4 /* Image_PassME.png */; }; + AB564914186E6F67002740F4 /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490B186E6F67002740F4 /* Image_Piano.png */; }; + AB564915186E6F67002740F4 /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = AB56490B186E6F67002740F4 /* Image_Piano.png */; }; AB5785F817175F16002C5FC7 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB5785F9171760D2002C5FC7 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB5785FD17176AFC002C5FC7 /* OpenEmuBase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */; }; @@ -673,6 +688,7 @@ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* DeSmuME (Debug).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (Debug).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + AB0038A61872A96700B0B055 /* Image_PaddleController.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PaddleController.png; path = images/Image_PaddleController.png; sourceTree = ""; }; AB00E87A14205EAE00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = translations/English.lproj/InfoPlist.strings; sourceTree = ""; }; AB00E87D14205EBC00DE561F /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/MainMenu.xib; sourceTree = ""; }; AB00E89114205ECC00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/Localizable.strings; sourceTree = ""; }; @@ -830,6 +846,14 @@ AB405676169F5DCC0016AC3E /* x86util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86util.cpp; sourceTree = ""; }; AB405677169F5DCC0016AC3E /* x86util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86util.h; sourceTree = ""; }; AB4FCEBC1692AB82000F498F /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + AB5648FD186E6EA8002740F4 /* cocoa_slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_slot2.h; sourceTree = ""; }; + AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_slot2.mm; sourceTree = ""; }; + AB564902186E6EBC002740F4 /* Slot2WindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Slot2WindowDelegate.h; sourceTree = ""; }; + AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Slot2WindowDelegate.mm; sourceTree = ""; }; + AB564906186E6F0C002740F4 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = System/Library/Frameworks/ForceFeedback.framework; sourceTree = SDKROOT; }; + AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_MemoryExpansionPak.png; path = images/Image_MemoryExpansionPak.png; sourceTree = ""; }; + AB56490A186E6F67002740F4 /* Image_PassME.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_PassME.png; path = images/Image_PassME.png; sourceTree = ""; }; + AB56490B186E6F67002740F4 /* Image_Piano.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_Piano.png; path = images/Image_Piano.png; sourceTree = ""; }; AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenEmuBase.framework; path = openemu/OpenEmuBase.framework; sourceTree = ""; }; AB58F32B1364F44B0074C376 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; AB58F32C1364F44B0074C376 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; @@ -1135,12 +1159,13 @@ ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */, ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */, ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */, + AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + AB564908186E6F1F002740F4 /* ForceFeedback.framework in Frameworks */, ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */, AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */, ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */, AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */, - AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1154,6 +1179,7 @@ AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */, AB74EC8A1738499C0026C41E /* Carbon.framework in Frameworks */, AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */, + AB564907186E6F0C002740F4 /* ForceFeedback.framework in Frameworks */, AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */, AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */, AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */, @@ -1202,6 +1228,7 @@ ABD103FF1346652500AF11D1 /* cocoa_input.h */, AB3E34C7134AF4500056477A /* cocoa_output.h */, ABD104001346652500AF11D1 /* cocoa_rom.h */, + AB5648FD186E6EA8002740F4 /* cocoa_slot2.h */, AB80E050142BC4FA00A52038 /* cocoa_util.h */, ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, AB1B9E611501A78000464647 /* coreaudiosound.h */, @@ -1217,6 +1244,7 @@ ABD104111346652500AF11D1 /* cocoa_input.mm */, AB3E34C8134AF4500056477A /* cocoa_output.mm */, ABD104131346652500AF11D1 /* cocoa_rom.mm */, + AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */, AB80E04C142BC4A800A52038 /* cocoa_util.mm */, ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, ); @@ -1232,6 +1260,7 @@ ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, AB74EC891738499C0026C41E /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + AB564906186E6F0C002740F4 /* ForceFeedback.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, @@ -1325,6 +1354,7 @@ AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB01005C170D07AF00D70FBE /* InputProfileController.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, + AB564902186E6EBC002740F4 /* Slot2WindowDelegate.h */, ABF2B9F81690412A000FF7C0 /* troubleshootingWindowDelegate.h */, AB3ACB6714C2361100D7D192 /* appDelegate.mm */, AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, @@ -1335,6 +1365,7 @@ AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB01005D170D07B000D70FBE /* InputProfileController.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, + AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */, ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */, ); path = userinterface; @@ -1513,6 +1544,10 @@ ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, + AB564909186E6F67002740F4 /* Image_MemoryExpansionPak.png */, + AB0038A61872A96700B0B055 /* Image_PaddleController.png */, + AB56490A186E6F67002740F4 /* Image_PassME.png */, + AB56490B186E6F67002740F4 /* Image_Piano.png */, AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, ); name = Images; @@ -1952,6 +1987,7 @@ ABB97878144E89CC00793FA3 /* Icon_DeSmuME_32x32.png in Resources */, AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */, ABBF04A514B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */, + AB564915186E6F67002740F4 /* Image_Piano.png in Resources */, ABC3AF2F14B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */, ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */, ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */, @@ -1974,11 +2010,13 @@ AB0F294314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */, AB0F294414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB0F294514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */, + AB564911186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */, AB0F294614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */, AB0F294714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */, AB0F296D14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */, AB0F296E14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */, AB0F297A14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */, + AB564913186E6F67002740F4 /* Image_PassME.png in Resources */, AB0F298C14BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */, AB0F298D14BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */, AB0F298E14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */, @@ -1991,6 +2029,7 @@ AB0F29AB14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */, AB0F29AC14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */, AB0F29AD14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */, + AB0038A81872A96700B0B055 /* Image_PaddleController.png in Resources */, AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */, AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */, AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */, @@ -2031,6 +2070,7 @@ AB796CB415CDCBA200C59155 /* Icon_DeSmuME_32x32.png in Resources */, AB796CB515CDCBA200C59155 /* HID_usage_strings.plist in Resources */, AB796CB615CDCBA200C59155 /* AppIcon_ROMCheats.icns in Resources */, + AB564914186E6F67002740F4 /* Image_Piano.png in Resources */, AB796CB715CDCBA200C59155 /* Icon_VolumeFull_16x16.png in Resources */, AB796CB815CDCBA200C59155 /* Icon_VolumeMute_16x16.png in Resources */, AB796CB915CDCBA200C59155 /* Icon_VolumeOneThird_16x16.png in Resources */, @@ -2053,11 +2093,13 @@ AB796CCA15CDCBA200C59155 /* ColorSwatch_Red_16x16.png in Resources */, AB796CCB15CDCBA200C59155 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB796CCC15CDCBA200C59155 /* ColorSwatch_Turquoise_16x16.png in Resources */, + AB564910186E6F67002740F4 /* Image_MemoryExpansionPak.png in Resources */, AB796CCD15CDCBA200C59155 /* ColorSwatch_Violet_16x16.png in Resources */, AB796CCE15CDCBA200C59155 /* ColorSwatch_Yellow_16x16.png in Resources */, AB796CCF15CDCBA200C59155 /* Icon_ActionReplay_128x128.png in Resources */, AB796CD015CDCBA200C59155 /* Icon_CodeBreaker_128x128.png in Resources */, AB796CD115CDCBA200C59155 /* VideoFilterPreview_64x64.png in Resources */, + AB564912186E6F67002740F4 /* Image_PassME.png in Resources */, AB796CD215CDCBA200C59155 /* Icon_ArrowDown_420x420.png in Resources */, AB796CD315CDCBA200C59155 /* Icon_ArrowLeft_420x420.png in Resources */, AB796CD415CDCBA200C59155 /* Icon_ArrowRight_420x420.png in Resources */, @@ -2070,6 +2112,7 @@ AB796CDB15CDCBA200C59155 /* Icon_DSButtonSelect_420x420.png in Resources */, AB796CDC15CDCBA200C59155 /* Icon_DSButtonStart_420x420.png in Resources */, AB796CDD15CDCBA200C59155 /* Icon_DSButtonX_420x420.png in Resources */, + AB0038A71872A96700B0B055 /* Image_PaddleController.png in Resources */, AB796CDE15CDCBA200C59155 /* Icon_DSButtonY_420x420.png in Resources */, AB796CDF15CDCBA200C59155 /* Icon_Emulation_420x420.png in Resources */, AB796CE015CDCBA200C59155 /* Icon_Input_420x420.png in Resources */, @@ -2267,6 +2310,7 @@ ABD1FF151345AC9C00AF11D1 /* slot2_rumblepak.cpp in Sources */, ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */, AB1F468413A0ADE400B80DE6 /* SndOut.cpp in Sources */, + AB564905186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */, ABAD3E7813AF1D6D00502E1E /* SoundTouch.cpp in Sources */, AB9038B017C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */, ABD1FEFA1345AC8400AF11D1 /* SPU.cpp in Sources */, @@ -2342,6 +2386,7 @@ AB405682169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */, AB405685169F5DCC0016AC3E /* x86compileritem.cpp in Sources */, AB405688169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */, + AB564900186E6EA8002740F4 /* cocoa_slot2.mm in Sources */, AB40568B169F5DCC0016AC3E /* x86defs.cpp in Sources */, AB40568E169F5DCC0016AC3E /* x86func.cpp in Sources */, AB405691169F5DCC0016AC3E /* x86operand.cpp in Sources */, @@ -2389,6 +2434,7 @@ AB796D0115CDCBA200C59155 /* dlditool.cpp in Sources */, AB796D0215CDCBA200C59155 /* driver.cpp in Sources */, AB796D0315CDCBA200C59155 /* emufat.cpp in Sources */, + AB564904186E6EBC002740F4 /* Slot2WindowDelegate.mm in Sources */, AB9038B217C5ED2200F410BD /* slot1_retail_mcrom.cpp in Sources */, AB796D0415CDCBA200C59155 /* emufile.cpp in Sources */, AB796D0515CDCBA200C59155 /* fatdir.cpp in Sources */, @@ -2431,6 +2477,7 @@ AB796D2815CDCBA200C59155 /* slot1.cpp in Sources */, AB796D2915CDCBA200C59155 /* slot1_none.cpp in Sources */, AB2EE12C17D57ED500F68622 /* slot1_retail_mcrom_debug.cpp in Sources */, + AB5648FF186E6EA8002740F4 /* cocoa_slot2.mm in Sources */, AB796D2A15CDCBA200C59155 /* slot1_r4.cpp in Sources */, AB796D2C15CDCBA200C59155 /* slot1_retail_nand.cpp in Sources */, AB796D2D15CDCBA200C59155 /* slot2_expMemory.cpp in Sources */, @@ -2537,6 +2584,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + AB564901186E6EA8002740F4 /* cocoa_slot2.mm in Sources */, ABE9EEEB1501C78700D3FB19 /* fs-linux.cpp in Sources */, ABCFA9F6178BDE920030C8BA /* encrypt.cpp in Sources */, ABB3C66C1501C04F00E0C22E /* NDSGameCore.mm in Sources */, diff --git a/desmume/src/cocoa/DefaultKeyMappings.plist b/desmume/src/cocoa/DefaultKeyMappings.plist index 34a6b6a13..28999ec40 100644 --- a/desmume/src/cocoa/DefaultKeyMappings.plist +++ b/desmume/src/cocoa/DefaultKeyMappings.plist @@ -33,6 +33,7 @@ Enable/Disable Auto Frame Skip Enable/Disable Cheats Enable/Disable GPU State + Paddle DefaultInputProfiles @@ -410,6 +411,8 @@ Enable/Disable GPU State + Paddle + diff --git a/desmume/src/cocoa/DefaultUserPrefs.plist b/desmume/src/cocoa/DefaultUserPrefs.plist index 182ead523..d9e12105b 100644 Binary files a/desmume/src/cocoa/DefaultUserPrefs.plist and b/desmume/src/cocoa/DefaultUserPrefs.plist differ diff --git a/desmume/src/cocoa/cocoa_globals.h b/desmume/src/cocoa/cocoa_globals.h index e2591504e..6f3c16a47 100644 --- a/desmume/src/cocoa/cocoa_globals.h +++ b/desmume/src/cocoa/cocoa_globals.h @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2013 DeSmuME team + Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,6 +34,10 @@ #define NSSTRING_TITLE_SELECT_ARM7_IMAGE_PANEL NSLocalizedString(@"Select ARM7 BIOS Image", nil) #define NSSTRING_TITLE_SELECT_ARM9_IMAGE_PANEL NSLocalizedString(@"Select ARM9 BIOS Image", nil) #define NSSTRING_TITLE_SELECT_FIRMWARE_IMAGE_PANEL NSLocalizedString(@"Select Firmware Image", nil) +#define NSSTRING_TITLE_SELECT_MPCF_FOLDER_PANEL NSLocalizedString(@"Select MPCF Folder", nil) +#define NSSTRING_TITLE_SELECT_MPCF_DISK_IMAGE_PANEL NSLocalizedString(@"Select MPCF Disk Image", nil) +#define NSSTRING_TITLE_CHOOSE_GBA_CARTRIDGE_PANEL NSLocalizedString(@"Choose GBA Cartridge", nil) +#define NSSTRING_TITLE_CHOOSE_GBA_SRAM_PANEL NSLocalizedString(@"Choose GBA SRAM File", nil) #define NSSTRING_TITLE_SAVE_SCREENSHOT_PANEL NSLocalizedString(@"Save Screenshot", nil) #define NSSTRING_TITLE_EXECUTE_CONTROL NSLocalizedString(@"Execute", nil) @@ -107,7 +111,22 @@ #define NSSTRING_STATUS_SLOT1_R4_INSERTED NSLocalizedString(@"R4 cartridge interface inserted.", nil) #define NSSTRING_STATUS_SLOT1_STANDARD_INSERTED NSLocalizedString(@"Standard retail cartridge inserted.", nil) -#define NSSTRING_STATUS_AUTOLOAD_ROM_NAME_NONE NSLocalizedString(@"No ROM chosen.", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_NONE NSLocalizedString(@"No SLOT-2 device loaded.", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_AUTOMATIC NSLocalizedString(@"Loaded SLOT-2 device using automatic selection.\nSelected device type: %@", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_MPCF_WITH_ROM NSLocalizedString(@"Compact flash device loaded with data from the ROM's directory.", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_MPCF_DIRECTORY NSLocalizedString(@"Compact flash device loaded with data from directory path:\n%s", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_MPCF_DISK_IMAGE NSLocalizedString(@"Compact flash device loaded using disk image:\n%s", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_WITH_SRAM NSLocalizedString(@"GBA cartridge loaded with SRAM file:\n%s", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_NO_SRAM NSLocalizedString(@"GBA cartridge loaded. (No associated SRAM file loaded.)", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_GENERIC_DEVICE NSLocalizedString(@"Loaded SLOT-2 device:\n%@", nil) +#define NSSTRING_STATUS_SLOT2_LOADED_UNKNOWN NSLocalizedString(@"An unknown SLOT-2 device has been loaded.", nil) + +#define NSSTRING_STATUS_NO_ROM_CHOSEN NSLocalizedString(@"No ROM chosen.", nil) +#define NSSTRING_STATUS_NO_FOLDER_CHOSEN NSLocalizedString(@"No folder chosen.", nil) +#define NSSTRING_STATUS_NO_DISK_IMAGE_CHOSEN NSLocalizedString(@"No disk image chosen.", nil) +#define NSSTRING_STATUS_NO_GBA_CART_CHOSEN NSLocalizedString(@"No GBA cartridge chosen.", nil) +#define NSSTRING_STATUS_NO_GBA_SRAM_CHOSEN NSLocalizedString(@"No GBA SRAM chosen.", nil) +#define NSSTRING_STATUS_NO_GBA_SRAM_FOUND NSLocalizedString(@"No GBA SRAM found.", nil) #define NSSTRING_DISPLAYMODE_MAIN NSLocalizedString(@"Main", nil) #define NSSTRING_DISPLAYMODE_TOUCH NSLocalizedString(@"Touch", nil) @@ -166,6 +185,8 @@ #define FILE_EXT_HW_IMAGE_FILE "bin" #define FILE_EXT_ADVANSCENE_DB "xml" #define FILE_EXT_R4_CHEAT_DB "dat" +#define FILE_EXT_GBA_ROM "gba" +#define FILE_EXT_GBA_SRAM "sav" #define MAX_SAVESTATE_SLOTS 10 @@ -225,6 +246,10 @@ #define COCOA_DIALOG_OK 1 #define COCOA_DIALOG_OPTION 2 +#define RUMBLE_ITERATIONS_RUMBLE_PAK 2 +#define RUMBLE_ITERATIONS_ENABLE 1 +#define RUMBLE_ITERATIONS_TEST 3 + enum { ROMAUTOLOADOPTION_LOAD_LAST = 0, @@ -233,6 +258,15 @@ enum ROMAUTOLOADOPTION_CHOOSE_ROM = 10001 }; +enum +{ + MPCF_OPTION_LOAD_WITH_ROM = 0, + MPCF_OPTION_LOAD_DIRECTORY = 1, + MPCF_OPTION_LOAD_DISK_IMAGE = 2, + MPCF_ACTION_CHOOSE_DIRECTORY = 10000, + MPCF_ACTION_CHOOSE_DISK_IMAGE = 10001 +}; + enum { REASONFORCLOSE_NORMAL = 0, @@ -479,3 +513,9 @@ enum MICMODE_PHYSICAL, MICMODE_SINE_WAVE }; + +enum +{ + PADDLE_CONTROL_RELATIVE = 0, + PADDLE_CONTROL_DIRECT +}; diff --git a/desmume/src/cocoa/cocoa_input.h b/desmume/src/cocoa/cocoa_input.h index 3b33a8941..88f647c55 100644 --- a/desmume/src/cocoa/cocoa_input.h +++ b/desmume/src/cocoa/cocoa_input.h @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2013 DeSmuME team + Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,6 +41,25 @@ enum DSControllerState_Touch, DSControllerState_Microphone, + DSControllerState_GuitarGrip_Green, + DSControllerState_GuitarGrip_Red, + DSControllerState_GuitarGrip_Yellow, + DSControllerState_GuitarGrip_Blue, + DSControllerState_Piano_C, + DSControllerState_Piano_CSharp, + DSControllerState_Piano_D, + DSControllerState_Piano_DSharp, + DSControllerState_Piano_E, + DSControllerState_Piano_F, + DSControllerState_Piano_FSharp, + DSControllerState_Piano_G, + DSControllerState_Piano_GSharp, + DSControllerState_Piano_A, + DSControllerState_Piano_ASharp, + DSControllerState_Piano_B, + DSControllerState_Piano_HighC, + DSControllerState_Paddle, + DSControllerState_StatesCount }; diff --git a/desmume/src/cocoa/cocoa_slot2.h b/desmume/src/cocoa/cocoa_slot2.h new file mode 100644 index 000000000..d4645f7c9 --- /dev/null +++ b/desmume/src/cocoa/cocoa_slot2.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2014 DeSmuME Team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . + */ + +#import +#include "../slot2.h" +#undef BOOL + +@interface CocoaDSSlot2Device : NSObject +{ + ISlot2Interface *device; + BOOL enabled; +} + +@property (readonly) NSString *name; +@property (readonly) NSString *description; +@property (readonly) NSInteger deviceID; +@property (readonly) NDS_SLOT2_TYPE type; +@property (assign) BOOL enabled; + +- (id) initWithDeviceData:(ISlot2Interface *)deviceData; + +@end + +@interface CocoaDSSlot2Manager : NSObject +{ + NSMutableArray *deviceList; + CocoaDSSlot2Device *currentDevice; + NSString *slot2StatusText; +} + +@property (readonly) NSMutableArray *deviceList; +@property (retain) CocoaDSSlot2Device *currentDevice; +@property (assign) NSString *slot2StatusText; +@property (retain) NSURL *mpcfFileSearchURL; +@property (copy) NSURL *gbaCartridgeURL; +@property (copy) NSURL *gbaSRamURL; +@property (readonly) BOOL doesGbaCartridgeSaveExist; +@property (assign) UInt16 paddleValue; + +- (CocoaDSSlot2Device *) autoSelectedDevice; +- (NSString *) autoSelectedDeviceName; +- (CocoaDSSlot2Device *) findDeviceByType:(NDS_SLOT2_TYPE)theType; +- (void) setDeviceByType:(NDS_SLOT2_TYPE)theType; +- (void) updateDeviceList; +- (void) updateStatus; + +@end + +// Force Feedback +void OSXSendForceFeedbackState(bool enable); diff --git a/desmume/src/cocoa/cocoa_slot2.mm b/desmume/src/cocoa/cocoa_slot2.mm new file mode 100644 index 000000000..bcd972ba6 --- /dev/null +++ b/desmume/src/cocoa/cocoa_slot2.mm @@ -0,0 +1,407 @@ +/* + Copyright (C) 2014 DeSmuME Team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . + */ + +#import "cocoa_slot2.h" +#import "cocoa_globals.h" +#import "cocoa_util.h" + +#include "../NDSSystem.h" +#undef BOOL + +@implementation CocoaDSSlot2Device + +@dynamic name; +@dynamic description; +@dynamic deviceID; +@dynamic type; +@synthesize enabled; + + +- (id) initWithDeviceData:(ISlot2Interface *)deviceData +{ + self = [super init]; + if (self == nil) + { + return self; + } + + device = deviceData; + enabled = NO; + + return self; +} + +- (void) dealloc +{ + [self setEnabled:nil]; + + [super dealloc]; +} + +- (NSString *) name +{ + const char *cDeviceName = device->info()->name(); + NSString *theName = (cDeviceName != NULL) ? [NSString stringWithCString:cDeviceName encoding:NSUTF8StringEncoding] : @""; + + return theName; +} + +- (NSString *) description +{ + const char *cDeviceDescription = device->info()->descr(); + NSString *theDesc = (cDeviceDescription != NULL) ? [NSString stringWithCString:cDeviceDescription encoding:NSUTF8StringEncoding] : @""; + + return theDesc; +} + +- (NSInteger) deviceID +{ + return (NSInteger)device->info()->id(); +} + +- (NDS_SLOT2_TYPE) type +{ + NDS_SLOT2_TYPE theType = NDS_SLOT2_NONE; + slot2_getTypeByID(device->info()->id(), theType); + return theType; +} + +@end + +@implementation CocoaDSSlot2Manager + +@synthesize deviceList; +@dynamic currentDevice; +@synthesize slot2StatusText; +@dynamic mpcfFileSearchURL; +@dynamic gbaCartridgeURL; +@dynamic gbaSRamURL; +@dynamic doesGbaCartridgeSaveExist; +@dynamic paddleValue; + +- (id) init +{ + self = [super init]; + if (self == nil) + { + return self; + } + + deviceList = [[NSMutableArray alloc] initWithCapacity:32]; + slot2StatusText = NSSTRING_STATUS_SLOT2_LOADED_NONE; + [self setGbaCartridgeURL:nil]; + + if (FeedbackON == NULL) + { + FeedbackON = &OSXSendForceFeedbackState; + } + + return self; +} + +- (void) dealloc +{ + [deviceList release]; + + [super dealloc]; +} + +- (void) setCurrentDevice:(CocoaDSSlot2Device *)theDevice +{ + NDS_SLOT2_TYPE theType = NDS_SLOT2_NONE; + + if (theDevice != nil) + { + theType = [theDevice type]; + [theDevice retain]; + } + + bool slotDidChange = slot2_Change(theType); + if (slotDidChange || currentDevice == nil) + { + [currentDevice release]; + currentDevice = theDevice; + } + + [self updateStatus]; +} + +- (CocoaDSSlot2Device *) currentDevice +{ + return currentDevice; +} + +- (void) setMpcfFileSearchURL:(NSURL *)theURL +{ + if (theURL != nil) + { + BOOL isDirectory = NO; + NSString *thePath = [theURL path]; + + NSFileManager *fileManager = [[NSFileManager alloc] init]; + [fileManager fileExistsAtPath:thePath isDirectory:&isDirectory]; + + CFlash_Mode = (isDirectory) ? ADDON_CFLASH_MODE_Path : ADDON_CFLASH_MODE_File; + CFlash_Path = [thePath cStringUsingEncoding:NSUTF8StringEncoding]; + + [fileManager release]; + } + else + { + CFlash_Path.clear(); + CFlash_Mode = ADDON_CFLASH_MODE_RomPath; + } +} + +- (NSURL *) mpcfFileSearchURL +{ + return [NSURL fileURLWithPath:[NSString stringWithCString:CFlash_Path.c_str() encoding:NSUTF8StringEncoding]]; +} + +- (void) setGbaCartridgeURL:(NSURL *)fileURL +{ + if (fileURL != nil) + { + GBACartridge_RomPath = [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]; + } + else + { + GBACartridge_RomPath.clear(); + } +} + +- (NSURL *) gbaCartridgeURL +{ + return [NSURL fileURLWithPath:[NSString stringWithCString:GBACartridge_RomPath.c_str() encoding:NSUTF8StringEncoding]]; +} + +- (void) setGbaSRamURL:(NSURL *)fileURL +{ + if (fileURL != nil) + { + GBACartridge_SRAMPath = [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]; + } + else + { + GBACartridge_SRAMPath.clear(); + } +} + +- (NSURL *) gbaSRamURL; +{ + return [NSURL fileURLWithPath:[NSString stringWithCString:GBACartridge_SRAMPath.c_str() encoding:NSUTF8StringEncoding]]; +} + +- (BOOL) doesGbaCartridgeSaveExist +{ + return NO; +} + +- (void) setPaddleValue:(UInt16)value +{ + nds.paddle = value; +} + +- (UInt16) paddleValue +{ + return nds.paddle; +} + +- (CocoaDSSlot2Device *) autoSelectedDevice +{ + return [self findDeviceByType:slot2_DetermineType()]; +} + +- (NSString *) autoSelectedDeviceName +{ + return [[self autoSelectedDevice] name]; +} + +- (CocoaDSSlot2Device *) findDeviceByType:(NDS_SLOT2_TYPE)theType +{ + CocoaDSSlot2Device *foundDevice = nil; + + for (CocoaDSSlot2Device *theDevice in deviceList) + { + if (theType == [theDevice type]) + { + foundDevice = theDevice; + return foundDevice; + } + } + + return foundDevice; +} + +- (void) setDeviceByType:(NDS_SLOT2_TYPE)theType +{ + CocoaDSSlot2Device *theDevice = [self findDeviceByType:theType]; + if (theDevice != nil) + { + [self setCurrentDevice:theDevice]; + } + else + { + // If no devices are found, just set it to NDS_SLOT2_NONE by default. + slot2_Change(NDS_SLOT2_NONE); + } +} + +- (void) updateDeviceList +{ + BOOL didSelectDevice = NO; + + [deviceList removeAllObjects]; + + for (size_t i = 0; i < NDS_SLOT2_COUNT; i++) + { + ISlot2Interface *theDevice = slot2_List[i]; + if (theDevice == NULL) + { + continue; + } + + // Create a new device wrapper object and add it to the device list. + CocoaDSSlot2Device *newCdsDevice = [[[CocoaDSSlot2Device alloc] initWithDeviceData:theDevice] autorelease]; + [deviceList addObject:newCdsDevice]; + + // Only enable the SLOT-2 devices that are ready for end-user usage, and leave + // the remaining devices disabled for the time being. + const NDS_SLOT2_TYPE deviceType = [newCdsDevice type]; + + struct Slot2DeviceProperties + { + NDS_SLOT2_TYPE typeID; + BOOL isSupported; + }; + + static const Slot2DeviceProperties deviceTypesList[] = { + { NDS_SLOT2_NONE, YES }, + { NDS_SLOT2_AUTO, YES }, + { NDS_SLOT2_CFLASH, YES }, + { NDS_SLOT2_RUMBLEPAK, YES }, + { NDS_SLOT2_GBACART, YES }, + { NDS_SLOT2_GUITARGRIP, NO }, + { NDS_SLOT2_EXPMEMORY, YES }, + { NDS_SLOT2_EASYPIANO, NO }, + { NDS_SLOT2_PADDLE, YES }, + { NDS_SLOT2_PASSME, YES } + }; + + Slot2DeviceProperties *supportedDeviceTypesList = (Slot2DeviceProperties *)calloc(NDS_SLOT2_COUNT, sizeof(Slot2DeviceProperties)); + memcpy(supportedDeviceTypesList, deviceTypesList, sizeof(deviceTypesList)); + + for (size_t j = 0; j < NDS_SLOT2_COUNT; j++) + { + if (deviceType == supportedDeviceTypesList[j].typeID) + { + [newCdsDevice setEnabled:supportedDeviceTypesList[j].isSupported]; + break; + } + } + + free(supportedDeviceTypesList); + supportedDeviceTypesList = NULL; + + // If the new device is the current device, select it. + if (!didSelectDevice && [newCdsDevice type] == slot2_GetCurrentType()) + { + [self setCurrentDevice:newCdsDevice]; + didSelectDevice = YES; + } + } + + if (!didSelectDevice) + { + slot2_Change(NDS_SLOT2_NONE); + } +} + +- (void) updateStatus +{ + const NDS_SLOT2_TYPE theType = ([self currentDevice] != nil) ? [currentDevice type] : NDS_SLOT2_NONE; + + switch (theType) + { + case NDS_SLOT2_NONE: + [self setSlot2StatusText:NSSTRING_STATUS_SLOT2_LOADED_NONE]; + break; + + case NDS_SLOT2_AUTO: + [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_AUTOMATIC, [self autoSelectedDeviceName]]]; + break; + + case NDS_SLOT2_CFLASH: + { + switch (CFlash_Mode) + { + case ADDON_CFLASH_MODE_Path: + [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_MPCF_DIRECTORY, CFlash_Path.c_str()]]; + break; + + case ADDON_CFLASH_MODE_File: + [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_MPCF_DISK_IMAGE, CFlash_Path.c_str()]]; + break; + + case ADDON_CFLASH_MODE_RomPath: + [self setSlot2StatusText:NSSTRING_STATUS_SLOT2_LOADED_MPCF_WITH_ROM]; + break; + + default: + break; + } + break; + } + + case NDS_SLOT2_GBACART: + { + [self setSlot2StatusText:(GBACartridge_SRAMPath.empty()) ? NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_NO_SRAM : [NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_GBA_CART_WITH_SRAM, GBACartridge_SRAMPath.c_str()]]; + break; + } + + case NDS_SLOT2_RUMBLEPAK: + case NDS_SLOT2_GUITARGRIP: + case NDS_SLOT2_EXPMEMORY: + case NDS_SLOT2_EASYPIANO: + case NDS_SLOT2_PADDLE: + case NDS_SLOT2_PASSME: + [self setSlot2StatusText:[NSString stringWithFormat:NSSTRING_STATUS_SLOT2_LOADED_GENERIC_DEVICE, [[self currentDevice] name]]]; + break; + + default: + [self setSlot2StatusText:NSSTRING_STATUS_SLOT2_LOADED_UNKNOWN]; + break; + } +} + +@end + +void OSXSendForceFeedbackState(bool enable) +{ + NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; + + NSDictionary *ffProperties = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:enable], @"ffState", + [NSNumber numberWithInteger:RUMBLE_ITERATIONS_RUMBLE_PAK], @"iterations", + nil]; + + [[NSNotificationCenter defaultCenter] postNotificationName:@"org.desmume.DeSmuME.sendForceFeedback" + object:nil + userInfo:ffProperties]; + + [tempPool release]; +} diff --git a/desmume/src/cocoa/images/Image_MemoryExpansionPak.png b/desmume/src/cocoa/images/Image_MemoryExpansionPak.png new file mode 100644 index 000000000..17735fc77 Binary files /dev/null and b/desmume/src/cocoa/images/Image_MemoryExpansionPak.png differ diff --git a/desmume/src/cocoa/images/Image_PaddleController.png b/desmume/src/cocoa/images/Image_PaddleController.png new file mode 100644 index 000000000..b5deef76f Binary files /dev/null and b/desmume/src/cocoa/images/Image_PaddleController.png differ diff --git a/desmume/src/cocoa/images/Image_PassME.png b/desmume/src/cocoa/images/Image_PassME.png new file mode 100644 index 000000000..20f9d091d Binary files /dev/null and b/desmume/src/cocoa/images/Image_PassME.png differ diff --git a/desmume/src/cocoa/images/Image_Piano.png b/desmume/src/cocoa/images/Image_Piano.png new file mode 100644 index 000000000..5549d6dee Binary files /dev/null and b/desmume/src/cocoa/images/Image_Piano.png differ diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.strings b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings index 9135f1166..a73b9d026 100644 Binary files a/desmume/src/cocoa/translations/English.lproj/MainMenu.strings and b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings differ diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.xib b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib index 9d4fe441d..f709c6693 100644 --- a/desmume/src/cocoa/translations/English.lproj/MainMenu.xib +++ b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib @@ -12,6 +12,8 @@ YES + + YES @@ -675,6 +677,14 @@ + + + Show SLOT-2 Manager... + + 2147483647 + + + ROM Save Type @@ -2678,9 +2688,11 @@ {1.7976931348623157e+308, 1.7976931348623157e+308} - + 256 {400, 100} + + {{0, 0}, {1920, 1178}} {1.7976931348623157e+308, 1.7976931348623157e+308} @@ -2688,7 +2700,7 @@ YES - + 268 YES @@ -2707,6 +2719,7 @@ 268 {{175, 50}, {199, 21}} + YES 613417024 @@ -2725,6 +2738,7 @@ 268 {{376, 43}, {96, 32}} + YES 67108864 @@ -2746,6 +2760,7 @@ 268 {{15, 53}, {155, 17}} + YES 68157504 @@ -2763,6 +2778,7 @@ 268 {{15, 14}, {454, 28}} + YES 69206017 @@ -2779,10 +2795,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 81}} + {{17, 16}, {486, 97}} + {0, 0} 67108864 @@ -2821,6 +2839,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{148, 14}, {226, 21}} + YES 613417024 @@ -2839,6 +2858,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{376, 7}, {96, 32}} + YES 67108864 @@ -2860,6 +2880,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{15, 17}, {128, 17}} + YES 68157504 @@ -2875,10 +2896,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 45}} + {{17, 117}, {486, 61}} + {0, 0} 67108864 @@ -2912,6 +2935,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{92, 12}, {314, 18}} + YES 67108864 @@ -2940,6 +2964,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{141, 33}, {217, 32}} + YES 67108864 @@ -2959,10 +2984,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 75}} + {{17, 182}, {486, 91}} + {0, 0} 67108864 @@ -2996,6 +3023,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{16, 40}, {366, 18}} + YES -2080374784 @@ -3019,6 +3047,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{16, 84}, {247, 18}} + YES -2080374784 @@ -3042,6 +3071,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{273, 10}, {196, 26}} + YES -2076180416 @@ -3137,6 +3167,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{15, 16}, {256, 17}} + _NS:4068 YES @@ -3156,6 +3187,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{16, 62}, {216, 18}} + _NS:682 YES @@ -3179,10 +3211,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 109}} + {{17, 277}, {486, 125}} + {0, 0} 67108864 @@ -3203,10 +3237,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {520, 422} + + NSView - + 268 YES @@ -3215,6 +3251,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{97, 463}, {96, 17}} + YES 68157504 @@ -3232,6 +3269,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{195, 457}, {265, 26}} + YES -2076180416 @@ -3292,6 +3330,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{462, 457}, {116, 26}} + YES -2076180416 @@ -3435,6 +3474,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA256 {640, 394} + YES NO YES @@ -3443,6 +3483,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA256 {640, 17} + @@ -3450,6 +3491,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA-2147483392 {{584, 0}, {16, 17}} + YES @@ -3640,6 +3682,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 17}, {640, 394}} + @@ -3650,6 +3693,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA-2147483392 {{584, 17}, {15, 102}} + NO _doScroller: @@ -3660,6 +3704,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA-2147483392 {{1, 420}, {624, 15}} + NO 1 @@ -3675,6 +3720,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 0}, {640, 17}} + @@ -3684,12 +3730,14 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{-1, 37}, {642, 412}} + 133682 + QSAAAEEgAABBmAAAQZgAAA 0.25 4 @@ -3699,6 +3747,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{197, 12}, {247, 17}} + YES 605028416 @@ -3717,10 +3766,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {640, 495} + + InputPrefsView - + 268 YES @@ -3729,6 +3780,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA12 {{13, 10}, {463, 401}} + YES @@ -3753,6 +3805,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{72, 44}, {84, 17}} + YES 68157504 @@ -3770,6 +3823,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{44, 16}, {112, 17}} + YES 68157504 @@ -3787,6 +3841,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{158, 38}, {126, 26}} + YES -2076180416 @@ -3879,6 +3934,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{289, 14}, {72, 22}} + YES -1804599231 @@ -3970,6 +4026,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{63, 72}, {93, 17}} + YES 68157504 @@ -3987,6 +4044,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{158, 66}, {126, 26}} + YES -2076180416 @@ -4055,6 +4113,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{158, 11}, {126, 26}} + YES -2076180416 @@ -4156,10 +4215,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {429, 100}} + {{6, 206}, {431, 116}} + {0, 0} 67108864 @@ -4203,6 +4264,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{18, 14}, {100, 38}} + YES NO 2 @@ -4396,10 +4458,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {194, 62}} + {{15, 53}, {196, 78}} + {0, 0} 67108864 @@ -4433,6 +4497,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {150, 38}} + YES NO 2 @@ -4624,10 +4689,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {194, 62}} + {{218, 53}, {196, 78}} + {0, 0} 67108864 @@ -4651,6 +4718,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 18}, {126, 17}} + YES 68157504 @@ -4668,6 +4736,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{339, 16}, {72, 22}} + YES -1804599231 @@ -4750,6 +4819,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{144, 12}, {189, 26}} + YES -2080112384 @@ -4772,6 +4842,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{305, 38}, {38, 11}} + YES 68157504 @@ -4793,6 +4864,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{263, 38}, {38, 11}} + YES 68157504 @@ -4810,6 +4882,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{220, 38}, {38, 11}} + YES 68157504 @@ -4827,6 +4900,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{178, 38}, {38, 11}} + YES 68157504 @@ -4844,6 +4918,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{137, 38}, {38, 11}} + YES 68157504 @@ -4859,10 +4934,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {429, 141}} + {{6, 45}, {431, 157}} + {0, 0} 67108864 @@ -4884,6 +4961,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{10, 33}, {443, 355}} + Display Views @@ -5885,10 +5963,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {489, 425} + + NSView - + 268 YES @@ -5897,6 +5977,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{163, 329}, {220, 26}} + YES -2076180416 @@ -5955,6 +6036,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 335}, {144, 17}} + YES 68157504 @@ -5982,6 +6064,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {148, 18}} + YES -2080374784 @@ -6003,10 +6086,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {364, 38}} + {{17, 209}, {366, 54}} + {0, 0} 67108864 @@ -6040,6 +6125,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 15}, {180, 46}} + YES NO 2 @@ -6234,6 +6320,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{145, 10}, {204, 26}} + YES -2076180416 @@ -6302,10 +6389,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {364, 71}} + {{17, 16}, {366, 87}} + {0, 0} 67108864 @@ -6339,6 +6428,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {328, 58}} + YES NO 3 @@ -6544,10 +6634,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {364, 82}} + {{17, 107}, {366, 98}} + {0, 0} 67108864 @@ -6581,6 +6673,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{44, 13}, {246, 21}} + YES 67371264 @@ -6603,6 +6696,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{293, 17}, {56, 17}} + YES 68157504 @@ -6694,6 +6788,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{18, 14}, {20, 20}} + YES 134217728 @@ -6713,10 +6808,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {364, 44}} + {{17, 267}, {366, 60}} + {0, 0} 67108864 @@ -6737,10 +6834,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {400, 373} + + NSView - + 268 YES @@ -6749,6 +6848,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 12 {{13, 10}, {528, 349}} + YES @@ -6773,6 +6873,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 32}, {197, 18}} + YES -2080374784 @@ -6796,6 +6897,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {217, 18}} + YES 67108864 @@ -6817,10 +6919,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 58}} + {{6, 229}, {496, 74}} + {0, 0} 67108864 @@ -6854,6 +6958,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {165, 38}} + YES NO 2 @@ -7047,6 +7152,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{243, 15}, {72, 17}} + YES 68157504 @@ -7064,6 +7170,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{320, 13}, {50, 22}} + YES -1804599231 @@ -7140,6 +7247,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{371, 10}, {19, 27}} + YES 67895328 @@ -7157,10 +7265,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 62}} + {{6, 147}, {496, 78}} + {0, 0} 67108864 @@ -7194,6 +7304,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 32}, {145, 18}} + YES 67108864 @@ -7217,6 +7328,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {118, 18}} + YES 67108864 @@ -7238,10 +7350,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 58}} + {{6, 69}, {496, 74}} + {0, 0} 67108864 @@ -7275,6 +7389,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {462, 18}} + YES -2080374784 @@ -7296,10 +7411,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 38}} + {{6, 11}, {496, 54}} + {0, 0} 67108864 @@ -7321,6 +7438,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{10, 33}, {508, 303}} + General Settings @@ -7730,6 +7848,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {554, 373} + + NSView @@ -8678,7 +8798,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{17, 230}, {566, 17}} + {{17, 230}, {586, 17}} YES @@ -8969,7 +9089,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{18, 202}, {314, 18}} + {{18, 202}, {206, 18}} YES @@ -9556,7 +9676,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{17, 123}, {316, 17}} + {{17, 123}, {425, 17}} YES @@ -10307,6 +10427,268 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {1.7976931348623157e+308, 1.7976931348623157e+308} YES + + 1 + 2 + {{235, 310}, {350, 249}} + 1685586944 + InputSettingsPaddleController + NSWindow + + + {1.7976931348623157e+308, 1.7976931348623157e+308} + + + 256 + + YES + + + 268 + {{17, 212}, {316, 17}} + + YES + + 70254657 + 272634880 + + + Device Info Summary + + + + + NO + + + + 12 + + YES + + + 274 + + YES + + + 268 + {{115, 16}, {71, 17}} + + _NS:4068 + YES + + 68157504 + -2076175360 + + + + + YES + + YES + allowsFloats + formatterBehavior + locale + negativeFormat + negativeInfinitySymbol + negativePrefix + nilSymbol + positiveFormat + positiveInfinitySymbol + positivePrefix + zeroSymbol + + + YES + + + + # + -∞ + - + + # + +∞ + + + 0 + + + # + # + + + + 0 + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + %d + _NS:4068 + + + + + NO + + + + 268 + {{189, 11}, {19, 27}} + + _NS:4123 + YES + + -2146697184 + 0 + _NS:4123 + + 1 + -50 + 50 + 1 + YES + + NO + + + {{1, 1}, {314, 46}} + + + + {{17, 56}, {316, 62}} + + {0, 0} + + 67108864 + 0 + Paddle Adjustment + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{17, 126}, {316, 56}} + + YES + + 67108864 + 272760832 + Direct control of the paddle requires an analog input. If this setting is disabled, then this input will use the paddle adjustment value instead. + + + + + + NO + + + + 268 + {{18, 188}, {134, 18}} + + _NS:682 + YES + + -2080374784 + 0 + Use direct control + + _NS:682 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 268 + {{240, 12}, {96, 32}} + + 1 + YES + + 67108864 + 134217728 + OK + + + -2038284288 + 129 + + DQ + 200 + 25 + + NO + + + + 268 + {{144, 12}, {96, 32}} + + YES + + 67108864 + 134217728 + Cancel + + + -2038284288 + 129 + + Gw + 200 + 25 + + NO + + + {350, 249} + _NS:122 + + {{0, 0}, {1920, 1178}} + {1.7976931348623157e+308, 1.7976931348623157e+308} + NO + 1 2 @@ -12029,7 +12411,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - {{297, 16}, {326, 444}} + {{297, 16}, {326, 444.1875}} {0, 0} @@ -13994,13 +14376,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2 {{235, 204}, {640, 355}} 1685586944 - SLOT-1 Manager + SLOT-1 (NDS Slot) Manager NSWindow {1.7976931348623157e+308, 1.7976931348623157e+308} - + 256 YES @@ -14009,6 +14391,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{14, 12}, {168, 32}} + YES 67108864 @@ -14030,6 +14413,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{181, 22}, {105, 17}} + YES 68157504 @@ -14047,6 +14431,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 12 {{12, 51}, {616, 5}} + {0, 0} 67108864 @@ -14069,6 +14454,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{288, 22}, {330, 17}} + YES 70254657 @@ -14097,6 +14483,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {260, 128}} + YES NO 5 @@ -14329,6 +14716,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{85, 15}, {409, 21}} + YES 78643265 @@ -14348,6 +14736,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{496, 8}, {96, 32}} + YES 67108864 @@ -14369,6 +14758,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 150}, {482, 28}} + YES 67108864 @@ -14389,6 +14779,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{496, 146}, {96, 32}} + YES 67108864 @@ -14408,10 +14799,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {604, 188}} + {{17, 140}, {606, 204}} + {0, 0} 67108864 @@ -14457,6 +14850,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{18, 16}, {30, 30}} + YES 134217728 @@ -14475,6 +14869,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{50, 18}, {168, 28}} + YES 69206017 @@ -14492,6 +14887,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1292 {{18, 14}, {32, 32}} + 28682 100 @@ -14500,6 +14896,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{220, 17}, {201, 26}} + YES -2076180416 @@ -14606,10 +15003,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {604, 56}} + {{17, 64}, {606, 72}} + {0, 0} 67108864 @@ -14630,12 +15029,1686 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {640, 355} + + {{0, 0}, {1920, 1178}} {1.7976931348623157e+308, 1.7976931348623157e+308} Slot1ManagerWindow YES + + 7 + 2 + {{235, 111}, {640, 448}} + 1685586944 + SLOT-2 (GBA Slot) Manager + NSWindow + + + {1.7976931348623157e+308, 1.7976931348623157e+308} + + + 256 + + YES + + + 268 + + YES + + + 2304 + + YES + + + 256 + {188, 304} + + _NS:1843 + YES + NO + YES + + + 256 + {188, 17} + + + + + + -2147483392 + {{224, 0}, {16, 17}} + + _NS:1848 + + + YES + + 185 + 40 + 1000 + + 75497536 + 2048 + SLOT-2 Device Type + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 337641536 + 2048 + Text Cell + + + + + + 1 + YES + + + + 3 + 2 + + + 17 + 46137344 + + + 4 + 15 + 0 + YES + 0 + 1 + + + {{1, 17}, {188, 304}} + + + _NS:1841 + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + _NS:1860 + NO + + _doScroller: + 0.99723756906077343 + + + + -2147483392 + {{1, 306}, {188.95703125, 15}} + + _NS:1862 + NO + 1 + + _doScroller: + 0.9943820224719101 + + + + 2304 + + YES + + + {{1, 0}, {188, 17}} + + + + + 4 + + + + {{20, 106}, {190, 322}} + + + _NS:1839 + 133682 + + + + + + QSAAAEEgAABBmAAAQZgAAA + 0.25 + 4 + 1 + + + + 12 + + YES + + + 274 + + YES + + + 268 + {{3, 4}, {400, 320}} + + _NS:1109 + NSView + + + {{1, 1}, {406, 326}} + + _NS:21 + + + {{215, 102}, {408, 328}} + + _NS:18 + {0, 0} + + 67108864 + 0 + Device Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 0 + NO + + + + 268 + {{530, 12}, {96, 32}} + + _NS:610 + YES + + 67108864 + 134217728 + Apply + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 12 + + YES + + + 274 + + YES + + + 268 + {{15, 14}, {482, 42}} + + _NS:3939 + YES + + 69206017 + 272760832 + + + slot2StatusText + _NS:3939 + + + + + NO + + + {{1, 1}, {512, 66}} + + _NS:21 + + + {{17, 16}, {514, 82}} + + _NS:18 + {0, 0} + + 67108864 + 0 + GBA Slot Status + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {640, 448} + + _NS:122 + + {{0, 0}, {1920, 1178}} + {1.7976931348623157e+308, 1.7976931348623157e+308} + Slot2ManagerWindow + NO + + + Slot2WindowDelegate + + + + 268 + + YES + + + 268 + {{17, 152}, {366, 17}} + + _NS:3939 + YES + + 67108864 + 138674176 + This device is unsupported at this time. + + _NS:3939 + + + + + NO + + + {400, 320} + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{17, 45}, {366, 56}} + + + _NS:3939 + YES + + 67108864 + 272760832 + Note: If a game is dependent on having a particular SLOT-2 device loaded, then removing the device while the game is running may cause the game to fail. + + _NS:3939 + + + + + NO + + + + 268 + {{17, 109}, {366, 56}} + + + _NS:3939 + YES + + 67108864 + 272760832 + When a ROM is loading, this setting prevents any SLOT-2 device from being loaded into the GBA slot. If a ROM is already loaded, this setting removes any previously loaded SLOT-2 device. + + _NS:3939 + + + + + NO + + + + 268 + {{17, 20}, {366, 17}} + + + _NS:3939 + YES + + 67108864 + 138674176 + No additional configuration required. + + _NS:3939 + + + + + NO + + + {400, 320} + + + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{17, 45}, {366, 56}} + + _NS:3939 + YES + + 67108864 + 272760832 + Note: This is not an actual device. Rather, this setting will automatically select a SLOT-2 device depending on the loaded ROM, and then load the device as the ROM loads. + + _NS:3939 + + + + + NO + + + + 268 + {{187, 126}, {196, 17}} + + _NS:4068 + YES + + 70254657 + 4199424 + + + SLOT-2 Device Name + _NS:4068 + + + + + NO + + + + 268 + {{17, 126}, {168, 17}} + + _NS:4068 + YES + + 68157504 + 71304192 + Selected SLOT-2 Device: + + _NS:4068 + + + + + NO + + + + 268 + {{153, 283}, {230, 17}} + + _NS:4068 + YES + + 68157504 + 272630784 + Currently Loaded ROM + + _NS:4068 + + + + + NO + + + + 12 + {{12, 149}, {376, 5}} + + _NS:2429 + {0, 0} + + 67108864 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + + 268 + {{68, 220}, {32, 32}} + + 28682 + 100 + + + + 265 + {{165, 241}, {218, 34}} + + YES + + 69206017 + 272633856 + TmFtZToKU2VyaWFsOg + + + + + + NO + + + + 265 + + YES + + YES + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + + {{20, 172}, {128, 128}} + + YES + + 134217728 + 33554432 + + 0 + 3 + 0 + NO + + NO + YES + + + + 268 + {{17, 20}, {366, 17}} + + _NS:3939 + YES + + 67108864 + 138674176 + No additional configuration required. + + _NS:3939 + + + + + NO + + + {400, 320} + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{17, 283}, {366, 17}} + + + _NS:4068 + YES + + 68157504 + 272630784 + Search for files at this location: + + _NS:4068 + + + + + NO + + + + 268 + {{17, 251}, {366, 26}} + + + _NS:791 + YES + + -2076180416 + 2048 + + _NS:791 + + 109199360 + 129 + + + 400 + 75 + + + Same folder as the loaded ROM + + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + YES + YES + + + 2147483647 + + + _popUpItemAction: + + + + + YES + Custom folder + + 2147483647 + + + _popUpItemAction: + 1 + + + + + Choose a folder... + + 2147483647 + + + + _popUpItemAction: + 10000 + + + + + YES + YES + + + 2147483647 + + + _popUpItemAction: + + + + + YES + Custom disk image + + 2147483647 + + + _popUpItemAction: + 2 + + + + + Choose a disk image... + + 2147483647 + + + + _popUpItemAction: + 10001 + + + + + + 1 + YES + YES + 2 + + NO + + + {400, 320} + + + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{17, 286}, {366, 14}} + + + _NS:4068 + YES + + 68157504 + 272761856 + Enable rumble for the selected input devices: + + _NS:4068 + + + + + NO + + + + 268 + + YES + + + 2304 + + YES + + + 256 + + YES + + {358, 156} + + + _NS:1843 + YES + NO + YES + + + 256 + {358, 17} + + + + + + + -2147483392 + {{224, 0}, {16, 17}} + + + _NS:1848 + + + YES + + 30 + 30 + 1000 + + 75497536 + 2048 + + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 68157504 + 1024 + + + _NS:1912 + + 1214533888 + 2 + + + + + 200 + 25 + + YES + + + + 317.5234375 + 40 + 1000 + + 75497536 + 2048 + Input Device + + + + + + 338690112 + 1024 + Text Cell + + + + + + 3 + YES + + + + 3 + 2 + + + 17 + 1386217472 + + + 0 + 15 + 0 + NO + 0 + 1 + + + {{1, 17}, {358, 156}} + + + + _NS:1841 + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + + _NS:1860 + NO + + _doScroller: + 0.90625 + + + + -2147483392 + {{1, 162}, {358, 15}} + + + _NS:1862 + NO + 1 + + _doScroller: + 1 + 0.97814207650273222 + + + + 2304 + + YES + + + {{1, 0}, {358, 17}} + + + + + + 4 + + + + {{20, 110}, {360, 174}} + + + + _NS:1839 + 133682 + + + + + + QSAAAEEgAABBmAAAQZgAAA + 0.25 + 4 + 1 + + + + 268 + {{267, 12}, {119, 32}} + + + _NS:610 + YES + + 67108864 + 134217728 + Test Rumble + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{17, 60}, {366, 42}} + + + _NS:3939 + YES + + 67108864 + 272760832 + Note: Rumble will only work for supported games. In addition, you must have a supported input device. To check if the selected input devices support rumble, click Test Rumble. + + _NS:3939 + + + + + NO + + + {400, 320} + + + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{142, 113}, {144, 32}} + + _NS:610 + YES + + 67108864 + 134217728 + Clear SRAM Path + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{286, 113}, {100, 32}} + + _NS:610 + YES + + 67108864 + 134217728 + Choose... + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{20, 149}, {360, 22}} + + _NS:817 + YES + + -2068840383 + 272630784 + + + File Path + _NS:817 + + YES + + + + NO + + + + 268 + {{17, 179}, {100, 17}} + + _NS:4068 + YES + + 68157504 + 272630784 + GBA SRAM File: + + _NS:4068 + + + + + NO + + + + 12 + {{12, 202}, {376, 5}} + + _NS:2429 + {0, 0} + + 67108864 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + + 268 + {{286, 217}, {100, 32}} + + _NS:610 + YES + + 67108864 + 134217728 + Choose... + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{20, 253}, {360, 22}} + + _NS:817 + YES + + -2068840383 + 272630784 + + + File Path + _NS:817 + + YES + + + + NO + + + + 268 + {{17, 283}, {157, 17}} + + _NS:4068 + YES + + 68157504 + 272630784 + GBA ROM Cartridge File: + + _NS:4068 + + + + + NO + + + {400, 320} + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{101, 60}, {282, 28}} + + + _NS:3939 + YES + + 67108864 + 272760832 + This is an input device. You can set up this device through your Input Preferences. + + _NS:3939 + + + + + NO + + + + 268 + {{236, 12}, {150, 32}} + + + _NS:610 + YES + + 67108864 + 134217728 + Input Preferences + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{101, 232}, {282, 68}} + + + _NS:3939 + YES + + 67108864 + 272629760 + You can control the guitar grip by clicking the onscreen buttons. You can also map inputs to the guitar grip controls through your Input Preferences. + + _NS:3939 + + + + + NO + + + + 268 + {{18, 23}, {68, 70}} + + + _NS:2337 + YES + + 67108864 + 134217728 + + + LucidaGrande + 10 + 16 + + _NS:2337 + + -2033958912 + 130 + + + + 400 + 75 + + NO + + + + 268 + {{18, 95}, {68, 70}} + + + _NS:2337 + YES + + 67108864 + 134217728 + + + _NS:2337 + + -2033958912 + 130 + + + + 400 + 75 + + NO + + + + 268 + {{18, 167}, {68, 70}} + + + _NS:2337 + YES + + 67108864 + 134217728 + + + _NS:2337 + + -2033958912 + 130 + + + + 400 + 75 + + NO + + + + 268 + {{18, 239}, {68, 70}} + + + _NS:2337 + YES + + 67108864 + 134217728 + + + _NS:2337 + + -2033958912 + 130 + + + + 400 + 75 + + NO + + + {400, 320} + + + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + + YES + + YES + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + + {{11, 104}, {360, 136}} + + + _NS:2165 + YES + + 67108864 + 33816576 + + NSImage + Image_MemoryExpansionPak + + + _NS:2165 + 0 + 3 + 0 + NO + + NO + YES + + + + 268 + {{17, 20}, {366, 17}} + + + _NS:3939 + YES + + 67108864 + 138674176 + No additional configuration required. + + _NS:3939 + + + + + NO + + + {400, 320} + + + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{17, 60}, {366, 28}} + + + _NS:3939 + YES + + 67108864 + 272760832 + This is an input device. You can set up this device through your Input Preferences. + + _NS:3939 + + + + + NO + + + + 268 + {{125, 12}, {150, 32}} + + + _NS:610 + YES + + 67108864 + 134217728 + Input Preferences + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + + YES + + YES + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + + {{25, 100}, {350, 200}} + + + _NS:2165 + YES + + 0 + 33554432 + + NSImage + Image_Piano + + _NS:2165 + 0 + 0 + 0 + NO + + NO + YES + + + {400, 320} + + + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + {{124, 12}, {150, 32}} + + + _NS:610 + YES + + 67108864 + 134217728 + Input Preferences + + _NS:610 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + + YES + + YES + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + + {{51, 96}, {297, 204}} + + + _NS:2165 + YES + + 0 + 33554432 + + NSImage + Image_PaddleController + + _NS:2165 + 0 + 3 + 0 + NO + + NO + YES + + + + 268 + {{17, 60}, {366, 28}} + + + _NS:3939 + YES + + 67108864 + 272760832 + This is an input device. You can set up this device through your Input Preferences. + + _NS:3939 + + + + + NO + + + {400, 320} + + + _NS:1109 + NSView + + + + 268 + + YES + + + 268 + + YES + + YES + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + + {{60, 70}, {279, 214}} + + _NS:2165 + YES + + 67108864 + 33816576 + + NSImage + Image_PassME + + + _NS:2165 + 0 + 3 + 0 + NO + + NO + YES + + + + 268 + {{17, 20}, {366, 17}} + + _NS:3939 + YES + + 67108864 + 138674176 + No additional configuration required. + + _NS:3939 + + + + + NO + + + {400, 320} + _NS:1109 + NSView + 279 2 @@ -23073,6 +25146,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA useInputForScalar useInputForSender deviceInfoSummary + isElementAnalog YES @@ -23129,6 +25203,57 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA YES + + + YES + slot2StatusText + autoSelectedDeviceText + mpcfFolderName + mpcfFolderPath + mpcfDiskImageName + mpcfDiskImagePath + gbaCartridgeName + gbaCartridgePath + deviceManager.slot2StatusText + gbaSRamName + gbaSRamPath + + Slot2WindowDelegate + YES + + + + + YES + name + description + deviceID + type + enabled + + CocoaSlot2Device + YES + + YES + YES + YES + + + + YES + supportsForceFeedback + isForceFeedbackEnabled + manufacturerName + productName + serialNumber + + InputHIDDevice + YES + + YES + YES + YES + YES @@ -23256,30 +25381,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1103 - - - showGeneralView: - - - - 1683 - - - - showDisplayView: - - - - 1684 - - - - showInputView: - - - - 1685 - window @@ -23416,14 +25517,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2251 - - - showSoundView: - - - - 2252 - updateVolumeIcon: @@ -23504,14 +25597,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2380 - - - showEmulationView: - - - - 2381 - selectSPUSyncMode: @@ -32878,6 +34963,866 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 8330 + + + makeKeyAndOrderFront: + + + + 8353 + + + + delegate + + + + 8357 + + + + deviceListController + + + + 8358 + + + + deviceListTable + + + + 8360 + + + + delegate + + + + 8361 + + + + applySettings: + + + + 8362 + + + + value: arrangedObjects.name + + + + + + value: arrangedObjects.name + value + arrangedObjects.name + + NSAllowsEditingMultipleValuesSelection + + + 2 + + + 8464 + + + + viewAuto + + + + 8465 + + + + viewCompactFlash + + + + 8466 + + + + viewGBACartridge + + + + 8467 + + + + viewGuitarGrip + + + + 8468 + + + + viewMemoryExpansionPack + + + + 8469 + + + + viewNone + + + + 8470 + + + + viewPaddleController + + + + 8471 + + + + viewPassME + + + + 8472 + + + + viewPiano + + + + 8473 + + + + viewRumblePak + + + + 8474 + + + + viewNoSelection + + + + 8475 + + + + deviceSettingsBox + + + + 8476 + + + + enabled: arrangedObjects.enabled + + + + + + enabled: arrangedObjects.enabled + enabled + arrangedObjects.enabled + 2 + + + 8506 + + + + enabled: selection.enabled + + + + + + enabled: selection.enabled + enabled + selection.enabled + 2 + + + 8508 + + + + slot2Window + + + + 8509 + + + + window + + + + 8510 + + + + value: arrangedObjects.isForceFeedbackEnabled + + + + + + value: arrangedObjects.isForceFeedbackEnabled + value + arrangedObjects.isForceFeedbackEnabled + 2 + + + 8528 + + + + value: arrangedObjects.productName + + + + + + value: arrangedObjects.productName + value + arrangedObjects.productName + + NSConditionallySetsEditable + + + 2 + + + 8529 + + + + enabled: arrangedObjects.supportsForceFeedback + + + + + + enabled: arrangedObjects.supportsForceFeedback + enabled + arrangedObjects.supportsForceFeedback + 2 + + + 8530 + + + + enabled: arrangedObjects.supportsForceFeedback + + + + + + enabled: arrangedObjects.supportsForceFeedback + enabled + arrangedObjects.supportsForceFeedback + 2 + + + 8531 + + + + inputDeviceListController + + + + 8532 + + + + testRumble: + + + + 8533 + + + + enabled: selection.mpcfDiskImagePath + + + + + + enabled: selection.mpcfDiskImagePath + enabled + selection.mpcfDiskImagePath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 8543 + + + + content + + + + 8549 + + + + title: selection.mpcfDiskImageName + + + + + + title: selection.mpcfDiskImageName + title + selection.mpcfDiskImageName + 2 + + + 8551 + + + + viewUnsupported + + + + 8555 + + + + enabled: selection.isRomLoading + + + + + + enabled: selection.isRomLoading + enabled + selection.isRomLoading + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 8564 + + + + animate: selection.isRomLoading + + + + + + animate: selection.isRomLoading + animate + selection.isRomLoading + 2 + + + 8565 + + + + value: selection.romNameAndSerialInfo + + + + + + value: selection.romNameAndSerialInfo + value + selection.romNameAndSerialInfo + 2 + + + 8566 + + + + value: selection.iconImage + + + + + + value: selection.iconImage + value + selection.iconImage + 2 + + + 8567 + + + + slot2WindowController + + + + 8574 + + + + value: selection.autoSelectedDeviceText + + + + + + value: selection.autoSelectedDeviceText + value + selection.autoSelectedDeviceText + 2 + + + 8577 + + + + title: selection.mpcfFolderName + + + + + + title: selection.mpcfFolderName + title + selection.mpcfFolderName + 2 + + + 8586 + + + + mpcfFileSearchMenu + + + + 8587 + + + + selectedTag: values.Slot2_MPCF_PathOption + + + + + + selectedTag: values.Slot2_MPCF_PathOption + selectedTag + values.Slot2_MPCF_PathOption + 2 + + + 8589 + + + + chooseMPCFPath: + + + + 8593 + + + + chooseMPCFPath: + + + + 8594 + + + + chooseMPCFPath: + + + + 8595 + + + + value: selection.deviceInfoSummary + + + + + + value: selection.deviceInfoSummary + value + selection.deviceInfoSummary + 2 + + + 8600 + + + + value: selection.useInputForScalar + + + + + + value: selection.useInputForScalar + value + selection.useInputForScalar + 2 + + + 8634 + + + + inputSettingsPaddleController + + + + 8637 + + + + closeSettingsSheet: + + + + 8642 + + + + closeSettingsSheet: + + + + 8643 + + + + value: selection.intValue1 + + + + + + value: selection.intValue1 + value + selection.intValue1 + 2 + + + 8645 + + + + value: selection.intValue1 + + + + + + value: selection.intValue1 + value + selection.intValue1 + 2 + + + 8646 + + + + enabled: selection.useInputForScalar + + + + + + enabled: selection.useInputForScalar + enabled + selection.useInputForScalar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 8647 + + + + enabled: selection.useInputForScalar + + + + + + enabled: selection.useInputForScalar + enabled + selection.useInputForScalar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 8648 + + + + enabled: selection.isElementAnalog + + + + + + enabled: selection.isElementAnalog + enabled + selection.isElementAnalog + 2 + + + 8649 + + + + prefWindowDelegate + + + + 8650 + + + + showInputPreferences: + + + + 8659 + + + + showInputPreferences: + + + + 8662 + + + + showInputPreferences: + + + + 8665 + + + + toolbar + + + + 8666 + + + + changePrefView: + + + + 8671 + + + + changePrefView: + + + + 8672 + + + + changePrefView: + + + + 8673 + + + + changePrefView: + + + + 8674 + + + + changePrefView: + + + + 8675 + + + + value: selection.deviceManager.slot2StatusText + + + + + + value: selection.deviceManager.slot2StatusText + value + selection.deviceManager.slot2StatusText + 2 + + + 8676 + + + + value: selection.gbaCartridgeName + + + + + + value: selection.gbaCartridgeName + value + selection.gbaCartridgeName + 2 + + + 8702 + + + + value: selection.gbaSRamName + + + + + + value: selection.gbaSRamName + value + selection.gbaSRamName + 2 + + + 8703 + + + + chooseGbaCartridgePath: + + + + 8704 + + + + chooseGbaSRamPath: + + + + 8705 + + + + clearSRamPath: + + + + 8708 + + + + enabled: selection.mpcfFolderPath + + + + + + enabled: selection.mpcfFolderPath + enabled + selection.mpcfFolderPath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 8709 + + + + enabled: selection.gbaCartridgePath + + + + + + enabled: selection.gbaCartridgePath + enabled + selection.gbaCartridgePath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 8711 + + + + enabled: selection.gbaSRamPath + + + + + + enabled: selection.gbaSRamPath + enabled + selection.gbaSRamPath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 8713 + @@ -33223,6 +36168,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + @@ -44777,6 +47723,1134 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + 8331 + + + YES + + + + + + 8332 + + + YES + + + + + + + + + 8333 + + + YES + + + + + + + + + 8334 + + + + + 8335 + + + + + 8336 + + + YES + + + + + + 8338 + + + YES + + + + + + 8341 + + + + + 8343 + + + YES + + + + + + 8344 + + + + + 8351 + + + + + 8352 + + + + + 8354 + + + SLOT-2 Device Array Controller + + + 8345 + + + YES + + + + + + 8346 + + + + + 8356 + + + SLOT-2 Window Delegate + + + 8365 + + + YES + + + + + + 8363 + + + YES + + + + + + 8364 + + + + + 8366 + + + YES + + + + + + SLOT-2 None View + + + 8367 + + + YES + + + + + + 8368 + + + + + 8402 + + + YES + + + + + + + SLOT-2 Rumble Pak View + + + 8405 + + + YES + + + + + + + + + + + SLOT-2 GBA Cartridge View + + + 8369 + + + YES + + + + + SLOT-2 MPCF Flash Card View + + + 8377 + + + YES + + + + + + 8387 + + + YES + + + + + + 8388 + + + + + 8378 + + + YES + + + + + + 8379 + + + YES + + + + + + + + + + + + 8380 + + + + + 8381 + + + + + 8382 + + + + + 8383 + + + + + 8384 + + + + + 8385 + + + + + 8386 + + + + + 8408 + + + YES + + + + + + + + + + + + SLOT-2 Auto View + + + 8409 + + + YES + + + + + + 8410 + + + + + 8411 + + + YES + + + + + + 8412 + + + + + 8413 + + + YES + + + + + + 8414 + + + + + 8415 + + + YES + + + + + + 8416 + + + + + 8427 + + + + + 8428 + + + YES + + + + + + + + + + SLOT-2 Guitar Grip View + + + 8433 + + + YES + + + + + + 8434 + + + + + 8435 + + + YES + + + + + + 8436 + + + + + 8437 + + + YES + + + + + + 8438 + + + + + 8439 + + + YES + + + + + + 8440 + + + + + 8443 + + + YES + + + + + + 8444 + + + + + 8445 + + + YES + + + + + SLOT-2 Memory Expansion Pack View + + + 8446 + + + YES + + + + + + 8447 + + + + + 8448 + + + YES + + + + + + SLOT-2 Piano View + + + 8451 + + + YES + + + + + + SLOT-2 Paddle Controller View + + + 8454 + + + YES + + + + + SLOT-2 PassME View + + + 8455 + + + YES + + + + + + 8456 + + + + + 8457 + + + YES + + + + + + 8458 + + + + + 8477 + + + YES + + + + + + 8478 + + + + + 8499 + + + YES + + + + + + 8500 + + + + + 8501 + + + YES + + + + + + 8502 + + + + + 8512 + + + YES + + + + + + + + + 8513 + + + + + 8514 + + + + + 8515 + + + YES + + + + + + + 8517 + + + YES + + + + + + 8518 + + + YES + + + + + + 8519 + + + + + 8523 + + + + + 8524 + + + + + 8525 + + + YES + + + + + + 8526 + + + + + 8527 + + + Input Device List Array Controller + + + 8535 + + + SLOT-2 Window Controller + + + 8552 + + + YES + + + + SLOT-2 Unsupported View + + + 8553 + + + YES + + + + + + 8554 + + + + + 8557 + + + YES + + + + + + 8558 + + + YES + + + + + + 8559 + + + + + 8560 + + + + + 8561 + + + + + 8568 + + + + + 8569 + + + YES + + + + + + 8570 + + + + + 8571 + + + YES + + + + + + 8572 + + + + + 8575 + + + YES + + + + + + 8576 + + + + + 8578 + + + YES + + + + + + 8579 + + + + + 8596 + + + YES + + + + + + 8597 + + + YES + + + + + + + + + + + 8598 + + + YES + + + + + + 8599 + + + + + 8612 + + + YES + + + + + + + 8613 + + + YES + + + + + + 8614 + + + + + 8629 + + + YES + + + + + + 8630 + + + + + 8608 + + + YES + + + + + + 8609 + + + YES + + + + + + 8610 + + + YES + + + + + + 8611 + + + + + 8635 + + + + + 8638 + + + YES + + + + + + 8639 + + + YES + + + + + + 8640 + + + + + 8641 + + + + + 8653 + + + YES + + + + + + 8654 + + + + + 8655 + + + YES + + + + + + 8656 + + + + + 8657 + + + YES + + + + + + 8658 + + + + + 8660 + + + YES + + + + + + 8661 + + + + + 8663 + + + YES + + + + + + 8664 + + + + + 8667 + + + YES + + + + + + 8668 + + + + + 8669 + + + YES + + + + + + 8670 + + + + + 8677 + + + YES + + + + + + 8678 + + + + + 8679 + + + YES + + + + + + 8680 + + + + + 8681 + + + YES + + + + + + 8682 + + + + + 8687 + + + YES + + + + + + 8688 + + + YES + + + + + + 8689 + + + YES + + + + + + 8690 + + + + + 8691 + + + + + 8692 + + + + + 8706 + + + YES + + + + + + 8707 + + + @@ -44912,10 +48986,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1650.IBPluginDependency 1651.IBPluginDependency 1679.IBPluginDependency + 1679.designableToolbarItemIdentifier 1679.toolbarItem.selectable 1680.IBPluginDependency + 1680.designableToolbarItemIdentifier 1680.toolbarItem.selectable 1681.IBPluginDependency + 1681.designableToolbarItemIdentifier 1681.toolbarItem.selectable 1682.IBPluginDependency 1721.IBPluginDependency @@ -44951,6 +49028,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2154.IBPluginDependency 2155.IBPluginDependency 2246.IBPluginDependency + 2246.designableToolbarItemIdentifier 2246.toolbarItem.selectable 2248.IBEditorWindowLastContentRect 2248.IBPluginDependency @@ -44992,6 +49070,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2339.IBEditorWindowLastContentRect 2339.IBPluginDependency 2340.IBPluginDependency + 2340.designableToolbarItemIdentifier 2340.toolbarItem.selectable 2341.IBPluginDependency 2342.IBPluginDependency @@ -45200,6 +49279,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 3480.IBPluginDependency 3481.IBPluginDependency 3482.IBPluginDependency + 3488.IBEditorWindowLastContentRect 3488.IBPluginDependency 3488.IBWindowTemplateEditedContentRect 3488.NSWindowTemplate.visibleAtLaunch @@ -45511,6 +49591,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 4116.IBPluginDependency 4179.IBPluginDependency 4180.IBPluginDependency + 4181.IBEditorWindowLastContentRect 4181.IBPluginDependency 4181.IBWindowTemplateEditedContentRect 4181.NSWindowTemplate.visibleAtLaunch @@ -45581,7 +49662,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 4581.IBPluginDependency 4582.IBPluginDependency 4583.IBPluginDependency + 4583.IBViewBoundsToFrameTransform 4584.IBPluginDependency + 4585.IBEditorWindowLastContentRect 4585.IBPluginDependency 4586.IBPluginDependency 4587.IBPluginDependency @@ -45719,6 +49802,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 5068.IBAttributePlaceholdersKey 5068.IBPluginDependency 5069.IBPluginDependency + 5080.IBEditorWindowLastContentRect 5080.IBPluginDependency 5080.IBWindowTemplateEditedContentRect 5080.NSWindowTemplate.visibleAtLaunch @@ -45826,10 +49910,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 5687.IBPluginDependency 5688.IBPluginDependency 5689.IBPluginDependency + 57.IBEditorWindowLastContentRect 57.IBPluginDependency 5702.IBPluginDependency 5713.IBPluginDependency 575.IBPluginDependency + 576.IBEditorWindowLastContentRect 576.IBPluginDependency 578.IBPluginDependency 58.IBPluginDependency @@ -45903,6 +49989,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 627.IBWindowTemplateEditedContentRect 627.NSWindowTemplate.visibleAtLaunch 628.IBPluginDependency + 629.IBEditorWindowLastContentRect 629.IBPluginDependency 6295.IBPluginDependency 6295.IBWindowTemplateEditedContentRect @@ -46051,18 +50138,22 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 715.IBPluginDependency 7168.IBPluginDependency 7169.IBPluginDependency + 7171.IBEditorWindowLastContentRect 7171.IBPluginDependency 7171.IBWindowTemplateEditedContentRect 7171.NSWindowTemplate.visibleAtLaunch 7172.IBPluginDependency + 7173.IBEditorWindowLastContentRect 7173.IBPluginDependency 7173.IBWindowTemplateEditedContentRect 7173.NSWindowTemplate.visibleAtLaunch 7174.IBPluginDependency + 7175.IBEditorWindowLastContentRect 7175.IBPluginDependency 7175.IBWindowTemplateEditedContentRect 7175.NSWindowTemplate.visibleAtLaunch 7176.IBPluginDependency + 7179.IBEditorWindowLastContentRect 7179.IBPluginDependency 7179.IBWindowTemplateEditedContentRect 7179.NSWindowTemplate.visibleAtLaunch @@ -46098,6 +50189,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7222.IBPluginDependency 7223.IBPluginDependency 7224.IBPluginDependency + 7225.IBEditorWindowLastContentRect 7225.IBPluginDependency 7225.IBWindowTemplateEditedContentRect 7225.NSWindowTemplate.visibleAtLaunch @@ -46141,6 +50233,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7291.IBPluginDependency 7292.IBPluginDependency 7293.IBPluginDependency + 7293.IBViewBoundsToFrameTransform 7294.IBNumberFormatterBehaviorMetadataKey 7294.IBNumberFormatterLocalizesFormatMetadataKey 7294.IBPluginDependency @@ -46150,6 +50243,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7301.IBPluginDependency 7302.IBPluginDependency 7305.IBPluginDependency + 7305.IBViewBoundsToFrameTransform 7308.IBPluginDependency 7309.IBPluginDependency 7312.IBPluginDependency @@ -46161,10 +50255,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7354.IBPluginDependency 7355.IBPluginDependency 7358.IBPluginDependency + 7358.IBViewBoundsToFrameTransform 7359.IBPluginDependency 7392.IBPluginDependency 7393.IBPluginDependency 7395.IBPluginDependency + 7395.IBViewBoundsToFrameTransform 7396.IBPluginDependency 7398.IBPluginDependency 7399.IBPluginDependency @@ -46182,7 +50278,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7442.IBPluginDependency 7443.IBPluginDependency 7445.IBPluginDependency + 7445.IBViewBoundsToFrameTransform 7446.IBPluginDependency + 7449.IBEditorWindowLastContentRect 7449.IBPluginDependency 7449.IBWindowTemplateEditedContentRect 7449.NSWindowTemplate.visibleAtLaunch @@ -46276,6 +50374,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7625.IBPluginDependency 7666.CustomClassName 7666.IBPluginDependency + 7707.IBEditorWindowLastContentRect 7707.IBPluginDependency 7707.IBWindowTemplateEditedContentRect 7707.NSWindowTemplate.visibleAtLaunch @@ -46407,12 +50506,16 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 796.NSWindowTemplate.visibleAtLaunch 797.IBPluginDependency 7971.IBPluginDependency + 7971.IBViewBoundsToFrameTransform 7972.IBPluginDependency + 7972.IBViewBoundsToFrameTransform 7973.IBPluginDependency 7974.IBPluginDependency 7978.IBPluginDependency + 7978.IBViewBoundsToFrameTransform 7987.IBPluginDependency 7988.IBPluginDependency + 7989.IBEditorWindowLastContentRect 7989.IBPluginDependency 7993.IBPluginDependency 7994.IBPluginDependency @@ -46434,8 +50537,11 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 8024.IBPluginDependency 8025.IBPluginDependency 8030.IBPluginDependency + 8030.IBViewBoundsToFrameTransform 8031.IBPluginDependency + 8031.IBViewBoundsToFrameTransform 8032.IBPluginDependency + 8032.IBViewBoundsToFrameTransform 8033.IBPluginDependency 8034.IBPluginDependency 8043.IBPluginDependency @@ -46559,21 +50665,261 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 8322.IBViewBoundsToFrameTransform 8323.IBPluginDependency 833.IBPluginDependency + 8331.IBEditorWindowLastContentRect + 8331.IBPluginDependency + 8331.IBWindowTemplateEditedContentRect + 8331.NSWindowTemplate.visibleAtLaunch + 8332.IBPluginDependency + 8333.IBPluginDependency + 8333.IBViewBoundsToFrameTransform + 8334.IBPluginDependency + 8335.IBPluginDependency + 8336.IBPluginDependency + 8338.IBPluginDependency 834.IBPluginDependency + 8341.IBPluginDependency + 8343.IBPluginDependency + 8343.IBViewBoundsToFrameTransform + 8344.IBPluginDependency + 8344.IBViewBoundsToFrameTransform + 8345.IBAttributePlaceholdersKey + 8345.IBPluginDependency + 8345.IBViewBoundsToFrameTransform + 8346.IBPluginDependency 835.IBPluginDependency + 8352.IBPluginDependency + 8354.IBPluginDependency + 8356.IBPluginDependency 836.IBPluginDependency + 8363.IBPluginDependency + 8363.IBViewBoundsToFrameTransform + 8364.IBPluginDependency + 8365.IBPluginDependency + 8365.IBViewBoundsToFrameTransform + 8366.IBEditorWindowLastContentRect + 8366.IBPluginDependency + 8366.IBViewBoundsToFrameTransform + 8367.IBPluginDependency + 8367.IBViewBoundsToFrameTransform + 8368.IBPluginDependency + 8369.IBEditorWindowLastContentRect + 8369.IBPluginDependency + 8369.IBViewBoundsToFrameTransform + 8377.IBPluginDependency + 8377.IBViewBoundsToFrameTransform + 8378.IBPluginDependency + 8379.IBEditorWindowLastContentRect + 8379.IBPluginDependency + 8380.IBPluginDependency + 8381.IBPluginDependency + 8382.IBPluginDependency + 8383.IBPluginDependency + 8384.IBPluginDependency + 8385.IBPluginDependency + 8386.IBPluginDependency + 8387.IBPluginDependency + 8387.IBViewBoundsToFrameTransform + 8388.IBPluginDependency + 8402.IBEditorWindowLastContentRect + 8402.IBPluginDependency + 8402.IBViewBoundsToFrameTransform + 8405.IBEditorWindowLastContentRect + 8405.IBPluginDependency + 8405.IBViewBoundsToFrameTransform + 8408.IBEditorWindowLastContentRect + 8408.IBPluginDependency + 8408.IBViewBoundsToFrameTransform + 8409.IBPluginDependency + 8409.IBViewBoundsToFrameTransform + 8410.IBPluginDependency + 8411.IBPluginDependency + 8411.IBViewBoundsToFrameTransform + 8412.IBPluginDependency + 8413.IBPluginDependency + 8413.IBViewBoundsToFrameTransform + 8414.IBPluginDependency + 8415.IBPluginDependency + 8415.IBViewBoundsToFrameTransform + 8416.IBPluginDependency + 8427.IBPluginDependency + 8427.IBViewBoundsToFrameTransform + 8428.IBEditorWindowLastContentRect + 8428.IBPluginDependency + 8428.IBViewBoundsToFrameTransform 843.IBPluginDependency + 8433.IBPluginDependency + 8433.IBViewBoundsToFrameTransform + 8434.IBPluginDependency + 8435.IBPluginDependency + 8435.IBViewBoundsToFrameTransform + 8436.IBPluginDependency + 8437.IBPluginDependency + 8437.IBViewBoundsToFrameTransform + 8438.IBPluginDependency + 8439.IBPluginDependency + 8439.IBViewBoundsToFrameTransform 844.IBPluginDependency + 8440.IBPluginDependency + 8443.IBPluginDependency + 8443.IBViewBoundsToFrameTransform + 8444.IBPluginDependency + 8445.IBEditorWindowLastContentRect + 8445.IBPluginDependency + 8445.IBViewBoundsToFrameTransform + 8446.IBPluginDependency + 8446.IBViewBoundsToFrameTransform + 8447.IBPluginDependency + 8448.IBEditorWindowLastContentRect + 8448.IBPluginDependency + 8448.IBViewBoundsToFrameTransform 845.IBPluginDependency + 8451.IBEditorWindowLastContentRect + 8451.IBPluginDependency + 8451.IBViewBoundsToFrameTransform + 8454.IBEditorWindowLastContentRect + 8454.IBPluginDependency + 8454.IBViewBoundsToFrameTransform + 8455.IBPluginDependency + 8455.IBViewBoundsToFrameTransform + 8456.IBPluginDependency + 8457.IBPluginDependency + 8457.IBViewBoundsToFrameTransform + 8458.IBPluginDependency 846.IBPluginDependency + 8477.IBPluginDependency + 8477.IBViewBoundsToFrameTransform + 8478.IBPluginDependency + 8499.IBPluginDependency + 8499.IBViewBoundsToFrameTransform 850.IBPluginDependency + 8500.IBPluginDependency + 8501.IBAttributePlaceholdersKey + 8501.IBPluginDependency + 8501.IBViewBoundsToFrameTransform + 8502.IBPluginDependency + 8512.IBPluginDependency + 8512.IBViewBoundsToFrameTransform + 8513.IBPluginDependency + 8514.IBPluginDependency + 8515.IBPluginDependency + 8517.IBPluginDependency + 8518.IBPluginDependency + 8519.IBPluginDependency + 8523.IBPluginDependency + 8525.IBPluginDependency + 8525.IBViewBoundsToFrameTransform + 8526.IBPluginDependency + 8527.IBPluginDependency + 8535.IBPluginDependency 855.IBPluginDependency + 8552.IBEditorWindowLastContentRect + 8552.IBPluginDependency + 8552.IBViewBoundsToFrameTransform + 8553.IBPluginDependency + 8553.IBViewBoundsToFrameTransform + 8554.IBPluginDependency + 8557.IBPluginDependency + 8557.IBViewBoundsToFrameTransform + 8558.IBPluginDependency + 8558.IBViewBoundsToFrameTransform + 8559.IBPluginDependency + 8559.IBViewBoundsToFrameTransform + 8560.IBPluginDependency + 8561.IBPluginDependency + 8568.IBPluginDependency + 8568.IBViewBoundsToFrameTransform + 8569.IBPluginDependency + 8569.IBViewBoundsToFrameTransform + 8570.IBPluginDependency + 8571.IBPluginDependency + 8571.IBViewBoundsToFrameTransform + 8572.IBPluginDependency + 8575.IBPluginDependency + 8575.IBViewBoundsToFrameTransform + 8576.IBPluginDependency + 8578.IBPluginDependency + 8578.IBViewBoundsToFrameTransform + 8579.IBPluginDependency + 8596.IBEditorWindowLastContentRect + 8596.IBPluginDependency + 8596.IBWindowTemplateEditedContentRect + 8596.NSWindowTemplate.visibleAtLaunch + 8597.IBPluginDependency + 8598.IBPluginDependency + 8598.IBViewBoundsToFrameTransform + 8599.IBPluginDependency + 8608.IBPluginDependency + 8608.IBViewBoundsToFrameTransform + 8609.IBPluginDependency 861.IBPluginDependency 861.IBWindowTemplateEditedContentRect 861.NSWindowTemplate.visibleAtLaunch + 8610.IBPluginDependency + 8610.IBViewBoundsToFrameTransform + 8611.IBPluginDependency + 8612.IBPluginDependency + 8612.IBViewBoundsToFrameTransform + 8613.IBPluginDependency + 8613.IBViewBoundsToFrameTransform + 8614.IBPluginDependency 862.IBPluginDependency + 8629.IBPluginDependency + 8629.IBViewBoundsToFrameTransform + 8630.IBPluginDependency + 8635.IBNumberFormatterBehaviorMetadataKey + 8635.IBNumberFormatterLocalizesFormatMetadataKey + 8635.IBNumberFormatterSampleNumberKey + 8635.IBPluginDependency + 8638.IBPluginDependency + 8638.IBViewBoundsToFrameTransform + 8639.IBPluginDependency + 8639.IBViewBoundsToFrameTransform + 8640.IBPluginDependency + 8641.IBPluginDependency 865.IBPluginDependency + 8653.IBPluginDependency + 8653.IBViewBoundsToFrameTransform + 8654.IBPluginDependency + 8655.IBPluginDependency + 8655.IBViewBoundsToFrameTransform + 8656.IBPluginDependency + 8657.IBPluginDependency + 8657.IBViewBoundsToFrameTransform + 8658.IBPluginDependency 866.IBPluginDependency + 8660.IBPluginDependency + 8660.IBViewBoundsToFrameTransform + 8661.IBPluginDependency + 8663.IBPluginDependency + 8663.IBViewBoundsToFrameTransform + 8664.IBPluginDependency + 8667.IBPluginDependency + 8667.IBViewBoundsToFrameTransform + 8668.IBPluginDependency + 8669.IBPluginDependency + 8669.IBViewBoundsToFrameTransform + 8670.IBPluginDependency + 8677.IBPluginDependency + 8677.IBViewBoundsToFrameTransform + 8678.IBPluginDependency + 8679.IBPluginDependency + 8679.IBViewBoundsToFrameTransform + 8680.IBPluginDependency + 8681.IBPluginDependency + 8681.IBViewBoundsToFrameTransform + 8682.IBPluginDependency + 8687.IBPluginDependency + 8687.IBViewBoundsToFrameTransform + 8688.IBPluginDependency + 8688.IBViewBoundsToFrameTransform + 8689.IBPluginDependency + 8689.IBViewBoundsToFrameTransform + 8690.IBPluginDependency + 8691.IBPluginDependency + 8692.IBPluginDependency + 8706.IBPluginDependency + 8706.IBViewBoundsToFrameTransform + 8707.IBPluginDependency 872.IBPluginDependency 875.IBPluginDependency 876.IBPluginDependency @@ -46850,10 +51196,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + Input com.apple.InterfaceBuilder.CocoaPlugin + General com.apple.InterfaceBuilder.CocoaPlugin + Display com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -46889,6 +51238,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + Sound {{903, 745}, {400, 373}} com.apple.InterfaceBuilder.CocoaPlugin @@ -46972,6 +51322,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{343, 426}, {554, 373}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + Emulation com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -47235,7 +51586,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{189, 918}, {512, 20}} + {{847, 1136}, {512, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -47287,8 +51638,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{184, 141}, {640, 480}} com.apple.InterfaceBuilder.CocoaPlugin - {{502, 517}, {640, 480}} + {{184, 141}, {640, 480}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -47969,8 +52321,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{126, 670}, {305, 315}} com.apple.InterfaceBuilder.CocoaPlugin - {{999, 689}, {305, 315}} + {{126, 670}, {305, 315}} com.apple.InterfaceBuilder.CocoaPlugin @@ -48053,7 +52406,11 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCmAAAw9QAAA + com.apple.InterfaceBuilder.CocoaPlugin + {{63, 775}, {320, 290}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -48255,8 +52612,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{0, 729}, {500, 416}} com.apple.InterfaceBuilder.CocoaPlugin - {{1063, 215}, {500, 416}} + {{0, 729}, {500, 416}} {500, 272} @@ -48385,10 +52743,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{859, 953}, {203, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{1035, 893}, {220, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -48541,11 +52901,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{42, 932}, {400, 100}} + {{711, 876}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin - {{42, 932}, {400, 100}} + {{711, 876}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin + {{603, 976}, {616, 0}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{962, 321}, {580, 592}} @@ -48736,20 +53097,24 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{934, 298}, {350, 263}} com.apple.InterfaceBuilder.CocoaPlugin - {{1237, 579}, {350, 263}} + {{934, 298}, {350, 263}} com.apple.InterfaceBuilder.CocoaPlugin + {{84, 906}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin - {{1202, 1031}, {350, 125}} + {{84, 906}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin + {{42, 810}, {620, 267}} com.apple.InterfaceBuilder.CocoaPlugin - {{976, 297}, {620, 267}} + {{42, 810}, {620, 267}} com.apple.InterfaceBuilder.CocoaPlugin + {{789, 354}, {516, 283}} com.apple.InterfaceBuilder.CocoaPlugin - {{1085, 723}, {516, 283}} + {{789, 354}, {516, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -48811,8 +53176,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{105, 883}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin - {{1202, 877}, {350, 125}} + {{105, 883}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -48854,6 +53220,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABCYAAAA + com.apple.InterfaceBuilder.CocoaPlugin @@ -48863,6 +53232,30 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDcAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw0IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDEAAAwigAAA + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -48880,24 +53273,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw4KAAA + com.apple.InterfaceBuilder.CocoaPlugin + {{21, 940}, {467, 160}} com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{1127, 996}, {467, 160}} + {{21, 940}, {467, 160}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -49031,8 +53413,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin InputProfileController com.apple.InterfaceBuilder.CocoaPlugin + {{147, 847}, {452, 115}} com.apple.InterfaceBuilder.CocoaPlugin - {{853, 403}, {452, 115}} + {{147, 847}, {452, 115}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -49144,9 +53527,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{342, 490}, {640, 355}} + {{626, 692}, {640, 355}} com.apple.InterfaceBuilder.CocoaPlugin - {{342, 490}, {640, 355}} + {{626, 692}, {640, 355}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -49219,6 +53602,22 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + AUGQAABBgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCSAAAwjAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwjAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1043, 700}, {201, 93}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -49240,14 +53639,17 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + AUGgAABDzQAAA + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABClgAAw+UAAA + com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB6AAAw+CAAA + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -49404,6 +53806,73 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{658, 584}, {640, 448}} + com.apple.InterfaceBuilder.CocoaPlugin + {{658, 584}, {640, 448}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABByAAAw88AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUNZAABCzAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUJkAADB2AAAA + + + ToolTip + + ToolTip + + Applies the selected SLOT-2 device's settings. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABEBIAAwpgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwlgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABCkgAAA + + {{1218, 623}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{876, 169}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwvAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{882, 323}, {366, 123}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -49413,12 +53882,314 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAww8AAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{552, 661}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{882, 704}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{1200, 262}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw5UAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAw4iAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDjwAAw3cAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUONAABDPwAAA + + {{898, 836}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBYAAAw5MAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBYAAAw14AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBYAAAwxYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBYAAAwpwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC/gAAw46AAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{911, 632}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwycAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{903, 433}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + {{913, 679}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{910, 193}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUHIAABCwgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUJwAABClgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwsgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + YES + + + YES + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDhYAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAw3YAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw4MAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{917, 616}, {400, 320}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwy4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AcIwAABDLAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCsgAAw4YAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDjYAAwz8AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUFAAABC1gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCsgAAw5UAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwsYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDOwAAwsYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGgAABCzAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{961, 683}, {350, 249}} + com.apple.InterfaceBuilder.CocoaPlugin + {{961, 683}, {350, 249}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwzsAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCyAAAwfgAAA + + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{668, 434}, {580, 588}} com.apple.InterfaceBuilder.CocoaPlugin + + AUMuAABBMAAAA + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABBgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwwwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwyQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDhoAAwjwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDLQAAwjwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwqwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUHYAABCwAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDbAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwywAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDAgAAwhQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwywAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCygAAwrIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw18AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwsYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwsYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCngAAw1AAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCpAAAwzcAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDrgAAwx0AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDHgAAww8AAA + + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -49534,7 +54305,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - 8330 + 8713 @@ -49603,6 +54374,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA cheatListWindow cheatWindowController emuControlController + inputDeviceListController inputManager inputPrefsView mLoadStateSlot @@ -49612,6 +54384,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA prefWindow prefWindowController romInfoPanelController + slot2Window troubleshootingWindow @@ -49627,6 +54400,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSWindow NSObjectController NSObjectController + NSArrayController InputManager InputPrefsView NSMenu @@ -49637,6 +54411,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSObjectController NSObjectController NSWindow + NSWindow @@ -49654,6 +54429,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA cheatListWindow cheatWindowController emuControlController + inputDeviceListController inputManager inputPrefsView mLoadStateSlot @@ -49663,6 +54439,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA prefWindow prefWindowController romInfoPanelController + slot2Window troubleshootingWindow @@ -49711,6 +54488,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA emuControlController NSObjectController + + inputDeviceListController + NSArrayController + inputManager InputManager @@ -49747,6 +54528,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA romInfoPanelController NSObjectController + + slot2Window + NSWindow + troubleshootingWindow NSWindow @@ -50535,6 +55320,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA saveFileMigrationSheet saveStatePrecloseSheet slot1ManagerWindow + slot2WindowController YES @@ -50551,6 +55337,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSWindow NSWindow NSWindow + NSObjectController @@ -50570,6 +55357,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA saveFileMigrationSheet saveStatePrecloseSheet slot1ManagerWindow + slot2WindowController YES @@ -50625,6 +55413,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA slot1ManagerWindow NSWindow + + slot2WindowController + NSObjectController + @@ -50907,6 +55699,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA inputSettingsGPUState inputSettingsLoadStateSlot inputSettingsMicrophone + inputSettingsPaddleController inputSettingsSaveStateSlot inputSettingsSetSpeedLimit inputSettingsTouch @@ -50930,6 +55723,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSWindow NSWindow NSWindow + NSWindow @@ -50948,6 +55742,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA inputSettingsGPUState inputSettingsLoadStateSlot inputSettingsMicrophone + inputSettingsPaddleController inputSettingsSaveStateSlot inputSettingsSetSpeedLimit inputSettingsTouch @@ -51003,6 +55798,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA inputSettingsMicrophone NSWindow + + inputSettingsPaddleController + NSWindow + inputSettingsSaveStateSlot NSWindow @@ -51073,6 +55872,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA YES YES + changePrefView: chooseARM7BiosImage: chooseARM9BiosImage: chooseAdvansceneDatabase: @@ -51086,11 +55886,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA selectSPUSyncMode: selectVideoFilterType: setUseBilinear: - showDisplayView: - showEmulationView: - showGeneralView: - showInputView: - showSoundView: updateVolumeIcon: @@ -51110,16 +55905,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA id id id - id - id - id - id YES YES + changePrefView: chooseARM7BiosImage: chooseARM9BiosImage: chooseAdvansceneDatabase: @@ -51133,15 +55925,14 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA selectSPUSyncMode: selectVideoFilterType: setUseBilinear: - showDisplayView: - showEmulationView: - showGeneralView: - showInputView: - showSoundView: updateVolumeIcon: YES + + changePrefView: + id + chooseARM7BiosImage: id @@ -51194,26 +55985,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA setUseBilinear: id - - showDisplayView: - id - - - showEmulationView: - id - - - showGeneralView: - id - - - showInputView: - id - - - showSoundView: - id - updateVolumeIcon: id @@ -51235,6 +56006,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA prefWindowController previewImageView spuSyncMethodMenu + toolbar viewDisplay viewEmulation viewGeneral @@ -51255,6 +56027,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSObjectController NSImageView NSPopUpButton + NSToolbar NSView NSView NSView @@ -51278,6 +56051,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA prefWindowController previewImageView spuSyncMethodMenu + toolbar viewDisplay viewEmulation viewGeneral @@ -51331,6 +56105,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA spuSyncMethodMenu NSPopUpButton + + toolbar + NSToolbar + viewDisplay NSView @@ -51362,6 +56140,225 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA userinterface/preferencesWindowDelegate.h + + Slot2WindowDelegate + NSObject + + YES + + YES + applySettings: + chooseGbaCartridgePath: + chooseGbaSRamPath: + chooseMPCFPath: + clearSRamPath: + showInputPreferences: + testRumble: + + + YES + id + id + id + id + id + id + id + + + + YES + + YES + applySettings: + chooseGbaCartridgePath: + chooseGbaSRamPath: + chooseMPCFPath: + clearSRamPath: + showInputPreferences: + testRumble: + + + YES + + applySettings: + id + + + chooseGbaCartridgePath: + id + + + chooseGbaSRamPath: + id + + + chooseMPCFPath: + id + + + clearSRamPath: + id + + + showInputPreferences: + id + + + testRumble: + id + + + + + YES + + YES + deviceListController + deviceListTable + deviceSettingsBox + mpcfFileSearchMenu + prefWindowDelegate + viewAuto + viewCompactFlash + viewGBACartridge + viewGuitarGrip + viewMemoryExpansionPack + viewNoSelection + viewNone + viewPaddleController + viewPassME + viewPiano + viewRumblePak + viewUnsupported + window + + + YES + NSArrayController + NSTableView + NSBox + NSPopUpButton + PreferencesWindowDelegate + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSWindow + + + + YES + + YES + deviceListController + deviceListTable + deviceSettingsBox + mpcfFileSearchMenu + prefWindowDelegate + viewAuto + viewCompactFlash + viewGBACartridge + viewGuitarGrip + viewMemoryExpansionPack + viewNoSelection + viewNone + viewPaddleController + viewPassME + viewPiano + viewRumblePak + viewUnsupported + window + + + YES + + deviceListController + NSArrayController + + + deviceListTable + NSTableView + + + deviceSettingsBox + NSBox + + + mpcfFileSearchMenu + NSPopUpButton + + + prefWindowDelegate + PreferencesWindowDelegate + + + viewAuto + NSView + + + viewCompactFlash + NSView + + + viewGBACartridge + NSView + + + viewGuitarGrip + NSView + + + viewMemoryExpansionPack + NSView + + + viewNoSelection + NSView + + + viewNone + NSView + + + viewPaddleController + NSView + + + viewPassME + NSView + + + viewPiano + NSView + + + viewRumblePak + NSView + + + viewUnsupported + NSView + + + window + NSWindow + + + + + IBProjectSource + userinterface/Slot2WindowDelegate.h + + TroubleshootingWindowDelegate NSObject @@ -52331,6 +57328,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA Icon_ShowHUD_420x420 Icon_Speaker_420x420 Icon_VolumeFull_16x16 + Image_MemoryExpansionPak + Image_PaddleController + Image_PassME + Image_Piano NSActionTemplate NSAddTemplate NSApplicationIcon @@ -52367,6 +57368,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {420, 420} {420, 420} {20, 20} + {360, 136} + {698, 479} + {111.60000000000001, 85.600000000000009} + {350, 200} {15, 15} {8, 8} {512, 512} diff --git a/desmume/src/cocoa/userinterface/EmuControllerDelegate.h b/desmume/src/cocoa/userinterface/EmuControllerDelegate.h index 31ec9018b..443d61ad7 100644 --- a/desmume/src/cocoa/userinterface/EmuControllerDelegate.h +++ b/desmume/src/cocoa/userinterface/EmuControllerDelegate.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 DeSmuME team + Copyright (C) 2013-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,6 +44,7 @@ class AudioSampleBlockGenerator; NSObjectController *cdsCoreController; NSObjectController *cdsSoundController; NSObjectController *cheatWindowController; + NSObjectController *slot2WindowController; NSArrayController *cheatListController; NSArrayController *cheatDatabaseController; @@ -99,6 +100,7 @@ class AudioSampleBlockGenerator; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSObjectController *cdsSoundController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; +@property (readonly) IBOutlet NSObjectController *slot2WindowController; @property (readonly) IBOutlet NSArrayController *cheatListController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController; diff --git a/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm b/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm index ec7bf932d..842bcb5eb 100644 --- a/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm +++ b/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 DeSmuME team + Copyright (C) 2013-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ #import "DisplayWindowController.h" #import "InputManager.h" #import "cheatWindowDelegate.h" +#import "Slot2WindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_cheat.h" @@ -29,6 +30,7 @@ #import "cocoa_input.h" #import "cocoa_output.h" #import "cocoa_rom.h" +#import "cocoa_slot2.h" @implementation EmuControllerDelegate @@ -48,6 +50,7 @@ @synthesize cheatWindowController; @synthesize cheatListController; @synthesize cheatDatabaseController; +@synthesize slot2WindowController; @synthesize slot1ManagerWindow; @synthesize saveFileMigrationSheet; @@ -982,6 +985,19 @@ NSString *audioFilePath = cmdAttr.object[0]; [[cdsCore cdsController] setSelectedAudioFileGenerator:[inputManager audioFileGeneratorFromFilePath:audioFilePath]]; } + else if (controlID == DSControllerState_Paddle) + { + if (cmdAttr.useInputForScalar) + { + const float paddleScalar = cmdAttr.floatValue[0]; + [(Slot2WindowDelegate *)[slot2WindowController content] setPaddleDirectWithScalar:paddleScalar]; + } + else + { + const NSInteger paddleRelativeAdjustment = cmdAttr.intValue[1]; + [(Slot2WindowDelegate *)[slot2WindowController content] setPaddleRelativeWithInteger:paddleRelativeAdjustment]; + } + } else { [[cdsCore cdsController] setControllerState:theState controlID:controlID]; @@ -1537,6 +1553,10 @@ [self setIsWorking:NO]; [self setIsRomLoading:NO]; + Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2WindowController content]; + [slot2WindowDelegate setAutoSelectedDeviceText:[[slot2WindowDelegate deviceManager] autoSelectedDeviceName]]; + [[slot2WindowDelegate deviceManager] updateStatus]; + for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; @@ -1609,6 +1629,10 @@ [self setStatusText:NSSTRING_STATUS_ROM_UNLOADED]; [self setIsWorking:NO]; + Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2WindowController content]; + [slot2WindowDelegate setAutoSelectedDeviceText:[[slot2WindowDelegate deviceManager] autoSelectedDeviceName]]; + [[slot2WindowDelegate deviceManager] updateStatus]; + for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; diff --git a/desmume/src/cocoa/userinterface/InputManager.h b/desmume/src/cocoa/userinterface/InputManager.h index 8dfc5e935..dbeeca4ea 100644 --- a/desmume/src/cocoa/userinterface/InputManager.h +++ b/desmume/src/cocoa/userinterface/InputManager.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 DeSmuME team + Copyright (C) 2013-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,6 +18,7 @@ #import #include #include +#include #if defined(__ppc__) || defined(__ppc64__) #include @@ -103,27 +104,47 @@ typedef std::tr1::unordered_map AudioFil InputHIDManager *hidManager; IOHIDDeviceRef hidDeviceRef; IOHIDQueueRef hidQueueRef; + + NSString *identifier; + + io_service_t ioService; + FFDeviceObjectReference ffDevice; + FFEffectObjectReference ffEffect; + BOOL supportsForceFeedback; + BOOL isForceFeedbackEnabled; + NSRunLoop *runLoop; OSSpinLock spinlockRunLoop; } @property (retain) InputHIDManager *hidManager; @property (readonly) IOHIDDeviceRef hidDeviceRef; +@property (readonly) NSString *manufacturerName; +@property (readonly) NSString *productName; +@property (readonly) NSString *serialNumber; +@property (readonly) NSString *identifier; +@property (readonly) BOOL supportsForceFeedback; +@property (assign) BOOL isForceFeedbackEnabled; @property (retain) NSRunLoop *runLoop; - (id) initWithDevice:(IOHIDDeviceRef)theDevice hidManager:(InputHIDManager *)theHIDManager; +- (void) setPropertiesUsingDictionary:(NSDictionary *)theProperties; +- (NSDictionary *) propertiesDictionary; +- (void) writeDefaults; + - (void) start; - (void) stop; -- (NSString *) manufacturerName; -- (NSString *) productName; -- (NSString *) serialNumber; +- (void) startForceFeedbackAndIterate:(UInt32)iterations flags:(UInt32)ffFlags; +- (void) stopForceFeedback; @end -BOOL GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef); -InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char *altElementCode, const char *altElementName, bool *altOnState); +bool GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef); +void InputDeviceCodeFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer); +void InputDeviceNameFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer, const char *altName); +InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char *altElementCode, const char *altElementName, const bool *altOnState); InputAttributesList InputListFromHIDValue(IOHIDValueRef hidValueRef); InputAttributesList InputListFromHatSwitchValue(IOHIDValueRef hidValueRef, bool useEightDirection); @@ -136,15 +157,15 @@ void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void InputManager *inputManager; IOHIDManagerRef hidManagerRef; NSRunLoop *runLoop; - NSMutableSet *deviceList; + NSArrayController *deviceListController; id target; OSSpinLock spinlockRunLoop; } +@property (retain) NSArrayController *deviceListController; @property (retain) InputManager *inputManager; @property (readonly) IOHIDManagerRef hidManagerRef; -@property (readonly) NSMutableSet *deviceList; @property (assign) id target; @property (retain) NSRunLoop *runLoop; @@ -173,6 +194,7 @@ void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSen @property (readonly) IBOutlet EmuControllerDelegate *emuControl; @property (retain) id hidInputTarget; +@property (readonly) InputHIDManager *hidManager; @property (readonly) NSMutableDictionary *inputMappings; @property (readonly) NSArray *commandTagList; @property (readonly) NSDictionary *commandIcon; diff --git a/desmume/src/cocoa/userinterface/InputManager.mm b/desmume/src/cocoa/userinterface/InputManager.mm index 73ad08994..57cdeca70 100644 --- a/desmume/src/cocoa/userinterface/InputManager.mm +++ b/desmume/src/cocoa/userinterface/InputManager.mm @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2013 DeSmuME team + Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -71,6 +71,12 @@ extern "C" @synthesize hidManager; @synthesize hidDeviceRef; +@dynamic manufacturerName; +@dynamic productName; +@dynamic serialNumber; +@synthesize identifier; +@dynamic supportsForceFeedback; +@dynamic isForceFeedbackEnabled; @dynamic runLoop; static NSDictionary *hidUsageTable = nil; @@ -109,6 +115,104 @@ static NSDictionary *hidUsageTable = nil; CFRelease(elementArray); + // Set up force feedback. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + ioService = IOHIDDeviceGetService(hidDeviceRef); + if (ioService != MACH_PORT_NULL) + { + IOObjectRetain(ioService); + } +#else + ioService = MACH_PORT_NULL; + + CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOHIDDeviceKey); + if (matchingDict) + { + CFStringRef locationKey = CFSTR(kIOHIDLocationIDKey); + CFTypeRef deviceLocation = IOHIDDeviceGetProperty(hidDeviceRef, locationKey); + if (deviceLocation != NULL) + { + CFDictionaryAddValue(matchingDict, locationKey, deviceLocation); + + //This eats a reference to matchingDict, so we don't need a separate release. + //The result, meanwhile, has a reference count of 1 and must be released by the caller. + ioService = IOServiceGetMatchingService(kIOMasterPortDefault, matchingDict); + } + else + { + CFRelease(matchingDict); + } + } +#endif + + ffDevice = NULL; + ffEffect = NULL; + if (ioService != MACH_PORT_NULL && [self supportsForceFeedback]) + { + HRESULT ffResult = FFCreateDevice(ioService, &ffDevice); + if (ffDevice != NULL && ffResult != FF_OK) + { + FFReleaseDevice(ffDevice); + ffDevice = NULL; + } + + // Generate the force feedback effect. + if (ffDevice != NULL) + { + DWORD rgdwAxes[1] = {FFJOFS_Y}; + LONG rglDirection[2] = {0}; + + FFCONSTANTFORCE cf; + cf.lMagnitude = FF_FFNOMINALMAX; + + FFEFFECT newEffect; + newEffect.dwSize = sizeof(FFEFFECT); + newEffect.dwFlags = FFEFF_CARTESIAN | FFEFF_OBJECTOFFSETS; + newEffect.dwDuration = 1000000; // Equivalent to 1 second + newEffect.dwSamplePeriod = 0; + newEffect.dwGain = FF_FFNOMINALMAX; + newEffect.dwTriggerButton = FFEB_NOTRIGGER; + newEffect.dwTriggerRepeatInterval = 0; + newEffect.cAxes = 1; + newEffect.rgdwAxes = rgdwAxes; + newEffect.rglDirection = rglDirection; + newEffect.lpEnvelope = NULL; + newEffect.cbTypeSpecificParams = sizeof(FFCONSTANTFORCE); + newEffect.lpvTypeSpecificParams = &cf; + newEffect.dwStartDelay = 0; + + FFDeviceCreateEffect(ffDevice, kFFEffectType_ConstantForce_ID, &newEffect, &ffEffect); + if (ffEffect == NULL) + { + FFReleaseDevice(ffDevice); + ffDevice = NULL; + } + } + } + + isForceFeedbackEnabled = (ffDevice != nil); + if (isForceFeedbackEnabled) + { + [self startForceFeedbackAndIterate:RUMBLE_ITERATIONS_ENABLE flags:0]; + } + + // Set up the device identifier. + CFNumberRef cfVendorIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDVendorIDKey)); + CFNumberRef cfProductIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductIDKey)); + CFStringRef cfDeviceSerial = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); + + if (cfDeviceSerial != nil) + { + identifier = [NSString stringWithFormat:@"%d/%d/%@", [(NSNumber *)cfVendorIDNumber intValue], [(NSNumber *)cfProductIDNumber intValue], cfDeviceSerial]; + } + else + { + CFNumberRef cfLocationIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDLocationIDKey)); + identifier = [NSString stringWithFormat:@"%d/%d/0x%08X", [(NSNumber *)cfVendorIDNumber intValue], [(NSNumber *)cfProductIDNumber intValue], [(NSNumber *)cfLocationIDNumber intValue]]; + } + + [identifier retain]; + spinlockRunLoop = OS_SPINLOCK_INIT; [self setRunLoop:[NSRunLoop currentRunLoop]]; @@ -127,9 +231,76 @@ static NSDictionary *hidUsageTable = nil; hidQueueRef = NULL; } + if (ffDevice != NULL) + { + FFReleaseDevice(ffDevice); + FFEffectUnload(ffEffect); + ffDevice = NULL; + } + + if (ioService != MACH_PORT_NULL) + { + IOObjectRelease(ioService); + ioService = MACH_PORT_NULL; + } + + [identifier release]; + [super dealloc]; } +- (NSString *) manufacturerName +{ + return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDManufacturerKey)); +} + +- (NSString *) productName +{ + return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDProductKey)); +} + +- (NSString *) serialNumber +{ + return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDSerialNumberKey)); +} + +- (BOOL) supportsForceFeedback +{ + return (ioService != MACH_PORT_NULL) ? (FFIsForceFeedback(ioService) == FF_OK) : NO; +} + +- (void) setIsForceFeedbackEnabled:(BOOL)theState +{ + if (ffDevice != NULL) + { + // Enable/disable force feedback by maxing/zeroing out the device gain. + UInt32 gainValue = (theState) ? FF_FFNOMINALMAX : 0; + FFDeviceSetForceFeedbackProperty(ffDevice, FFPROP_FFGAIN, &gainValue); + + if (theState) + { + [self startForceFeedbackAndIterate:RUMBLE_ITERATIONS_ENABLE flags:0]; + } + else + { + [self stopForceFeedback]; + } + + isForceFeedbackEnabled = theState; + } + else + { + isForceFeedbackEnabled = NO; + } + + [self writeDefaults]; +} + +- (BOOL) isForceFeedbackEnabled +{ + return isForceFeedbackEnabled; +} + - (void) setRunLoop:(NSRunLoop *)theRunLoop { OSSpinLockLock(&spinlockRunLoop); @@ -149,7 +320,7 @@ static NSDictionary *hidUsageTable = nil; { [theRunLoop retain]; IOHIDQueueScheduleWithRunLoop(hidQueueRef, [theRunLoop getCFRunLoop], kCFRunLoopDefaultMode); - IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, HandleQueueValueAvailableCallback, [self hidManager]); + IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, HandleQueueValueAvailableCallback, self); } [runLoop release]; @@ -167,6 +338,43 @@ static NSDictionary *hidUsageTable = nil; return theRunLoop; } +- (void) setPropertiesUsingDictionary:(NSDictionary *)theProperties +{ + if (theProperties == nil) + { + return; + } + + NSNumber *isFFEnabledNumber = (NSNumber *)[theProperties objectForKey:@"isForceFeedbackEnabled"]; + if (isFFEnabledNumber != nil) + { + [self setIsForceFeedbackEnabled:[isFFEnabledNumber boolValue]]; + } +} + +- (NSDictionary *) propertiesDictionary +{ + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:[self isForceFeedbackEnabled]], @"isForceFeedbackEnabled", + [self manufacturerName], @"manufacturerName", + [self productName], @"productName", + [self serialNumber], @"serialNumber", + nil]; +} + +- (void) writeDefaults +{ + NSDictionary *savedInputDeviceDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_SavedDeviceProperties"]; + if (savedInputDeviceDict == nil) + { + return; + } + + NSMutableDictionary *newInputDeviceDict = [NSMutableDictionary dictionaryWithDictionary:savedInputDeviceDict]; + [newInputDeviceDict setObject:[self propertiesDictionary] forKey:[self identifier]]; + [[NSUserDefaults standardUserDefaults] setObject:newInputDeviceDict forKey:@"Input_SavedDeviceProperties"]; +} + - (void) start { IOHIDQueueStart(hidQueueRef); @@ -177,19 +385,21 @@ static NSDictionary *hidUsageTable = nil; IOHIDQueueStop(hidQueueRef); } -- (NSString *) manufacturerName +- (void) startForceFeedbackAndIterate:(UInt32)iterations flags:(UInt32)ffFlags { - return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDManufacturerKey)); + if (ffDevice != NULL) + { + HRESULT ffResult = FFEffectStart(ffEffect, iterations, ffFlags); + ffResult = ffResult; + } } -- (NSString *) productName +- (void) stopForceFeedback { - return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDProductKey)); -} - -- (NSString *) serialNumber -{ - return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDSerialNumberKey)); + if (ffDevice != NULL) + { + FFEffectStop(ffEffect); + } } @end @@ -211,7 +421,7 @@ static NSDictionary *hidUsageTable = nil; Details: None. ********************************************************************************************/ -InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char *altElementCode, const char *altElementName, bool *altOnState) +InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char *altElementCode, const char *altElementName, const bool *altOnState) { InputAttributes inputAttr; @@ -267,46 +477,14 @@ InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char strncpy(inputAttr.elementName, altElementName, INPUT_HANDLER_STRING_LENGTH); } - IOHIDDeviceRef hidDeviceRef = IOHIDElementGetDevice(hidElementRef); + const IOHIDDeviceRef hidDeviceRef = IOHIDElementGetDevice(hidElementRef); + InputDeviceCodeFromHIDDevice(hidDeviceRef, inputAttr.deviceCode); + InputDeviceNameFromHIDDevice(hidDeviceRef, inputAttr.deviceName, inputAttr.deviceCode); - CFNumberRef cfVendorIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDVendorIDKey)); - SInt32 vendorID = 0; - CFNumberGetValue(cfVendorIDNumber, kCFNumberSInt32Type, &vendorID); - - CFNumberRef cfProductIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductIDKey)); - SInt32 productID = 0; - CFNumberGetValue(cfProductIDNumber, kCFNumberSInt32Type, &productID); - - CFStringRef cfDeviceCode = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); - if (cfDeviceCode == nil) - { - CFNumberRef cfLocationIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDLocationIDKey)); - SInt32 locationID = 0; - CFNumberGetValue(cfLocationIDNumber, kCFNumberSInt32Type, &locationID); - - snprintf(inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH, "%d/%d/0x%08X", (int)vendorID, (int)productID, (unsigned int)locationID); - } - else - { - char cfDeviceCodeBuf[256] = {0}; - CFStringGetCString(cfDeviceCode, cfDeviceCodeBuf, 256, kCFStringEncodingUTF8); - snprintf(inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH, "%d/%d/%s", (int)vendorID, (int)productID, cfDeviceCodeBuf); - } - - CFStringRef cfDeviceName = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductKey)); - if (cfDeviceName == nil) - { - strncpy(inputAttr.deviceName, inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH); - } - else - { - CFStringGetCString(cfDeviceName, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); - } - - bool onState = (altOnState == NULL) ? GetOnStateFromHIDValueRef(hidValueRef) : *altOnState; - CFIndex logicalValue = IOHIDValueGetIntegerValue(hidValueRef); - NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); - NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); + const bool onState = (altOnState == NULL) ? GetOnStateFromHIDValueRef(hidValueRef) : *altOnState; + const NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); + const NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); + const NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); inputAttr.state = (onState) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; inputAttr.intCoordX = 0; @@ -352,10 +530,10 @@ InputAttributesList InputListFromHIDValue(IOHIDValueRef hidValueRef) } else { - NSInteger lowerThreshold = ((logicalMax - logicalMin) / 3) + logicalMin; - NSInteger upperThreshold = (((logicalMax - logicalMin) * 2) / 3) + logicalMin; - bool onState = true; - bool offState = false; + const NSInteger lowerThreshold = ((logicalMax - logicalMin) / 4) + logicalMin; + const NSInteger upperThreshold = (((logicalMax - logicalMin) * 3) / 4) + logicalMin; + const bool onState = true; + const bool offState = false; char elementCodeLowerThresholdBuf[256] = {0}; char elementCodeUpperThresholdBuf[256] = {0}; @@ -523,40 +701,31 @@ InputAttributesList InputListFromHatSwitchValue(IOHIDValueRef hidValueRef, bool return inputList; } -BOOL GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef) +bool GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef) { - BOOL onState = NO; + bool onState = false; if (hidValueRef == nil) { return onState; } - IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); - NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); - NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); - NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); - NSInteger lowerThreshold = ((logicalMax - logicalMin) / 4) + logicalMin; - NSInteger upperThreshold = (((logicalMax - logicalMin) * 3) / 4) + logicalMin; + const IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); + const NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); + const NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); + const NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); + const NSInteger lowerThreshold = ((logicalMax - logicalMin) / 4) + logicalMin; + const NSInteger upperThreshold = (((logicalMax - logicalMin) * 3) / 4) + logicalMin; + const NSInteger elementType = IOHIDElementGetType(hidElementRef); - NSInteger elementType = IOHIDElementGetType(hidElementRef); switch (elementType) { case kIOHIDElementTypeInput_Misc: { - if (logicalMin == 0 && logicalMax == 1) + if ( (logicalMin == 0 && logicalMax == 1 && logicalValue == 1) || + (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) ) { - if (logicalValue == 1) - { - onState = YES; - } - } - else - { - if (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) - { - onState = YES; - } + onState = true; } break; } @@ -565,26 +734,17 @@ BOOL GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef) { if (logicalValue == 1) { - onState = YES; + onState = true; } break; } case kIOHIDElementTypeInput_Axis: { - if (logicalMin == 0 && logicalMax == 1) + if ( (logicalMin == 0 && logicalMax == 1 && logicalValue == 1) || + (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) ) { - if (logicalValue == 1) - { - onState = YES; - } - } - else - { - if (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) - { - onState = YES; - } + onState = true; } break; } @@ -596,6 +756,46 @@ BOOL GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef) return onState; } +void InputDeviceCodeFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer) +{ + CFNumberRef cfVendorIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDVendorIDKey)); + SInt32 vendorID = 0; + CFNumberGetValue(cfVendorIDNumber, kCFNumberSInt32Type, &vendorID); + + CFNumberRef cfProductIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductIDKey)); + SInt32 productID = 0; + CFNumberGetValue(cfProductIDNumber, kCFNumberSInt32Type, &productID); + + CFStringRef cfDeviceCode = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); + if (cfDeviceCode == nil) + { + CFNumberRef cfLocationIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDLocationIDKey)); + SInt32 locationID = 0; + CFNumberGetValue(cfLocationIDNumber, kCFNumberSInt32Type, &locationID); + + snprintf(charBuffer, INPUT_HANDLER_STRING_LENGTH, "%d/%d/0x%08X", (int)vendorID, (int)productID, (unsigned int)locationID); + } + else + { + char cfDeviceCodeBuf[256] = {0}; + CFStringGetCString(cfDeviceCode, cfDeviceCodeBuf, 256, kCFStringEncodingUTF8); + snprintf(charBuffer, INPUT_HANDLER_STRING_LENGTH, "%d/%d/%s", (int)vendorID, (int)productID, cfDeviceCodeBuf); + } +} + +void InputDeviceNameFromHIDDevice(const IOHIDDeviceRef hidDeviceRef, char *charBuffer, const char *altName) +{ + CFStringRef cfDeviceName = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductKey)); + if (cfDeviceName == nil) + { + strncpy(charBuffer, (altName != NULL) ? altName : "Unknown Device", INPUT_HANDLER_STRING_LENGTH); + } + else + { + CFStringGetCString(cfDeviceName, charBuffer, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); + } +} + size_t ClearHIDQueue(const IOHIDQueueRef hidQueue) { size_t hidInputClearCount = 0; @@ -629,7 +829,8 @@ size_t ClearHIDQueue(const IOHIDQueueRef hidQueue) void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void *inSender) { - InputHIDManager *hidManager = (InputHIDManager *)inContext; + InputHIDDevice *hidDevice = (InputHIDDevice *)inContext; + InputHIDManager *hidManager = [hidDevice hidManager]; IOHIDQueueRef hidQueue = (IOHIDQueueRef)inSender; id target = [hidManager target]; @@ -651,7 +852,7 @@ void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void @synthesize inputManager; @synthesize hidManagerRef; -@synthesize deviceList; +@synthesize deviceListController; @synthesize target; @dynamic runLoop; @@ -664,6 +865,7 @@ void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void } target = nil; + deviceListController = nil; inputManager = [theInputManager retain]; hidManagerRef = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); @@ -672,9 +874,7 @@ void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void [self release]; return nil; } - - deviceList = [[NSMutableSet alloc] initWithCapacity:32]; - + CFMutableDictionaryRef cfJoystickMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_Joystick]); @@ -683,13 +883,18 @@ void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_GamePad]); - NSArray *matcherArray = [[NSArray alloc] initWithObjects:(NSMutableDictionary *)cfJoystickMatcher, (NSMutableDictionary *)cfGamepadMatcher, nil]; + CFMutableDictionaryRef cfGenericControllerMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(cfGenericControllerMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); + CFDictionarySetValue(cfGenericControllerMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_MultiAxisController]); + + NSArray *matcherArray = [[NSArray alloc] initWithObjects:(NSMutableDictionary *)cfJoystickMatcher, (NSMutableDictionary *)cfGamepadMatcher, (NSMutableDictionary *)cfGenericControllerMatcher, nil]; IOHIDManagerSetDeviceMatchingMultiple(hidManagerRef, (CFArrayRef)matcherArray); [matcherArray release]; CFRelease(cfJoystickMatcher); CFRelease(cfGamepadMatcher); + CFRelease(cfGenericControllerMatcher); spinlockRunLoop = OS_SPINLOCK_INIT; [self setRunLoop:[NSRunLoop currentRunLoop]]; @@ -709,9 +914,7 @@ void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void [self setRunLoop:nil]; [self setInputManager:nil]; [self setTarget:nil]; - - [deviceList release]; - + if (hidManagerRef != NULL) { IOHIDManagerClose(hidManagerRef, 0); @@ -767,19 +970,34 @@ void HandleDeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSe { InputHIDManager *hidManager = (InputHIDManager *)inContext; InputHIDDevice *newDevice = [[[InputHIDDevice alloc] initWithDevice:inIOHIDDeviceRef hidManager:hidManager] autorelease]; - [[hidManager deviceList] addObject:newDevice]; + [[hidManager deviceListController] addObject:newDevice]; + + NSDictionary *savedInputDeviceDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_SavedDeviceProperties"]; + NSDictionary *devicePropertiesDict = (NSDictionary *)[savedInputDeviceDict objectForKey:[newDevice identifier]]; + + if (devicePropertiesDict != nil) + { + [newDevice setPropertiesUsingDictionary:devicePropertiesDict]; + } + else + { + [newDevice writeDefaults]; + } + [newDevice start]; } void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) { InputHIDManager *hidManager = (InputHIDManager *)inContext; + NSArray *hidDeviceList = [[hidManager deviceListController] arrangedObjects]; - for (InputHIDDevice *hidDevice in [hidManager deviceList]) + for (InputHIDDevice *hidDevice in hidDeviceList) { if ([hidDevice hidDeviceRef] == inIOHIDDeviceRef) { - [[hidManager deviceList] removeObject:hidDevice]; + [hidDevice stopForceFeedback]; + [[hidManager deviceListController] removeObject:hidDevice]; break; } } @@ -790,6 +1008,7 @@ void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSen @synthesize emuControl; @dynamic hidInputTarget; +@synthesize hidManager; @synthesize inputMappings; @synthesize commandTagList; @synthesize commandIcon; @@ -869,6 +1088,25 @@ static std::tr1::unordered_map keyboardNameTable; / commandSelector["Debug"] = @selector(cmdUpdateDSController:); commandSelector["Lid"] = @selector(cmdUpdateDSController:); + commandSelector["Guitar Grip: Green"] = @selector(cmdUpdateDSController:); + commandSelector["Guitar Grip: Red"] = @selector(cmdUpdateDSController:); + commandSelector["Guitar Grip: Yellow"] = @selector(cmdUpdateDSController:); + commandSelector["Guitar Grip: Blue"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: C"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: C#"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: D"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: D#"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: E"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: F"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: F#"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: G"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: G#"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: A"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: A#"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: B"] = @selector(cmdUpdateDSController:); + commandSelector["Piano: High C"] = @selector(cmdUpdateDSController:); + commandSelector["Paddle"] = @selector(cmdUpdateDSController:); + commandSelector["Load State Slot"] = @selector(cmdLoadEmuSaveStateSlot:); commandSelector["Save State Slot"] = @selector(cmdSaveEmuSaveStateSlot:); commandSelector["Copy Screen"] = @selector(cmdCopyScreen:); @@ -905,6 +1143,29 @@ static std::tr1::unordered_map keyboardNameTable; / cmdDSControlMic.intValue[1] = MICMODE_INTERNAL_NOISE; cmdDSControlMic.floatValue[0] = 250.0f; + CommandAttributes cmdGuitarGripGreen = NewCommandAttributesForDSControl("Guitar Grip: Green", DSControllerState_GuitarGrip_Green); + CommandAttributes cmdGuitarGripRed = NewCommandAttributesForDSControl("Guitar Grip: Red", DSControllerState_GuitarGrip_Red); + CommandAttributes cmdGuitarGripYellow = NewCommandAttributesForDSControl("Guitar Grip: Yellow", DSControllerState_GuitarGrip_Yellow); + CommandAttributes cmdGuitarGripBlue = NewCommandAttributesForDSControl("Guitar Grip: Blue", DSControllerState_GuitarGrip_Blue); + CommandAttributes cmdPianoC = NewCommandAttributesForDSControl("Piano: C", DSControllerState_Piano_C); + CommandAttributes cmdPianoCSharp = NewCommandAttributesForDSControl("Piano: C#", DSControllerState_Piano_CSharp); + CommandAttributes cmdPianoD = NewCommandAttributesForDSControl("Piano: D", DSControllerState_Piano_D); + CommandAttributes cmdPianoDSharp = NewCommandAttributesForDSControl("Piano: DSharp", DSControllerState_Piano_DSharp); + CommandAttributes cmdPianoE = NewCommandAttributesForDSControl("Piano: E", DSControllerState_Piano_E); + CommandAttributes cmdPianoF = NewCommandAttributesForDSControl("Piano: F", DSControllerState_Piano_F); + CommandAttributes cmdPianoFSharp = NewCommandAttributesForDSControl("Piano: FSharp", DSControllerState_Piano_FSharp); + CommandAttributes cmdPianoG = NewCommandAttributesForDSControl("Piano: G", DSControllerState_Piano_G); + CommandAttributes cmdPianoGSharp = NewCommandAttributesForDSControl("Piano: GSharp", DSControllerState_Piano_GSharp); + CommandAttributes cmdPianoA = NewCommandAttributesForDSControl("Piano: A", DSControllerState_Piano_A); + CommandAttributes cmdPianoASharp = NewCommandAttributesForDSControl("Piano: ASharp", DSControllerState_Piano_ASharp); + CommandAttributes cmdPianoB = NewCommandAttributesForDSControl("Piano: B", DSControllerState_Piano_B); + CommandAttributes cmdPianoHighC = NewCommandAttributesForDSControl("Piano: High C", DSControllerState_Piano_HighC); + + CommandAttributes cmdPaddle = NewCommandAttributesForDSControl("Paddle", DSControllerState_Paddle); + cmdPaddle.useInputForScalar = false; + cmdPaddle.intValue[1] = 0; + cmdPaddle.floatValue[0] = 0.0f; + CommandAttributes cmdLoadEmuSaveStateSlot = NewCommandAttributesForSelector("Load State Slot", commandSelector["Load State Slot"]); CommandAttributes cmdSaveEmuSaveStateSlot = NewCommandAttributesForSelector("Save State Slot", commandSelector["Save State Slot"]); CommandAttributes cmdCopyScreen = NewCommandAttributesForSelector("Copy Screen", commandSelector["Copy Screen"]); @@ -946,6 +1207,25 @@ static std::tr1::unordered_map keyboardNameTable; / defaultCommandAttributes["Debug"] = cmdDSControlDebug; defaultCommandAttributes["Lid"] = cmdDSControlLid; + defaultCommandAttributes["Guitar Grip: Green"] = cmdGuitarGripGreen; + defaultCommandAttributes["Guitar Grip: Red"] = cmdGuitarGripRed; + defaultCommandAttributes["Guitar Grip: Yellow"] = cmdGuitarGripYellow; + defaultCommandAttributes["Guitar Grip: Blue"] = cmdGuitarGripBlue; + defaultCommandAttributes["Piano: C"] = cmdPianoC; + defaultCommandAttributes["Piano: C#"] = cmdPianoCSharp; + defaultCommandAttributes["Piano: D"] = cmdPianoD; + defaultCommandAttributes["Piano: D#"] = cmdPianoDSharp; + defaultCommandAttributes["Piano: E"] = cmdPianoE; + defaultCommandAttributes["Piano: F"] = cmdPianoF; + defaultCommandAttributes["Piano: F#"] = cmdPianoFSharp; + defaultCommandAttributes["Piano: G"] = cmdPianoG; + defaultCommandAttributes["Piano: G#"] = cmdPianoGSharp; + defaultCommandAttributes["Piano: A"] = cmdPianoA; + defaultCommandAttributes["Piano: A#"] = cmdPianoASharp; + defaultCommandAttributes["Piano: B"] = cmdPianoB; + defaultCommandAttributes["Piano: High C"] = cmdPianoHighC; + defaultCommandAttributes["Paddle"] = cmdPaddle; + defaultCommandAttributes["Load State Slot"] = cmdLoadEmuSaveStateSlot; defaultCommandAttributes["Save State Slot"] = cmdSaveEmuSaveStateSlot; defaultCommandAttributes["Copy Screen"] = cmdCopyScreen; @@ -1458,6 +1738,27 @@ static std::tr1::unordered_map keyboardNameTable; / break; } } + else if (strncmp(commandTag, "Paddle", INPUT_HANDLER_STRING_LENGTH) == 0) + { + const BOOL useInputForScalar = [(NSNumber *)[deviceInfo valueForKey:@"useInputForScalar"] boolValue]; + + if (useInputForScalar) + { + inputSummary = @"Direct Control"; + } + else + { + const NSInteger paddleRelativeAdjustment = [(NSNumber *)[deviceInfo valueForKey:@"intValue1"] integerValue]; + if (paddleRelativeAdjustment > 0) + { + inputSummary = [NSString stringWithFormat:@"Paddle Adjust: +%ld", (long)paddleRelativeAdjustment]; + } + else + { + inputSummary = [NSString stringWithFormat:@"Paddle Adjust: %ld", (long)paddleRelativeAdjustment]; + } + } + } if (inputSummary == nil) { @@ -1564,7 +1865,7 @@ static std::tr1::unordered_map keyboardNameTable; / // Convert the audio buffer to 7-bit unsigned PCM. buffer = theGenerator.getBuffer(); - for (SInt64 i = 0; i < bufferSize; i++) + for (size_t i = 0; i < bufferSize; i++) { *(buffer+i) >>= 1; } @@ -1673,7 +1974,6 @@ CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const { CommandAttributes cmdAttr = NewCommandAttributesForSelector(commandTag, @selector(cmdUpdateDSController:)); cmdAttr.intValue[0] = controlID; - cmdAttr.floatValue[0] = 250.0f; return cmdAttr; } @@ -1743,6 +2043,7 @@ NSMutableDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttr deviceName, @"deviceName", elementCode, @"elementCode", elementName, @"elementName", + [NSNumber numberWithBool:NO], @"isElementAnalog", deviceInfoSummary, @"deviceInfoSummary", @"", @"inputSettingsSummary", [NSNumber numberWithInt:cmdAttr->intValue[0]], @"intValue0", diff --git a/desmume/src/cocoa/userinterface/Slot2WindowDelegate.h b/desmume/src/cocoa/userinterface/Slot2WindowDelegate.h new file mode 100644 index 000000000..423976e53 --- /dev/null +++ b/desmume/src/cocoa/userinterface/Slot2WindowDelegate.h @@ -0,0 +1,136 @@ +/* + Copyright (C) 2014 DeSmuME Team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . + */ + +#import +#import "preferencesWindowDelegate.h" +#import "cocoa_slot2.h" + +@class InputHIDManager; + +#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 +@interface Slot2WindowDelegate : NSObject +#else +@interface Slot2WindowDelegate : NSObject +#endif +{ + NSObject *dummyObject; + NSWindow *window; + NSArrayController *deviceListController; + NSTableView *deviceListTable; + NSBox *deviceSettingsBox; + NSPopUpButton *mpcfFileSearchMenu; + PreferencesWindowDelegate *prefWindowDelegate; + + NSView *currentDeviceView; + NSView *viewUnsupported; + NSView *viewNoSelection; + NSView *viewNone; + NSView *viewAuto; + NSView *viewCompactFlash; + NSView *viewRumblePak; + NSView *viewGBACartridge; + NSView *viewGuitarGrip; + NSView *viewMemoryExpansionPack; + NSView *viewPiano; + NSView *viewPaddleController; + NSView *viewPassME; + + CocoaDSSlot2Device *selectedDevice; + CocoaDSSlot2Manager *deviceManager; + InputHIDManager *hidManager; + + NSString *autoSelectedDeviceText; + NSURL *mpcfFolderURL; + NSURL *mpcfDiskImageURL; + NSURL *gbaCartridgeURL; + NSURL *gbaSRamURL; +} + +@property (readonly) IBOutlet NSObject *dummyObject; +@property (readonly) IBOutlet NSWindow *window; +@property (readonly) IBOutlet NSArrayController *deviceListController; +@property (readonly) IBOutlet NSTableView *deviceListTable; +@property (readonly) IBOutlet NSBox *deviceSettingsBox; +@property (readonly) IBOutlet NSPopUpButton *mpcfFileSearchMenu; +@property (readonly) IBOutlet PreferencesWindowDelegate *prefWindowDelegate; + +@property (readonly) IBOutlet NSView *viewUnsupported; +@property (readonly) IBOutlet NSView *viewNoSelection; +@property (readonly) IBOutlet NSView *viewNone; +@property (readonly) IBOutlet NSView *viewAuto; +@property (readonly) IBOutlet NSView *viewCompactFlash; +@property (readonly) IBOutlet NSView *viewRumblePak; +@property (readonly) IBOutlet NSView *viewGBACartridge; +@property (readonly) IBOutlet NSView *viewGuitarGrip; +@property (readonly) IBOutlet NSView *viewMemoryExpansionPack; +@property (readonly) IBOutlet NSView *viewPiano; +@property (readonly) IBOutlet NSView *viewPaddleController; +@property (readonly) IBOutlet NSView *viewPassME; + +@property (retain) CocoaDSSlot2Device *selectedDevice; +@property (retain) CocoaDSSlot2Manager *deviceManager; +@property (retain) InputHIDManager *hidManager; + +@property (retain) NSString *autoSelectedDeviceText; +@property (retain) NSURL *mpcfFolderURL; +@property (retain) NSURL *mpcfDiskImageURL; +@property (assign) NSString *mpcfFolderName; +@property (assign) NSString *mpcfFolderPath; +@property (assign) NSString *mpcfDiskImageName; +@property (assign) NSString *mpcfDiskImagePath; +@property (retain) NSURL *gbaCartridgeURL; +@property (assign) NSString *gbaCartridgeName; +@property (assign) NSString *gbaCartridgePath; +@property (retain) NSURL *gbaSRamURL; +@property (assign) NSString *gbaSRamName; +@property (assign) NSString *gbaSRamPath; + +- (IBAction) applySettings:(id)sender; +- (IBAction) showInputPreferences:(id)sender; + +- (void) update; +- (void) selectDeviceByType:(NSInteger)theType; +- (void) setDeviceViewByDevice:(CocoaDSSlot2Device *)theDevice; + +#pragma mark - +#pragma mark Auto + +#pragma mark - +#pragma mark Compact Flash +- (IBAction) chooseMPCFPath:(id)sender; +- (void) chooseMPCFPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; + +#pragma mark - +#pragma mark GBA Cartridge +- (IBAction) chooseGbaCartridgePath:(id)sender; +- (void) chooseGbaCartridgePathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (IBAction) chooseGbaSRamPath:(id)sender; +- (void) chooseGbaSRamPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (IBAction) clearSRamPath:(id)sender; +- (BOOL) isGbaSRamWithCartridge; + +#pragma mark - +#pragma mark Rumble Pak +- (IBAction) testRumble:(id)sender; +- (void) sendForceFeedback:(NSNotification *)aNotification; + +#pragma mark - +#pragma mark Paddle +- (void) setPaddleDirectWithScalar:(float)scalar; +- (void) setPaddleRelativeWithInteger:(NSInteger)value; + +@end diff --git a/desmume/src/cocoa/userinterface/Slot2WindowDelegate.mm b/desmume/src/cocoa/userinterface/Slot2WindowDelegate.mm new file mode 100644 index 000000000..fab71ab93 --- /dev/null +++ b/desmume/src/cocoa/userinterface/Slot2WindowDelegate.mm @@ -0,0 +1,722 @@ +/* + Copyright (C) 2014 DeSmuME Team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . + */ + +#import "Slot2WindowDelegate.h" +#import "InputManager.h" +#import "preferencesWindowDelegate.h" +#import "cocoa_globals.h" +#import "cocoa_util.h" + + +@implementation Slot2WindowDelegate + +@synthesize dummyObject; +@synthesize window; +@synthesize deviceListController; +@synthesize deviceListTable; +@synthesize deviceSettingsBox; +@synthesize mpcfFileSearchMenu; +@synthesize prefWindowDelegate; + +@synthesize viewUnsupported; +@synthesize viewNoSelection; +@synthesize viewNone; +@synthesize viewAuto; +@synthesize viewCompactFlash; +@synthesize viewRumblePak; +@synthesize viewGBACartridge; +@synthesize viewGuitarGrip; +@synthesize viewMemoryExpansionPack; +@synthesize viewPiano; +@synthesize viewPaddleController; +@synthesize viewPassME; + +@synthesize selectedDevice; +@synthesize deviceManager; +@synthesize hidManager; + +@synthesize autoSelectedDeviceText; +@dynamic mpcfFolderURL; +@dynamic mpcfDiskImageURL; +@dynamic mpcfFolderName; +@dynamic mpcfFolderPath; +@dynamic mpcfDiskImageName; +@dynamic mpcfDiskImagePath; +@dynamic gbaCartridgeURL; +@dynamic gbaCartridgeName; +@dynamic gbaCartridgePath; +@synthesize gbaSRamURL; + +- (id)init +{ + self = [super init]; + if(self == nil) + { + return nil; + } + + deviceManager = [[[[CocoaDSSlot2Manager alloc] init] retain] autorelease]; + hidManager = nil; + currentDeviceView = viewNoSelection; + + autoSelectedDeviceText = @""; + mpcfFolderURL = nil; + mpcfDiskImageURL = nil; + gbaCartridgeURL = nil; + gbaSRamURL = nil; + + // This needs to respond to force feedback notifications. + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(sendForceFeedback:) + name:@"org.desmume.DeSmuME.sendForceFeedback" + object:nil]; + + return self; +} + +- (void)dealloc +{ + [self setDeviceManager:nil]; + [self setHidManager:nil]; + [self setMpcfFolderURL:nil]; + [self setMpcfDiskImageURL:nil]; + [self setGbaCartridgeURL:nil]; + [self setGbaSRamURL:nil]; + + [super dealloc]; +} + +- (IBAction) applySettings:(id)sender +{ + const NDS_SLOT2_TYPE selectedDeviceType = (selectedDevice != nil) ? [selectedDevice type] : NDS_SLOT2_NONE; + + if (selectedDeviceType == NDS_SLOT2_CFLASH) + { + NSURL *theURL = nil; + NSInteger mpcfPathOption = [[NSUserDefaults standardUserDefaults] integerForKey:@"Slot2_MPCF_PathOption"]; + + switch (mpcfPathOption) + { + case MPCF_OPTION_LOAD_WITH_ROM: + theURL = nil; + break; + + case MPCF_OPTION_LOAD_DIRECTORY: + theURL = mpcfFolderURL; + break; + + case MPCF_OPTION_LOAD_DISK_IMAGE: + theURL = mpcfDiskImageURL; + break; + + default: + break; + } + + [deviceManager setMpcfFileSearchURL:theURL]; + } + else if (selectedDeviceType == NDS_SLOT2_GBACART) + { + [deviceManager setGbaCartridgeURL:gbaCartridgeURL]; + [deviceManager setGbaSRamURL:gbaSRamURL]; + } + + [[self deviceManager] setCurrentDevice:selectedDevice]; + [[NSUserDefaults standardUserDefaults] setInteger:[selectedDevice type] forKey:@"Slot2_LoadedDevice"]; +} + +- (IBAction) showInputPreferences:(id)sender +{ + [[prefWindowDelegate toolbar] setSelectedItemIdentifier:@"Input"]; + [prefWindowDelegate changePrefView:sender]; + [[prefWindowDelegate window] makeKeyAndOrderFront:sender]; +} + +- (void) update +{ + [deviceManager updateDeviceList]; + [deviceListController setContent:[deviceManager deviceList]]; + [deviceListController setSelectedObjects:[NSArray arrayWithObject:[deviceManager currentDevice]]]; +} + +- (void) selectDeviceByType:(NSInteger)theType +{ + CocoaDSSlot2Device *theDevice = [[self deviceManager] findDeviceByType:(NDS_SLOT2_TYPE)theType]; + if (theDevice != nil) + { + [deviceListController setSelectedObjects:[NSArray arrayWithObject:theDevice]]; + } +} + +- (void) setDeviceViewByDevice:(CocoaDSSlot2Device *)theDevice +{ + NSView *newView = viewNoSelection; + const BOOL isDeviceEnabled = [theDevice enabled]; + const NDS_SLOT2_TYPE deviceType = [theDevice type]; + + if (currentDeviceView == nil) + { + currentDeviceView = viewNoSelection; + } + + if (isDeviceEnabled) + { + switch (deviceType) + { + case NDS_SLOT2_NONE: + newView = viewNone; + break; + + case NDS_SLOT2_AUTO: + newView = viewAuto; + break; + + case NDS_SLOT2_CFLASH: + newView = viewCompactFlash; + break; + + case NDS_SLOT2_RUMBLEPAK: + newView = viewRumblePak; + break; + + case NDS_SLOT2_GBACART: + newView = viewGBACartridge; + break; + + case NDS_SLOT2_GUITARGRIP: + newView = viewGuitarGrip; + break; + + case NDS_SLOT2_EXPMEMORY: + newView = viewMemoryExpansionPack; + break; + + case NDS_SLOT2_EASYPIANO: + newView = viewPiano; + break; + + case NDS_SLOT2_PADDLE: + newView = viewPaddleController; + break; + + case NDS_SLOT2_PASSME: + newView = viewPassME; + break; + + default: + break; + } + } + else + { + newView = viewUnsupported; + } + + if (newView != nil) + { + NSRect frameRect = [currentDeviceView frame]; + [currentDeviceView retain]; + [deviceSettingsBox replaceSubview:currentDeviceView with:newView]; + currentDeviceView = newView; + [currentDeviceView setFrame:frameRect]; + } +} + +#pragma mark - +#pragma mark Auto + + + +#pragma mark - +#pragma mark Compact Flash + +- (void) setMpcfFolderURL:(NSURL *)theURL +{ + [mpcfFolderURL release]; + mpcfFolderURL = [theURL retain]; + + NSString *thePath = [mpcfFolderURL path]; + [self setMpcfFolderPath:thePath]; + [self setMpcfFolderName:[thePath lastPathComponent]]; +} + +- (NSURL *) mpcfFolderURL +{ + return mpcfFolderURL; +} + +- (void) setMpcfFolderName:(NSString *)theName +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) mpcfFolderName +{ + NSString *folderPath = [self mpcfFolderPath]; + return (folderPath != nil) ? [folderPath lastPathComponent] : NSSTRING_STATUS_NO_FOLDER_CHOSEN; +} + +- (void) setMpcfFolderPath:(NSString *)thePath +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) mpcfFolderPath +{ + return (mpcfFolderURL != nil) ? [mpcfFolderURL path] : nil; +} + +- (void) setMpcfDiskImageURL:(NSURL *)theURL +{ + [mpcfDiskImageURL release]; + mpcfDiskImageURL = [theURL retain]; + + NSString *thePath = [mpcfDiskImageURL path]; + [self setMpcfDiskImagePath:thePath]; + [self setMpcfDiskImageName:[thePath lastPathComponent]]; +} + +- (NSURL *) mpcfDiskImageURL +{ + return mpcfDiskImageURL; +} + +- (void) setMpcfDiskImageName:(NSString *)theName +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) mpcfDiskImageName +{ + NSString *diskImagePath = [self mpcfDiskImagePath]; + return (diskImagePath != nil) ? [diskImagePath lastPathComponent] : NSSTRING_STATUS_NO_DISK_IMAGE_CHOSEN; +} + +- (void) setMpcfDiskImagePath:(NSString *)thePath +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) mpcfDiskImagePath +{ + return (mpcfDiskImageURL != nil) ? [mpcfDiskImageURL path] : nil; +} + +- (IBAction) chooseMPCFPath:(id)sender +{ + const NSInteger mpcfOptionTag = [CocoaDSUtil getIBActionSenderTag:sender]; + + if (mpcfOptionTag == MPCF_OPTION_LOAD_WITH_ROM) + { + [[NSUserDefaults standardUserDefaults] setInteger:mpcfOptionTag forKey:@"Slot2_MPCF_PathOption"]; + return; + } + + NSOpenPanel *panel = [NSOpenPanel openPanel]; + NSArray *fileTypes = nil; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + + if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DIRECTORY) + { + [panel setTitle:NSSTRING_TITLE_SELECT_MPCF_FOLDER_PANEL]; + [panel setCanChooseDirectories:YES]; + [panel setCanChooseFiles:NO]; + } + else if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DISK_IMAGE) + { + [panel setTitle:NSSTRING_TITLE_SELECT_MPCF_DISK_IMAGE_PANEL]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + fileTypes = [NSArray arrayWithObjects:@"dmg", @"img", nil]; + } + else + { + return; + } + + NSNumber *mpcfOptionNumber = [[NSNumber numberWithInteger:mpcfOptionTag] retain]; // Released in chooseMPCFPathDidEnd:returnCode:contextInfo: + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseMPCFPathDidEnd:panel returnCode:result contextInfo:mpcfOptionNumber]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseMPCFPathDidEnd:returnCode:contextInfo:) + contextInfo:mpcfOptionNumber]; +#endif +} + +- (void) chooseMPCFPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + const NSInteger prevMpcfOption = [[NSUserDefaults standardUserDefaults] integerForKey:@"Slot2_MPCF_PathOption"]; + const NSInteger mpcfOptionTag = [(NSNumber *)contextInfo integerValue]; + [(NSNumber *)contextInfo release]; // Retained in chooseMPCFPath: + + [sheet orderOut:self]; + + // Temporarily set the MPCF path option in user defaults to some neutral value first and synchronize. + // When the user defaults are actually set later, this will force the proper state transitions to occur. + [[NSUserDefaults standardUserDefaults] setInteger:mpcfOptionTag forKey:@"Slot2_MPCF_PathOption"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + if (returnCode == NSCancelButton) + { + [[NSUserDefaults standardUserDefaults] setInteger:prevMpcfOption forKey:@"Slot2_MPCF_PathOption"]; + return; + } + + NSURL *selectedURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectedURL == nil) + { + [[NSUserDefaults standardUserDefaults] setInteger:prevMpcfOption forKey:@"Slot2_MPCF_PathOption"]; + return; + } + + if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DIRECTORY) + { + [self setMpcfFolderURL:selectedURL]; + [[NSUserDefaults standardUserDefaults] setObject:[selectedURL path] forKey:@"Slot2_MPCF_DirectoryPath"]; + [[NSUserDefaults standardUserDefaults] setInteger:MPCF_OPTION_LOAD_DIRECTORY forKey:@"Slot2_MPCF_PathOption"]; + } + else if (mpcfOptionTag == MPCF_ACTION_CHOOSE_DISK_IMAGE) + { + [self setMpcfDiskImageURL:selectedURL]; + [[NSUserDefaults standardUserDefaults] setObject:[selectedURL path] forKey:@"Slot2_MPCF_DiskImagePath"]; + [[NSUserDefaults standardUserDefaults] setInteger:MPCF_OPTION_LOAD_DISK_IMAGE forKey:@"Slot2_MPCF_PathOption"]; + } +} + +#pragma mark - +#pragma mark GBA Cartridge + +- (void) setGbaCartridgeURL:(NSURL *)theURL +{ + [gbaCartridgeURL release]; + gbaCartridgeURL = [theURL retain]; + + NSString *thePath = [gbaCartridgeURL path]; + [self setGbaCartridgePath:thePath]; + [self setGbaCartridgeName:[thePath lastPathComponent]]; +} + +- (NSURL *) gbaCartridgeURL +{ + return gbaCartridgeURL; +} + +- (void) setGbaCartridgeName:(NSString *)theName +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) gbaCartridgeName +{ + NSString *gbaCartPath = [self gbaCartridgePath]; + return (gbaCartPath != nil) ? [gbaCartPath lastPathComponent] : NSSTRING_STATUS_NO_GBA_CART_CHOSEN; +} + +- (void) setGbaCartridgePath:(NSString *)thePath +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) gbaCartridgePath +{ + return (gbaCartridgeURL != nil) ? [gbaCartridgeURL path] : nil; +} + +- (void) setGbaSRamURL:(NSURL *)theURL +{ + [gbaSRamURL release]; + gbaSRamURL = [theURL retain]; + + NSString *thePath = [gbaSRamURL path]; + [self setGbaSRamPath:thePath]; + [self setGbaSRamName:[thePath lastPathComponent]]; +} + +- (NSURL *) gbaSRamURL +{ + return gbaSRamURL; +} + +- (void) setGbaSRamName:(NSString *)theName +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) gbaSRamName +{ + NSString *sramPath = [self gbaSRamPath]; + return (sramPath != nil) ? [sramPath lastPathComponent] : NSSTRING_STATUS_NO_GBA_SRAM_CHOSEN; +} + +- (void) setGbaSRamPath:(NSString *)thePath +{ + // Do nothing. This is for KVO-compliance only. +} + +- (NSString *) gbaSRamPath +{ + return (gbaSRamURL != nil) ? [gbaSRamURL path] : nil; +} + +- (IBAction) chooseGbaCartridgePath:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_CHOOSE_GBA_CARTRIDGE_PANEL]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_GBA_ROM, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseGbaCartridgePathDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseGbaCartridgePathDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (void) chooseGbaCartridgePathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectURL == nil) + { + return; + } + + [self setGbaCartridgeURL:selectURL]; + [[NSUserDefaults standardUserDefaults] setObject:[selectURL path] forKey:@"Slot2_GBA_CartridgePath"]; + + if ([self isGbaSRamWithCartridge]) + { + NSString *sramPath = [NSString stringWithFormat:@"%@.%s", [[selectURL path] stringByDeletingPathExtension], FILE_EXT_GBA_SRAM]; + [self setGbaSRamURL:[NSURL fileURLWithPath:sramPath]]; + [[NSUserDefaults standardUserDefaults] setObject:sramPath forKey:@"Slot2_GBA_SRAMPath"]; + } + else + { + [self clearSRamPath:self]; + } +} + +- (IBAction) chooseGbaSRamPath:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_CHOOSE_GBA_SRAM_PANEL]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_GBA_SRAM, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseGbaSRamPathDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseGbaSRamPathDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (void) chooseGbaSRamPathDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectURL == nil) + { + return; + } + + [self setGbaSRamURL:selectURL]; + [[NSUserDefaults standardUserDefaults] setObject:[selectURL path] forKey:@"Slot2_GBA_SRAMPath"]; +} + +- (IBAction) clearSRamPath:(id)sender +{ + [self setGbaSRamURL:nil]; + [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"Slot2_GBA_SRAMPath"]; +} + +- (BOOL) isGbaSRamWithCartridge +{ + BOOL result = NO; + NSString *gbaCartPath = [self gbaCartridgePath]; + + if (gbaCartPath == nil) + { + return result; + } + + NSString *sramPath = [NSString stringWithFormat:@"%@.%s", [gbaCartPath stringByDeletingPathExtension], FILE_EXT_GBA_SRAM]; + + NSFileManager *fileManager = [[NSFileManager alloc] init]; + result = [fileManager isReadableFileAtPath:sramPath]; + [fileManager release]; + + return result; +} + +#pragma mark - +#pragma mark Rumble Pak + +- (IBAction) testRumble:(id)sender +{ + NSDictionary *ffProperties = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], @"ffState", + [NSNumber numberWithInteger:RUMBLE_ITERATIONS_TEST], @"iterations", + nil]; + + [[NSNotificationCenter defaultCenter] postNotificationName:@"org.desmume.DeSmuME.sendForceFeedback" + object:nil + userInfo:ffProperties]; +} + +- (void) sendForceFeedback:(NSNotification *)aNotification +{ + if ([self hidManager] == nil) + { + return; + } + + NSDictionary *ffProperties = (NSDictionary *)[aNotification userInfo]; + const BOOL ffState = [(NSNumber *)[ffProperties valueForKey:@"ffState"] boolValue]; + const UInt32 iterations = [(NSNumber *)[ffProperties valueForKey:@"iterations"] unsignedIntValue]; + + NSMutableArray *inputDeviceList = [[[self hidManager] deviceListController] arrangedObjects]; + + for (InputHIDDevice *inputDevice in inputDeviceList) + { + if ([inputDevice isForceFeedbackEnabled]) + { + if (ffState) + { + [inputDevice startForceFeedbackAndIterate:iterations flags:0]; + } + else + { + [inputDevice stopForceFeedback]; + } + } + } +} + +#pragma mark - +#pragma mark Paddle + +- (void) setPaddleDirectWithScalar:(float)scalar +{ + // Clamp the input value. + if (scalar < -1.0f) + { + scalar = -1.0f; + } + + if (scalar > 1.0f) + { + scalar = 1.0f; + } + + // Normalize the input value for the paddle. + const float paddleValue = 256.0f * scalar; + [[self deviceManager] setPaddleValue:(UInt16)paddleValue]; +} + +- (void) setPaddleRelativeWithInteger:(NSInteger)value +{ + NSInteger paddleValue = [[self deviceManager] paddleValue] + value; + [[self deviceManager] setPaddleValue:(UInt16)paddleValue]; +} + +#pragma mark - +#pragma mark NSTableViewDelegate Protocol + +- (void)tableViewSelectionDidChange:(NSNotification *)aNotification +{ + NSTableView *table = (NSTableView *)[aNotification object]; + NSInteger rowIndex = [table selectedRow]; + + if (rowIndex >= 0) + { + CocoaDSSlot2Device *theDevice = nil; + NSArray *selectedObjects = [deviceListController selectedObjects]; + + if ([selectedObjects count] > 0) + { + theDevice = (CocoaDSSlot2Device *)[selectedObjects objectAtIndex:0]; + [self setSelectedDevice:theDevice]; + } + + [self setDeviceViewByDevice:theDevice]; + } + else + { + NSRect frameRect = [currentDeviceView frame]; + [currentDeviceView retain]; + [deviceSettingsBox replaceSubview:currentDeviceView with:viewNoSelection]; + currentDeviceView = viewNoSelection; + [currentDeviceView setFrame:frameRect]; + } +} + +@end diff --git a/desmume/src/cocoa/userinterface/appDelegate.h b/desmume/src/cocoa/userinterface/appDelegate.h index fb789684d..a5310edb1 100644 --- a/desmume/src/cocoa/userinterface/appDelegate.h +++ b/desmume/src/cocoa/userinterface/appDelegate.h @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2011-2013 DeSmuME team + Copyright (C) 2011-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,12 +38,14 @@ NSObjectController *prefWindowController; NSObjectController *cheatWindowController; NSObjectController *cdsCoreController; + NSArrayController *inputDeviceListController; FileMigrationDelegate *migrationDelegate; InputManager *inputManager; NSWindow *prefWindow; NSWindow *troubleshootingWindow; NSWindow *cheatListWindow; + NSWindow *slot2Window; NSView *prefGeneralView; InputPrefsView *inputPrefsView; @@ -68,11 +70,13 @@ @property (readonly) IBOutlet NSObjectController *prefWindowController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSObjectController *cdsCoreController; +@property (readonly) IBOutlet NSArrayController *inputDeviceListController; @property (readonly) IBOutlet FileMigrationDelegate *migrationDelegate; @property (readonly) IBOutlet InputManager *inputManager; @property (readonly) IBOutlet NSWindow *prefWindow; @property (readonly) IBOutlet NSWindow *troubleshootingWindow; @property (readonly) IBOutlet NSWindow *cheatListWindow; +@property (readonly) IBOutlet NSWindow *slot2Window; @property (readonly) IBOutlet NSView *prefGeneralView; @property (readonly) IBOutlet NSMenu *mLoadStateSlot; @property (readonly) IBOutlet NSMenu *mSaveStateSlot; diff --git a/desmume/src/cocoa/userinterface/appDelegate.mm b/desmume/src/cocoa/userinterface/appDelegate.mm index 5dada9d80..d13abc91a 100644 --- a/desmume/src/cocoa/userinterface/appDelegate.mm +++ b/desmume/src/cocoa/userinterface/appDelegate.mm @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2011-2013 DeSmuME team + Copyright (C) 2011-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #import "DisplayWindowController.h" #import "EmuControllerDelegate.h" #import "FileMigrationDelegate.h" +#import "Slot2WindowDelegate.h" #import "preferencesWindowDelegate.h" #import "troubleshootingWindowDelegate.h" #import "cheatWindowDelegate.h" @@ -40,6 +41,7 @@ @synthesize prefWindow; @synthesize troubleshootingWindow; @synthesize cheatListWindow; +@synthesize slot2Window; @synthesize prefGeneralView; @synthesize mLoadStateSlot; @synthesize mSaveStateSlot; @@ -50,6 +52,7 @@ @synthesize romInfoPanelController; @synthesize prefWindowController; @synthesize cdsCoreController; +@synthesize inputDeviceListController; @synthesize cheatWindowController; @synthesize migrationDelegate; @synthesize inputManager; @@ -115,6 +118,7 @@ EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; PreferencesWindowDelegate *prefWindowDelegate = (PreferencesWindowDelegate *)[prefWindow delegate]; CheatWindowDelegate *cheatWindowDelegate = (CheatWindowDelegate *)[cheatListWindow delegate]; + Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2Window delegate]; // Create the needed directories in Application Support if they haven't already // been created. @@ -166,7 +170,8 @@ [self setRomInfoPanelBoxTitleColors]; // Set the preferences window to the general view by default. - [prefWindowDelegate switchContentView:prefGeneralView]; + [[prefWindowDelegate toolbar] setSelectedItemIdentifier:@"General"]; + [prefWindowDelegate changePrefView:self]; // Setup the slot menu items. We set this up manually instead of through Interface // Builder because we're assuming an arbitrary number of slot items. @@ -193,6 +198,11 @@ [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } + // Update the SLOT-2 device list after the emulation core is initialized. + [slot2WindowDelegate update]; + [slot2WindowDelegate setHidManager:[inputManager hidManager]]; + [slot2WindowDelegate setAutoSelectedDeviceText:[[slot2WindowDelegate deviceManager] autoSelectedDeviceName]]; + // Start up the threads for our outputs. [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newSpeaker withObject:nil]; @@ -417,6 +427,7 @@ { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate]; + Slot2WindowDelegate *slot2WindowDelegate = (Slot2WindowDelegate *)[slot2Window delegate]; NSMutableDictionary *prefBindings = [prefWindowDelegate bindings]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; @@ -571,7 +582,7 @@ } else { - [prefBindings setValue:NSSTRING_STATUS_AUTOLOAD_ROM_NAME_NONE forKey:@"AutoloadRomName"]; + [prefBindings setValue:NSSTRING_STATUS_NO_ROM_CHOSEN forKey:@"AutoloadRomName"]; } // Set the menu for the display rotation. @@ -591,6 +602,15 @@ } [inputManager setMappingsWithMappings:userMappings]; + [[inputManager hidManager] setDeviceListController:inputDeviceListController]; + + // Set up the default SLOT-2 device. + [slot2WindowDelegate setMpcfFolderURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_MPCF_DirectoryPath"]]]; + [slot2WindowDelegate setMpcfDiskImageURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_MPCF_DiskImagePath"]]]; + [slot2WindowDelegate setGbaCartridgeURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_GBA_CartridgePath"]]]; + [slot2WindowDelegate setGbaSRamURL:[NSURL fileURLWithPath:[[NSUserDefaults standardUserDefaults] stringForKey:@"Slot2_GBA_SRAMPath"]]]; + [slot2WindowDelegate selectDeviceByType:[[NSUserDefaults standardUserDefaults] integerForKey:@"Slot2_LoadedDevice"]]; + [slot2WindowDelegate applySettings:nil]; // Set up the rest of the emulation-related user defaults. [emuControl setupUserDefaults]; diff --git a/desmume/src/cocoa/userinterface/inputPrefsView.h b/desmume/src/cocoa/userinterface/inputPrefsView.h index e8a3895c4..c815a0f22 100644 --- a/desmume/src/cocoa/userinterface/inputPrefsView.h +++ b/desmume/src/cocoa/userinterface/inputPrefsView.h @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2013 DeSmuME team + Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,6 +45,7 @@ NSWindow *inputSettingsSaveStateSlot; NSWindow *inputSettingsSetSpeedLimit; NSWindow *inputSettingsGPUState; + NSWindow *inputSettingsPaddleController; InputManager *inputManager; NSString *configInputTargetID; @@ -75,6 +76,7 @@ @property (readonly) IBOutlet NSWindow *inputSettingsSaveStateSlot; @property (readonly) IBOutlet NSWindow *inputSettingsSetSpeedLimit; @property (readonly) IBOutlet NSWindow *inputSettingsGPUState; +@property (readonly) IBOutlet NSWindow *inputSettingsPaddleController; @property (readonly) IBOutlet InputManager *inputManager; @property (retain) NSString *configInputTargetID; diff --git a/desmume/src/cocoa/userinterface/inputPrefsView.mm b/desmume/src/cocoa/userinterface/inputPrefsView.mm index b733d6d19..b3c2ae9b1 100644 --- a/desmume/src/cocoa/userinterface/inputPrefsView.mm +++ b/desmume/src/cocoa/userinterface/inputPrefsView.mm @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2013 DeSmuME team + Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,6 +42,7 @@ @synthesize inputSettingsSaveStateSlot; @synthesize inputSettingsSetSpeedLimit; @synthesize inputSettingsGPUState; +@synthesize inputSettingsPaddleController; @synthesize inputProfileSheet; @synthesize inputProfileRenameSheet; @synthesize inputManager; @@ -173,6 +174,7 @@ inputSettingsSaveStateSlot, @"Save State Slot", inputSettingsSetSpeedLimit, @"Set Speed", inputSettingsGPUState, @"Enable/Disable GPU State", + inputSettingsPaddleController, @"Paddle", nil]; } diff --git a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h index 0b1707125..315108ac4 100644 --- a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h +++ b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2013 DeSmuME team + Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ { NSObject *dummyObject; NSWindow *window; + NSToolbar *toolbar; NSWindow *firmwareConfigSheet; NSObjectController *cdsCoreController; NSObjectController *emuController; @@ -42,6 +43,7 @@ NSView *viewDisplay; NSView *viewSound; NSView *viewEmulation; + NSDictionary *prefViewDict; NSPopUpButton *displayRotationMenu; NSMenuItem *displayRotationMenuCustomItem; @@ -62,6 +64,7 @@ @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; +@property (readonly) IBOutlet NSToolbar *toolbar; @property (readonly) IBOutlet NSWindow *firmwareConfigSheet; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSObjectController *emuController; @@ -83,11 +86,7 @@ @property (readonly) NSMutableDictionary *bindings; -- (IBAction) showGeneralView:(id)sender; -- (IBAction) showInputView:(id)sender; -- (IBAction) showDisplayView:(id)sender; -- (IBAction) showSoundView:(id)sender; -- (IBAction) showEmulationView:(id)sender; +- (IBAction) changePrefView:(id)sender; - (IBAction) chooseAdvansceneDatabase:(id)sender; - (void) chooseAdvansceneDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; diff --git a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm index 7001f6063..44cf203c4 100644 --- a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm +++ b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2013 DeSmuME team + Copyright (C) 2012-2014 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ @synthesize dummyObject; @synthesize window; +@synthesize toolbar; @synthesize firmwareConfigSheet; @synthesize cdsCoreController; @synthesize emuController; @@ -113,6 +114,8 @@ [bindings setObject:iconVolumeFull forKey:@"volumeIconImage"]; + prefViewDict = nil; + return self; } @@ -124,34 +127,36 @@ [iconVolumeMute release]; [bindings release]; [videoFilter release]; + [prefViewDict release]; [super dealloc]; } -- (IBAction) showGeneralView:(id)sender +- (IBAction) changePrefView:(id)sender { - [self switchContentView:viewGeneral]; -} - -- (IBAction) showInputView:(id)sender -{ - [self switchContentView:(NSView *)viewInput]; - [window makeFirstResponder:(NSView *)viewInput]; -} - -- (IBAction) showDisplayView:(id)sender -{ - [self switchContentView:viewDisplay]; -} - -- (IBAction) showSoundView:(id)sender -{ - [self switchContentView:viewSound]; -} - -- (IBAction) showEmulationView:(id)sender -{ - [self switchContentView:viewEmulation]; + if (prefViewDict == nil) + { + // Associates NSView objects to their respective toolbar identifiers. + prefViewDict = [[NSDictionary alloc] initWithObjectsAndKeys: + viewGeneral, @"General", + viewInput, @"Input", + viewDisplay, @"Display", + viewSound, @"Sound", + viewEmulation, @"Emulation", + nil]; + } + + NSString *toolbarItemIdentifier = [[self toolbar] selectedItemIdentifier]; + NSView *theView = [prefViewDict objectForKey:toolbarItemIdentifier]; + if (theView != nil) + { + [self switchContentView:theView]; + + if ([toolbarItemIdentifier isEqualToString:@"Input"]) + { + [window makeFirstResponder:theView]; + } + } } - (IBAction) chooseRomForAutoload:(id)sender