Cocoa Port:

- Convert cocoa_util.m from Obj-C to Obj-C++, and add many new utility methods.
- Remove obsolete globals.h file, and convert needed C functions into Obj-C methods in cocoa_util.mm.
- Add cocoa_file.mm for general file handling methods.
- Change all file handling to use NSURLs instead of NSString paths.
- Refactor existing code to use the new methods.
- Remove obsolete UI code.
- Move Tiger-specific compatibility code to a new file, macosx_10_4_compat.h.
This commit is contained in:
rogerman 2012-01-06 08:53:13 +00:00
parent 5f0805e306
commit cf86f83fb0
23 changed files with 2092 additions and 820 deletions

View File

@ -25,7 +25,6 @@
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
956B96C313DF4CF900FCDCD0 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */; }; 956B96C313DF4CF900FCDCD0 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */; };
AB06CB57135B8A4D00E977B3 /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; }; AB06CB57135B8A4D00E977B3 /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; };
AB06CB58135B8A4D00E977B3 /* cocoa_util.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */; };
AB06CB59135B8A4D00E977B3 /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; }; AB06CB59135B8A4D00E977B3 /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; };
AB06CB5A135B8A4D00E977B3 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; }; AB06CB5A135B8A4D00E977B3 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; };
AB06CB5B135B8A4D00E977B3 /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; }; AB06CB5B135B8A4D00E977B3 /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; };
@ -36,7 +35,6 @@
AB06CB60135B8A4D00E977B3 /* screenshot.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB54135B8A4D00E977B3 /* screenshot.mm */; }; AB06CB60135B8A4D00E977B3 /* screenshot.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB54135B8A4D00E977B3 /* screenshot.mm */; };
AB06CB62135B8A4D00E977B3 /* video_output_view.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB56135B8A4D00E977B3 /* video_output_view.mm */; }; AB06CB62135B8A4D00E977B3 /* video_output_view.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB56135B8A4D00E977B3 /* video_output_view.mm */; };
AB06CB63135B8A4D00E977B3 /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; }; AB06CB63135B8A4D00E977B3 /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; };
AB06CB64135B8A4D00E977B3 /* cocoa_util.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */; };
AB06CB65135B8A4D00E977B3 /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; }; AB06CB65135B8A4D00E977B3 /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; };
AB06CB66135B8A4D00E977B3 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; }; AB06CB66135B8A4D00E977B3 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; };
AB06CB67135B8A4D00E977B3 /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; }; AB06CB67135B8A4D00E977B3 /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; };
@ -232,7 +230,6 @@
AB0A0D1E14AACACC00E83E91 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; AB0A0D1E14AACACC00E83E91 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; };
AB0A0D3714AACE9500E83E91 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; AB0A0D3714AACE9500E83E91 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; };
AB0A0D3A14AACE9500E83E91 /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; }; AB0A0D3A14AACE9500E83E91 /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; };
AB0A0D3B14AACE9500E83E91 /* cocoa_util.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */; };
AB0A0D3C14AACE9500E83E91 /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; }; AB0A0D3C14AACE9500E83E91 /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; };
AB0A0D3D14AACE9500E83E91 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; }; AB0A0D3D14AACE9500E83E91 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; };
AB0A0D3E14AACE9500E83E91 /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; }; AB0A0D3E14AACE9500E83E91 /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; };
@ -378,10 +375,19 @@
AB46781714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB46781714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; };
AB46781814ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB46781814ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; };
AB46781914ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB46781914ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; };
AB8FE37614B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; };
AB8FE37714B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; };
AB8FE37814B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; };
AB8FE37914B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; };
AB8FE48C14B6657D009E20B1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; };
ABBF04BD14B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; }; ABBF04BD14B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; };
ABBF04BE14B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; }; ABBF04BE14B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; };
ABBF04BF14B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; }; ABBF04BF14B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; };
ABBF04C014B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; }; ABBF04C014B519A500E505A0 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04BC14B519A500E505A0 /* MainMenu (Legacy).xib */; };
ABBF053014B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; };
ABBF053114B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; };
ABBF053214B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; };
ABBF053314B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; };
ABF4007714B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; ABF4007714B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; };
ABF4007814B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; ABF4007814B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; };
ABF4007914B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; ABF4007914B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; };
@ -392,7 +398,6 @@
ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; };
ABFE4242143E32F0009A3CCE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; ABFE4242143E32F0009A3CCE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; };
ABFE4245143E32F0009A3CCE /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; }; ABFE4245143E32F0009A3CCE /* about.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4B135B8A4D00E977B3 /* about.m */; };
ABFE4246143E32F0009A3CCE /* cocoa_util.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */; };
ABFE4247143E32F0009A3CCE /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; }; ABFE4247143E32F0009A3CCE /* screen_state.m in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4D135B8A4D00E977B3 /* screen_state.m */; };
ABFE4248143E32F0009A3CCE /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; }; ABFE4248143E32F0009A3CCE /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */; };
ABFE4249143E32F0009A3CCE /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; }; ABFE4249143E32F0009A3CCE /* input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4F135B8A4D00E977B3 /* input.mm */; };
@ -519,7 +524,6 @@
7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = "<group>"; }; 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = "<group>"; };
956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1_retail_nand.cpp; path = ../addons/slot1_retail_nand.cpp; sourceTree = SOURCE_ROOT; }; 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1_retail_nand.cpp; path = ../addons/slot1_retail_nand.cpp; sourceTree = SOURCE_ROOT; };
AB06CB41135B8A4D00E977B3 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = "<group>"; }; AB06CB41135B8A4D00E977B3 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = "<group>"; };
AB06CB42135B8A4D00E977B3 /* globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = globals.h; sourceTree = "<group>"; };
AB06CB43135B8A4D00E977B3 /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = "<group>"; }; AB06CB43135B8A4D00E977B3 /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = "<group>"; };
AB06CB44135B8A4D00E977B3 /* main_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main_window.h; sourceTree = "<group>"; }; AB06CB44135B8A4D00E977B3 /* main_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main_window.h; sourceTree = "<group>"; };
AB06CB45135B8A4D00E977B3 /* nds_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nds_control.h; sourceTree = "<group>"; }; AB06CB45135B8A4D00E977B3 /* nds_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nds_control.h; sourceTree = "<group>"; };
@ -529,7 +533,6 @@
AB06CB49135B8A4D00E977B3 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = "<group>"; }; AB06CB49135B8A4D00E977B3 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = "<group>"; };
AB06CB4A135B8A4D00E977B3 /* video_output_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_output_view.h; sourceTree = "<group>"; }; AB06CB4A135B8A4D00E977B3 /* video_output_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_output_view.h; sourceTree = "<group>"; };
AB06CB4B135B8A4D00E977B3 /* about.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = about.m; sourceTree = "<group>"; }; AB06CB4B135B8A4D00E977B3 /* about.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = about.m; sourceTree = "<group>"; };
AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoa_util.m; sourceTree = "<group>"; };
AB06CB4D135B8A4D00E977B3 /* screen_state.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = screen_state.m; sourceTree = "<group>"; }; AB06CB4D135B8A4D00E977B3 /* screen_state.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = screen_state.m; sourceTree = "<group>"; };
AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = "<group>"; }; AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = "<group>"; };
AB06CB4F135B8A4D00E977B3 /* input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = input.mm; sourceTree = "<group>"; }; AB06CB4F135B8A4D00E977B3 /* input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = input.mm; sourceTree = "<group>"; };
@ -750,6 +753,9 @@
AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = "<group>"; }; AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = "<group>"; };
AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = "<group>"; }; AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = "<group>"; };
AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = "<group>"; }; AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = "<group>"; };
AB8FE30A14B647D6009E20B1 /* macosx_10_4_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macosx_10_4_compat.h; sourceTree = "<group>"; };
AB8FE37414B652EC009E20B1 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = "<group>"; };
AB8FE37514B652EC009E20B1 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = "<group>"; };
ABBF045E14B5144D00E505A0 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = "translations/English.lproj/MainMenu (Legacy).xib"; sourceTree = "<group>"; }; ABBF045E14B5144D00E505A0 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = "translations/English.lproj/MainMenu (Legacy).xib"; sourceTree = "<group>"; };
ABBF04C114B519CD00E505A0 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = "translations/French.lproj/MainMenu (Legacy).xib"; sourceTree = "<group>"; }; ABBF04C114B519CD00E505A0 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = "translations/French.lproj/MainMenu (Legacy).xib"; sourceTree = "<group>"; };
ABBF04C314B519DF00E505A0 /* Italian */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Italian; path = "translations/Italian.lproj/MainMenu (Legacy).xib"; sourceTree = "<group>"; }; ABBF04C314B519DF00E505A0 /* Italian */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Italian; path = "translations/Italian.lproj/MainMenu (Legacy).xib"; sourceTree = "<group>"; };
@ -760,6 +766,8 @@
ABBF04CB14B51BBB00E505A0 /* Chinese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Chinese; path = translations/Chinese.lproj/Localizable.strings; sourceTree = "<group>"; }; ABBF04CB14B51BBB00E505A0 /* Chinese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Chinese; path = translations/Chinese.lproj/Localizable.strings; sourceTree = "<group>"; };
ABBF04CC14B51BC300E505A0 /* Norwegian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Norwegian; path = translations/Norwegian.lproj/Localizable.strings; sourceTree = "<group>"; }; ABBF04CC14B51BC300E505A0 /* Norwegian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Norwegian; path = translations/Norwegian.lproj/Localizable.strings; sourceTree = "<group>"; };
ABBF04CD14B51BC900E505A0 /* Romanian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Romanian; path = translations/Romanian.lproj/Localizable.strings; sourceTree = "<group>"; }; ABBF04CD14B51BC900E505A0 /* Romanian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Romanian; path = translations/Romanian.lproj/Localizable.strings; sourceTree = "<group>"; };
ABBF052F14B5436E00E505A0 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = "<group>"; };
ABBF053B14B543B600E505A0 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = "<group>"; };
ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = "<group>"; }; ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = "<group>"; };
ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = "<group>"; }; ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = "<group>"; };
ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = "<group>"; }; ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = "<group>"; };
@ -814,6 +822,7 @@
ABFE42AF143E32F0009A3CCE /* AudioUnit.framework in Frameworks */, ABFE42AF143E32F0009A3CCE /* AudioUnit.framework in Frameworks */,
ABFE42B0143E32F0009A3CCE /* AppKit.framework in Frameworks */, ABFE42B0143E32F0009A3CCE /* AppKit.framework in Frameworks */,
ABFE42B1143E32F0009A3CCE /* Foundation.framework in Frameworks */, ABFE42B1143E32F0009A3CCE /* Foundation.framework in Frameworks */,
AB8FE48C14B6657D009E20B1 /* libz.dylib in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -825,10 +834,12 @@
children = ( children = (
AB06CEC4135B8E0B00E977B3 /* dialogs */, AB06CEC4135B8E0B00E977B3 /* dialogs */,
ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */, ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */,
ABBF053B14B543B600E505A0 /* cocoa_file.h */,
ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */, ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */,
AB06CB41135B8A4D00E977B3 /* cocoa_input.h */, AB06CB41135B8A4D00E977B3 /* cocoa_input.h */,
AB06CB42135B8A4D00E977B3 /* globals.h */, AB8FE37414B652EC009E20B1 /* cocoa_util.h */,
AB06CB43135B8A4D00E977B3 /* input.h */, AB06CB43135B8A4D00E977B3 /* input.h */,
AB8FE30A14B647D6009E20B1 /* macosx_10_4_compat.h */,
AB06CB44135B8A4D00E977B3 /* main_window.h */, AB06CB44135B8A4D00E977B3 /* main_window.h */,
AB06CB45135B8A4D00E977B3 /* nds_control.h */, AB06CB45135B8A4D00E977B3 /* nds_control.h */,
AB06CB46135B8A4D00E977B3 /* preferences.h */, AB06CB46135B8A4D00E977B3 /* preferences.h */,
@ -837,9 +848,10 @@
AB06CB49135B8A4D00E977B3 /* sndOSX.h */, AB06CB49135B8A4D00E977B3 /* sndOSX.h */,
AB06CB4A135B8A4D00E977B3 /* video_output_view.h */, AB06CB4A135B8A4D00E977B3 /* video_output_view.h */,
AB06CB4B135B8A4D00E977B3 /* about.m */, AB06CB4B135B8A4D00E977B3 /* about.m */,
AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */,
AB06CB4D135B8A4D00E977B3 /* screen_state.m */, AB06CB4D135B8A4D00E977B3 /* screen_state.m */,
ABBF052F14B5436E00E505A0 /* cocoa_file.mm */,
AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */, AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */,
AB8FE37514B652EC009E20B1 /* cocoa_util.mm */,
AB06CB4F135B8A4D00E977B3 /* input.mm */, AB06CB4F135B8A4D00E977B3 /* input.mm */,
AB06CB51135B8A4D00E977B3 /* main.mm */, AB06CB51135B8A4D00E977B3 /* main.mm */,
AB06CB50135B8A4D00E977B3 /* main_window.mm */, AB06CB50135B8A4D00E977B3 /* main_window.mm */,
@ -1446,7 +1458,6 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
AB06CB63135B8A4D00E977B3 /* about.m in Sources */, AB06CB63135B8A4D00E977B3 /* about.m in Sources */,
AB06CB64135B8A4D00E977B3 /* cocoa_util.m in Sources */,
AB06CB65135B8A4D00E977B3 /* screen_state.m in Sources */, AB06CB65135B8A4D00E977B3 /* screen_state.m in Sources */,
AB06CB66135B8A4D00E977B3 /* cocoa_input.mm in Sources */, AB06CB66135B8A4D00E977B3 /* cocoa_input.mm in Sources */,
AB06CB67135B8A4D00E977B3 /* input.mm in Sources */, AB06CB67135B8A4D00E977B3 /* input.mm in Sources */,
@ -1557,6 +1568,8 @@
7FA912261426523900E2ABDD /* tinyxmlerror.cpp in Sources */, 7FA912261426523900E2ABDD /* tinyxmlerror.cpp in Sources */,
7FA912271426523900E2ABDD /* tinyxmlparser.cpp in Sources */, 7FA912271426523900E2ABDD /* tinyxmlparser.cpp in Sources */,
ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */, ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */,
ABBF053314B5436E00E505A0 /* cocoa_file.mm in Sources */,
AB8FE37914B652EC009E20B1 /* cocoa_util.mm in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -1565,7 +1578,6 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
AB06CB57135B8A4D00E977B3 /* about.m in Sources */, AB06CB57135B8A4D00E977B3 /* about.m in Sources */,
AB06CB58135B8A4D00E977B3 /* cocoa_util.m in Sources */,
AB06CB59135B8A4D00E977B3 /* screen_state.m in Sources */, AB06CB59135B8A4D00E977B3 /* screen_state.m in Sources */,
AB06CB5A135B8A4D00E977B3 /* cocoa_input.mm in Sources */, AB06CB5A135B8A4D00E977B3 /* cocoa_input.mm in Sources */,
AB06CB5B135B8A4D00E977B3 /* input.mm in Sources */, AB06CB5B135B8A4D00E977B3 /* input.mm in Sources */,
@ -1666,6 +1678,8 @@
7FA912221426523900E2ABDD /* tinyxmlerror.cpp in Sources */, 7FA912221426523900E2ABDD /* tinyxmlerror.cpp in Sources */,
7FA912231426523900E2ABDD /* tinyxmlparser.cpp in Sources */, 7FA912231426523900E2ABDD /* tinyxmlparser.cpp in Sources */,
ABF4007F14B4F1C000578AE7 /* sndOSX.cpp in Sources */, ABF4007F14B4F1C000578AE7 /* sndOSX.cpp in Sources */,
ABBF053014B5436E00E505A0 /* cocoa_file.mm in Sources */,
AB8FE37714B652EC009E20B1 /* cocoa_util.mm in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -1674,7 +1688,6 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
AB0A0D3A14AACE9500E83E91 /* about.m in Sources */, AB0A0D3A14AACE9500E83E91 /* about.m in Sources */,
AB0A0D3B14AACE9500E83E91 /* cocoa_util.m in Sources */,
AB0A0D3C14AACE9500E83E91 /* screen_state.m in Sources */, AB0A0D3C14AACE9500E83E91 /* screen_state.m in Sources */,
AB0A0D3D14AACE9500E83E91 /* cocoa_input.mm in Sources */, AB0A0D3D14AACE9500E83E91 /* cocoa_input.mm in Sources */,
AB0A0D3E14AACE9500E83E91 /* input.mm in Sources */, AB0A0D3E14AACE9500E83E91 /* input.mm in Sources */,
@ -1775,6 +1788,8 @@
AB0A0D9F14AACE9500E83E91 /* tinyxmlerror.cpp in Sources */, AB0A0D9F14AACE9500E83E91 /* tinyxmlerror.cpp in Sources */,
AB0A0DA014AACE9500E83E91 /* tinyxmlparser.cpp in Sources */, AB0A0DA014AACE9500E83E91 /* tinyxmlparser.cpp in Sources */,
ABF4008014B4F1C000578AE7 /* sndOSX.cpp in Sources */, ABF4008014B4F1C000578AE7 /* sndOSX.cpp in Sources */,
ABBF053114B5436E00E505A0 /* cocoa_file.mm in Sources */,
AB8FE37614B652EC009E20B1 /* cocoa_util.mm in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -1783,7 +1798,6 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
ABFE4245143E32F0009A3CCE /* about.m in Sources */, ABFE4245143E32F0009A3CCE /* about.m in Sources */,
ABFE4246143E32F0009A3CCE /* cocoa_util.m in Sources */,
ABFE4247143E32F0009A3CCE /* screen_state.m in Sources */, ABFE4247143E32F0009A3CCE /* screen_state.m in Sources */,
ABFE4248143E32F0009A3CCE /* cocoa_input.mm in Sources */, ABFE4248143E32F0009A3CCE /* cocoa_input.mm in Sources */,
ABFE4249143E32F0009A3CCE /* input.mm in Sources */, ABFE4249143E32F0009A3CCE /* input.mm in Sources */,
@ -1884,6 +1898,8 @@
ABFE42AA143E32F0009A3CCE /* tinyxmlerror.cpp in Sources */, ABFE42AA143E32F0009A3CCE /* tinyxmlerror.cpp in Sources */,
ABFE42AB143E32F0009A3CCE /* tinyxmlparser.cpp in Sources */, ABFE42AB143E32F0009A3CCE /* tinyxmlparser.cpp in Sources */,
ABF4008114B4F1C000578AE7 /* sndOSX.cpp in Sources */, ABF4008114B4F1C000578AE7 /* sndOSX.cpp in Sources */,
ABBF053214B5436E00E505A0 /* cocoa_file.mm in Sources */,
AB8FE37814B652EC009E20B1 /* cocoa_util.mm in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@ -1,20 +1,19 @@
/* Copyright (C) 2011 Roger Manuel /*
Copyright (C) 2011 Roger Manuel
This file is part of DeSmuME Copyright (C) 2012 DeSmuME team
DeSmuME is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
DeSmuME is distributed in the hope that it will be useful, This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software along with the this software. If not, see <http://www.gnu.org/licenses/>.
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifdef __OBJC__ #ifdef __OBJC__
@ -23,4 +22,5 @@
#define DESMUME_COCOA #define DESMUME_COCOA
#define HAVE_OPENGL #define HAVE_OPENGL
#define HAVE_LIBZ #define HAVE_LIBZ
#define PORT_VERSION "Cocoa"

View File

@ -1,27 +1,29 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME This file is free software: you can redistribute it and/or modify
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
DeSmuME is distributed in the hope that it will be useful, This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software along with the this software. If not, see <http://www.gnu.org/licenses/>.
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "globals.h" #import <Cocoa/Cocoa.h>
#define STRING_DESMUME_WEBSITE "http://www.desmume.org" #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
#define STRING_DESMUME_FORUM_SITE "http://forums.desmume.org/index.php" #include "macosx_10_4_compat.h"
#define STRING_DESMUME_BUG_SITE "http://sourceforge.net/tracker/?group_id=164579&atid=832291" #endif
#import "cocoa_globals.h"
#define STRING_FILENAME_README "README" #define STRING_FILENAME_README "README"
#define STRING_FILENAME_COPYING "COPYING" #define STRING_FILENAME_COPYING "COPYING"

View File

@ -0,0 +1,65 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 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 <http://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
#include "macosx_10_4_compat.h"
#endif
@interface CocoaDSFile : NSDocument
{
}
+ (BOOL) loadState:(NSURL *)saveStateURL;
+ (BOOL) saveState:(NSURL *)saveStateURL;
+ (BOOL) loadRom:(NSURL *)romURL;
+ (BOOL) importRomSave:(NSURL *)romSaveURL;
+ (BOOL) exportRomSave:(NSURL *)romSaveURL;
+ (NSURL *) romSaveURLFromRomURL:(NSURL *)romURL;
+ (NSURL *) cheatsURLFromRomURL:(NSURL *)romURL;
+ (BOOL) romSaveExists:(NSURL *)romURL;
+ (BOOL) romSaveExistsWithRom:(NSURL *)romURL;
+ (void) setupAllFilePaths;
+ (BOOL) setupAllAppDirectories;
+ (NSURL *) saveStateURL;
+ (BOOL) saveStateExistsForSlot:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber;
+ (BOOL) isSaveStateSlotExtension:(NSString *)extension;
+ (NSString *) getSaveSlotFileName:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber;
+ (NSString *) fileKind:(NSURL *)fileURL;
+ (NSString *) fileVersion:(NSURL *)fileURL;
+ (BOOL) fileExistsForCurrent:(NSURL *)fileURL;
+ (NSURL *) getURLUserAppSupportByKind:(NSString *)fileKind;
+ (NSURL *) getBaseURLUserAppSupport;
+ (NSURL *) getURLUserAppSupport:(NSString *)directoryName appVersion:(NSString *)appVersion;
+ (BOOL) createUserAppSupportDirectory:(NSString *)directoryName;
+ (NSURL *) lastLoadedRomURL;
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4
+ (BOOL) moveFileToCurrentDirectory:(NSURL *)fileURL;
+ (BOOL) copyFileToCurrentDirectory:(NSURL *)fileURL;
+ (BOOL) moveFileListToCurrent:(NSMutableArray *)fileList;
+ (BOOL) copyFileListToCurrent:(NSMutableArray *)fileList;
+ (NSMutableArray *) completeFileList;
+ (NSMutableArray *) appFileList:(NSURL *)directoryURL;
+ (NSMutableArray *) appFileList:(NSURL *)directoryURL fileKind:(NSString *)theFileKind;
#endif
@end

View File

@ -0,0 +1,835 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 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 <http://www.gnu.org/licenses/>.
*/
#import "cocoa_file.h"
#include <libkern/OSAtomic.h>
#import "cocoa_globals.h"
#import "cocoa_util.h"
#include "../NDSSystem.h"
#include "../path.h"
#include "../saves.h"
#undef BOOL
@implementation CocoaDSFile
+ (BOOL) loadState:(NSURL *)saveStateURL
{
BOOL result = NO;
if (saveStateURL == nil)
{
return result;
}
const char *statePath = [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding];
bool cResult = savestate_load(statePath);
if(cResult)
{
result = YES;
}
return result;
}
+ (BOOL) saveState:(NSURL *)saveStateURL
{
BOOL result = NO;
if (saveStateURL == nil)
{
return result;
}
const char *statePath = [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding];
bool cResult = savestate_save(statePath);
if(cResult)
{
result = YES;
}
return result;
}
+ (BOOL) loadRom:(NSURL *)romURL
{
BOOL result = NO;
if (romURL == nil)
{
return result;
}
const char *romPath = [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding];
NSInteger resultCode = NDS_LoadROM(romPath, nil);
if (resultCode > 0)
{
result = YES;
}
return result;
}
+ (BOOL) importRomSave:(NSURL *)romSaveURL
{
BOOL result = NO;
const char *romSavePath = [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding];
NSInteger resultCode = NDS_ImportSave(romSavePath);
if (resultCode == 0)
{
return result;
}
result = YES;
return result;
}
+ (BOOL) exportRomSave:(NSURL *)romSaveURL
{
BOOL result = NO;
const char *romSavePath = [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding];
NSInteger resultCode = NDS_ExportSave(romSavePath);
if (resultCode == 0)
{
return result;
}
result = YES;
return result;
}
+ (NSURL *) romSaveURLFromRomURL:(NSURL *)romURL
{
return [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE]];
}
+ (NSURL *) cheatsURLFromRomURL:(NSURL *)romURL
{
return [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:@FILE_EXT_CHEAT]];
}
+ (BOOL) romSaveExists:(NSURL *)romURL
{
BOOL exists = NO;
if (romURL == nil)
{
return exists;
}
NSString *romSaveFileName = [[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE] lastPathComponent];
NSURL *romSaveURL = [CocoaDSFile getURLUserAppSupport:@BATTERYKEY appVersion:nil];
NSString *romSavePath = [romSaveURL path];
romSavePath = [romSavePath stringByAppendingPathComponent:romSaveFileName];
NSFileManager *fileManager = [[NSFileManager alloc] init];
exists = [fileManager isReadableFileAtPath:romSavePath];
[fileManager release];
return exists;
}
+ (BOOL) romSaveExistsWithRom:(NSURL *)romURL
{
BOOL exists = NO;
if (romURL == nil)
{
return exists;
}
NSString *romSavePath = [[CocoaDSFile romSaveURLFromRomURL:romURL] path];
NSFileManager *fileManager = [[NSFileManager alloc] init];
exists = [fileManager isReadableFileAtPath:romSavePath];
[fileManager release];
return exists;
}
+ (void) setupAllFilePaths
{
NSURL *romURL = [CocoaDSFile getURLUserAppSupport:@ROMKEY appVersion:nil];
NSURL *romSaveURL = [CocoaDSFile getURLUserAppSupport:@BATTERYKEY appVersion:nil];
NSURL *saveStateURL = [CocoaDSFile getURLUserAppSupport:@STATEKEY appVersion:nil];
NSURL *screenshotURL = [CocoaDSFile getURLUserAppSupport:@SCREENSHOTKEY appVersion:nil];
NSURL *aviURL = [CocoaDSFile getURLUserAppSupport:@AVIKEY appVersion:nil];
NSURL *cheatURL = [CocoaDSFile getURLUserAppSupport:@CHEATKEY appVersion:nil];
NSURL *soundSamplesURL = [CocoaDSFile getURLUserAppSupport:@SOUNDKEY appVersion:nil];
NSURL *firmwareURL = [CocoaDSFile getURLUserAppSupport:@FIRMWAREKEY appVersion:nil];
NSURL *luaURL = [CocoaDSFile getURLUserAppSupport:@LUAKEY appVersion:nil];
strlcpy(path.pathToRoms, [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToBattery, [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToStates, [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToScreenshots, [[screenshotURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToAviFiles, [[aviURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToCheats, [[cheatURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToSounds, [[soundSamplesURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToFirmware, [[firmwareURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
strlcpy(path.pathToLua, [[luaURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH);
}
+ (BOOL) setupAllAppDirectories
{
BOOL result = NO;
if (![CocoaDSFile createUserAppSupportDirectory:@BATTERYKEY])
{
return result;
}
if (![CocoaDSFile createUserAppSupportDirectory:@STATEKEY])
{
return result;
}
if (![CocoaDSFile createUserAppSupportDirectory:@CHEATKEY])
{
return result;
}
result = YES;
return result;
}
+ (NSURL *) saveStateURL
{
return [CocoaDSFile getURLUserAppSupport:@STATEKEY appVersion:nil];
}
/********************************************************************************************
fileKind:
Determines a DeSmuME file's type, and returns a description as a string.
Takes:
fileURL - An NSURL that points to a file.
Returns:
An NSString representing the file type. The NSString will be nil if the file
type is not recognized as a DeSmuME file.
Details:
This is not the most reliable method for determining a file's type. The current
implementation simply checks the file extension to determine the file type.
Future implementations could be made more reliable by actually opening the file
and validating some header info.
********************************************************************************************/
+ (NSString *) fileKind:(NSURL *)fileURL
{
NSString *fileKind = nil;
if (fileURL == nil)
{
return fileKind;
}
NSString *fileExt = [[fileURL path] pathExtension];
if ([fileExt isEqualToString:@FILE_EXT_ROM_SAVE])
{
fileKind = @"ROM Save";
}
else if ([fileExt isEqualToString:@FILE_EXT_CHEAT])
{
fileKind = @"Cheat File";
}
else if ([fileExt isEqualToString:@FILE_EXT_FIRMWARE_CONFIG])
{
fileKind = @"Firmware Configuration";
}
else if ([CocoaDSFile isSaveStateSlotExtension:fileExt])
{
fileKind = @"Save State";
}
else if ([fileExt isEqualToString:@FILE_EXT_ROM_DS])
{
fileKind = @"DS ROM";
}
else if ([fileExt isEqualToString:@FILE_EXT_ROM_GBA])
{
fileKind = @"GBA ROM";
}
return fileKind;
}
+ (NSString *) fileVersion:(NSURL *)fileURL
{
NSString *fileVersion = @"Unknown Version";
if (fileURL == nil)
{
return fileVersion;
}
NSString *versionStr = nil;
NSString *portStr = nil;
NSString *filePath = [fileURL path];
NSURL *versionURL = nil;
NSString *versionPath = @PATH_CONFIG_DIRECTORY_0_9_6;
versionPath = [versionPath stringByExpandingTildeInPath];
if ([[filePath stringByDeletingLastPathComponent] isEqualToString:versionPath])
{
versionStr = @"0.9.6";
portStr = @"GTK";
}
versionURL = [CocoaDSFile getURLUserAppSupport:nil appVersion:@"0.9.7"];
versionPath = [versionURL path];
if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath])
{
versionStr = @"0.9.7";
portStr = @"Cocoa";
}
versionURL = [CocoaDSFile getURLUserAppSupport:nil appVersion:@"0.9.8"];
versionPath = [versionURL path];
if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath])
{
versionStr = @"0.9.8";
portStr = @"Cocoa";
}
fileVersion = [[versionStr stringByAppendingString:@" "] stringByAppendingString:portStr];
return fileVersion;
}
+ (BOOL) fileExistsForCurrent:(NSURL *)fileURL
{
BOOL result = NO;
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSDictionary *versionSearchDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"VersionPaths" ofType:@"plist"]];
if (fileURL == nil)
{
return result;
}
else if (currentVersion == nil)
{
NSLog(@"Could not read the main application bundle!");
return result;
}
else if (versionSearchDict == nil)
{
NSLog(@"Could not read the version plist file!");
return result;
}
NSDictionary *versionDict = [versionSearchDict valueForKey:currentVersion];
NSDictionary *portDict = [versionDict valueForKey:@PORT_VERSION];
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSString *existsPath = [[CocoaDSFile getURLUserAppSupportByKind:[CocoaDSFile fileKind:fileURL]] path];
if (existsPath == nil)
{
return result;
}
existsPath = [existsPath stringByAppendingPathComponent:[[fileURL path] lastPathComponent]];
result = [fileManager fileExistsAtPath:existsPath];
[fileManager release];
return result;
}
+ (NSURL *) getURLUserAppSupportByKind:(NSString *)fileKind
{
NSURL *fileURL = nil;
if ([fileKind isEqualToString:@"ROM Save"])
{
fileURL = [CocoaDSFile getURLUserAppSupport:@BATTERYKEY appVersion:nil];
}
else if ([fileKind isEqualToString:@"Cheat File"])
{
fileURL = [CocoaDSFile getURLUserAppSupport:@CHEATKEY appVersion:nil];
}
else if ([fileKind isEqualToString:@"Firmware Configuration"])
{
fileURL = [CocoaDSFile getURLUserAppSupport:@FIRMWAREKEY appVersion:nil];
}
else if ([fileKind isEqualToString:@"Save State"])
{
fileURL = [CocoaDSFile getURLUserAppSupport:@STATEKEY appVersion:nil];
}
return fileURL;
}
+ (BOOL) saveStateExistsForSlot:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber
{
BOOL exists = NO;
if (romURL == nil)
{
return exists;
}
if (slotNumber == 10)
{
slotNumber = 0;
}
NSURL *searchURL = [CocoaDSFile getURLUserAppSupport:@STATEKEY appVersion:nil];
NSString *searchFileName = [CocoaDSFile getSaveSlotFileName:romURL slotNumber:slotNumber];
if (searchURL == nil || searchFileName == nil)
{
return exists;
}
NSString *searchFullPath = [[searchURL path] stringByAppendingPathComponent:searchFileName];
NSFileManager *fileManager = [[NSFileManager alloc] init];
exists = [fileManager isReadableFileAtPath:searchFullPath];
[fileManager release];
return exists;
}
/********************************************************************************************
isSaveStateSlotExtension:
Determines if a given extension represents a save state file type.
Takes:
extension - An NSString representing the file extension.
Returns:
A BOOL indicating if extension represents a save state file type.
Details:
Save state file extensions are represented by .ds#, where # is an integer that
is greater than or equal to 0.
********************************************************************************************/
+ (BOOL) isSaveStateSlotExtension:(NSString *)extension
{
BOOL result = NO;
if ([extension length] < 3 || ![extension hasPrefix:@"ds"])
{
return result;
}
NSString *slotNum = [extension substringFromIndex:2];
if ([slotNum isEqualToString:@"0"])
{
result = YES;
}
else if ([slotNum intValue] != 0)
{
result = YES;
}
return result;
}
+ (NSString *) getSaveSlotFileName:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber
{
if (romURL == nil)
{
return nil;
}
if (slotNumber == 10)
{
slotNumber = 0;
}
NSString *romFileName = [[romURL path] lastPathComponent];
NSString *fileExt = [NSString stringWithFormat:@"ds%d", slotNumber];
return [[romFileName stringByDeletingPathExtension] stringByAppendingPathExtension:fileExt];
}
+ (NSURL *) getBaseURLUserAppSupport
{
NSURL *userAppSupportURL = nil;
NSString *userAppSupportPath = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
if ([savePaths count] == 0)
{
return userAppSupportURL;
}
userAppSupportPath = [[savePaths objectAtIndex:0] stringByAppendingPathComponent:appName];
userAppSupportURL = [NSURL fileURLWithPath:userAppSupportPath];
return userAppSupportURL;
}
+ (NSURL *) getURLUserAppSupport:(NSString *)directoryName appVersion:(NSString *)appVersion
{
NSURL *userAppSupportURL = [CocoaDSFile getBaseURLUserAppSupport];
if (userAppSupportURL == nil)
{
return userAppSupportURL;
}
NSString *userAppSupportPath = [userAppSupportURL path];
NSString *appVersionForURL = appVersion;
// If nil is passed in for appVersion, then just use the current app version.
if (appVersionForURL == nil)
{
appVersionForURL = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
}
userAppSupportPath = [userAppSupportPath stringByAppendingPathComponent:appVersionForURL];
if (directoryName != nil)
{
userAppSupportPath = [userAppSupportPath stringByAppendingPathComponent:directoryName];
}
userAppSupportURL = [NSURL fileURLWithPath:userAppSupportPath];
return userAppSupportURL;
}
+ (BOOL) createUserAppSupportDirectory:(NSString *)directoryName
{
BOOL result = NO;
NSString *tempPath = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
if (directoryName == nil)
{
return result;
}
NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
if ([savePaths count] > 0)
{
tempPath = [savePaths objectAtIndex:0];
}
else
{
return result;
}
NSFileManager *fileManager = [[NSFileManager alloc] init];
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 // Mac OS X v10.4 and earlier.
BOOL isDir = YES;
tempPath = [tempPath stringByAppendingPathComponent:appName];
result = [fileManager createDirectoryAtPath:tempPath attributes:nil];
if (!result)
{
if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir])
{
[fileManager release];
return result;
}
}
tempPath = [tempPath stringByAppendingPathComponent:appVersion];
result = [fileManager createDirectoryAtPath:tempPath attributes:nil];
if (!result)
{
if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir])
{
[fileManager release];
return result;
}
}
tempPath = [tempPath stringByAppendingPathComponent:directoryName];
result = [fileManager createDirectoryAtPath:tempPath attributes:nil];
if (!result)
{
if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir])
{
[fileManager release];
return result;
}
}
/*
In Mac OS X v10.4 and earlier, having the File Manager create new directories where they already
exist returns NO. Note that this behavior is not per Apple's own documentation. Therefore, we
manually set result=YES at the end to make sure the function returns the right result.
*/
result = YES;
#else // Mac OS X v10.5 and later. Yes, it's that simple...
tempPath = [tempPath stringByAppendingPathComponent:appName];
tempPath = [tempPath stringByAppendingPathComponent:appVersion];
tempPath = [tempPath stringByAppendingPathComponent:directoryName];
result = [fileManager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:NULL];
#endif
[fileManager release];
return result;
}
+ (NSURL *) lastLoadedRomURL
{
return [[[NSDocumentController sharedDocumentController] recentDocumentURLs] objectAtIndex:0];
}
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4
+ (BOOL) moveFileToCurrentDirectory:(NSURL *)fileURL
{
BOOL result = NO;
if (fileURL == nil)
{
return result;
}
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSString *newLocationPath = [[CocoaDSFile getURLUserAppSupportByKind:[CocoaDSFile fileKind:fileURL]] path];
if (newLocationPath == nil)
{
return result;
}
NSString *filePath = [fileURL path];
newLocationPath = [newLocationPath stringByAppendingPathComponent:[filePath lastPathComponent]];
result = [fileManager moveItemAtPath:filePath toPath:newLocationPath error:nil];
[fileManager release];
return result;
}
+ (BOOL) copyFileToCurrentDirectory:(NSURL *)fileURL
{
BOOL result = NO;
if (fileURL == nil)
{
return result;
}
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSString *newLocationPath = [[CocoaDSFile getURLUserAppSupportByKind:[CocoaDSFile fileKind:fileURL]] path];
if (newLocationPath == nil)
{
return result;
}
NSString *filePath = [fileURL path];
newLocationPath = [newLocationPath stringByAppendingPathComponent:[filePath lastPathComponent]];
result = [fileManager copyItemAtPath:filePath toPath:newLocationPath error:nil];
[fileManager release];
return result;
}
+ (BOOL) moveFileListToCurrent:(NSMutableArray *)fileList
{
BOOL result = NO;
if (fileList == nil)
{
return result;
}
for (NSDictionary *fileDict in fileList)
{
BOOL willMigrate = [[fileDict valueForKey:@"willMigrate"] boolValue];
if (!willMigrate)
{
continue;
}
NSURL *fileURL = [NSURL URLWithString:[fileDict valueForKey:@"URL"]];
[CocoaDSFile moveFileToCurrentDirectory:fileURL];
}
result = YES;
return result;
}
+ (BOOL) copyFileListToCurrent:(NSMutableArray *)fileList
{
BOOL result = NO;
if (fileList == nil)
{
return result;
}
for (NSDictionary *fileDict in fileList)
{
BOOL willMigrate = [[fileDict valueForKey:@"willMigrate"] boolValue];
if (!willMigrate)
{
continue;
}
NSURL *fileURL = [NSURL URLWithString:[fileDict valueForKey:@"URL"]];
[CocoaDSFile copyFileToCurrentDirectory:fileURL];
}
result = YES;
return result;
}
+ (NSMutableArray *) completeFileList
{
NSMutableArray *fileList = [NSMutableArray arrayWithCapacity:100];
if (fileList == nil)
{
return fileList;
}
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSDictionary *versionTopDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"VersionPaths" ofType:@"plist"]];
NSDictionary *versionDirectoriesDict = (NSDictionary *)[versionTopDict valueForKey:@"VersionDirectories"];
NSArray *versionArray = [versionDirectoriesDict allKeys];
for (NSString *versionKey in versionArray)
{
if ([currentVersion isEqualToString:versionKey])
{
continue;
}
NSDictionary *versionDict = (NSDictionary *)[versionDirectoriesDict valueForKey:versionKey];
NSArray *portArray = [versionDict allKeys];
for (NSString *portKey in portArray)
{
NSDictionary *portDict = (NSDictionary *)[versionDict valueForKey:portKey];
NSArray *typeArray = [portDict allKeys];
for (NSString *typeKey in typeArray)
{
NSString *typePath = [portDict valueForKey:typeKey];
NSURL *typeURL = nil;
if ([typePath isEqualToString:@"${WITHROM}"])
{
continue;
}
else if ([typePath isEqualToString:@"${APPSUPPORT}"])
{
typeURL = [CocoaDSFile getURLUserAppSupportByKind:typeKey];
[fileList addObjectsFromArray:[CocoaDSFile appFileList:typeURL fileKind:typeKey]];
}
else
{
typeURL = [NSURL fileURLWithPath:[typePath stringByExpandingTildeInPath]];
[fileList addObjectsFromArray:[CocoaDSFile appFileList:typeURL fileKind:typeKey]];
}
}
}
}
return fileList;
}
+ (NSMutableArray *) appFileList:(NSURL *)directoryURL
{
return [self appFileList:directoryURL fileKind:nil];
}
+ (NSMutableArray *) appFileList:(NSURL *)directoryURL fileKind:(NSString *)theFileKind
{
NSMutableArray *outArray = nil;
if (directoryURL == nil)
{
return outArray;
}
NSString *directoryPath = [directoryURL path];
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSArray *fileList = [fileManager contentsOfDirectoryAtPath:directoryPath error:nil];
if (fileList == nil)
{
[fileManager release];
return outArray;
}
outArray = [NSMutableArray arrayWithCapacity:100];
if (outArray == nil)
{
[fileManager release];
return outArray;
}
for (NSString *fileName in fileList)
{
NSNumber *willMigrate = [NSNumber numberWithBool:YES];
NSString *filePath = [directoryPath stringByAppendingPathComponent:fileName];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
NSString *fileVersion = [CocoaDSFile fileVersion:fileURL];
NSString *fileKind = [CocoaDSFile fileKind:fileURL];
if (fileKind == nil ||
(theFileKind != nil && ![theFileKind isEqualToString:fileKind]) ||
[CocoaDSFile fileExistsForCurrent:fileURL])
{
continue;
}
NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:filePath error:nil];
NSMutableDictionary *finalDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
willMigrate, @"willMigrate",
fileName, @"name",
fileVersion, @"version",
fileKind, @"kind",
[fileAttributes fileModificationDate], @"dateModified",
[fileURL absoluteString], @"URL",
nil];
[outArray addObject:finalDict];
}
[fileManager release];
return outArray;
}
#endif
@end

View File

@ -0,0 +1,97 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 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 <http://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
#include "macosx_10_4_compat.h"
#endif
@interface CocoaDSUtil : NSObject
{
}
+ (void) messageSendOneWay:(NSPort *)sendPort msgID:(NSInteger)msgID;
+ (void) messageSendOneWayWithData:(NSPort *)sendPort msgID:(NSInteger)msgID data:(NSData *)msgData;
+ (void) messageSendOneWayWithInteger:(NSPort *)sendPort msgID:(NSInteger)msgID integerValue:(NSInteger)integerValue;
+ (void) messageSendOneWayWithFloat:(NSPort *)sendPort msgID:(NSInteger)msgID floatValue:(float)floatValue;
+ (void) messageSendOneWayWithBool:(NSPort *)sendPort msgID:(NSInteger)msgID boolValue:(BOOL)boolValue;
+ (void) messageSendOneWayWithRect:(NSPort *)sendPort msgID:(NSInteger)msgID rect:(NSRect)rect;
+ (NSInteger) getIBActionSenderTag:(id)sender;
+ (BOOL) getIBActionSenderButtonStateBool:(id)sender;
+ (void) quickDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText;
+ (BOOL) quickYesNoDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText;
@end
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5
@interface CocoaDSThread : NSObject <NSPortDelegate>
#else
@interface CocoaDSThread : NSObject
#endif
{
NSThread *thread;
BOOL threadExit;
NSTimeInterval autoreleaseInterval;
NSPort *sendPort;
NSPort *receivePort;
}
@property (assign) NSThread *thread;
@property (assign) BOOL threadExit;
@property (assign) NSTimeInterval autoreleaseInterval;
@property (assign) NSPort *sendPort;
@property (readonly) NSPort *receivePort;
- (id) initWithAutoreleaseInterval:(NSTimeInterval)interval;
- (void) runThread:(id)object;
@end
#endif
@interface NSNotificationCenter (MainThread)
- (void)postNotificationOnMainThread:(NSNotification *)notification;
- (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject;
- (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
@end
#ifdef __cplusplus
extern "C"
{
#endif
uint32_t RGBA5551ToRGBA8888(const uint16_t color16);
uint32_t RGBA8888ToRGB888(const uint32_t color24);
void RGBA5551ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels);
void RGB888ToRGBA8888Buffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels);
NSSize GetTransformedBounds(NSSize normalBounds, double scalar, double angleDegrees);
double GetMaxScalarInBounds(double normalBoundsWidth, double normalBoundsHeight, double keepInBoundsWidth, double keepInBoundsHeight);
NSPoint GetNormalPointFromTransformedPoint(NSPoint transformedPt, NSSize normalBounds, NSSize transformBounds, double scalar, double angleDegrees);
uint32_t GetNearestPositivePOT(uint32_t value);
#ifdef __cplusplus
}
#endif

View File

@ -1,167 +0,0 @@
/* Copyright (C) 2007 Jeff Bland
This file is part of DeSmuME
DeSmuME 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.
DeSmuME 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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#import <Cocoa/Cocoa.h>
#import "globals.h"
////////////////////////////////////////////////////////////////
//Dialog Boxes-------------------------------------------------
////////////////////////////////////////////////////////////////
void messageDialog(NSString *title, NSString *text)
{
NSRunAlertPanel(title, text, nil/*OK*/, nil, nil);
}
BOOL messageDialogYN(NSString *title, NSString *text)
{
return NSRunAlertPanel(title, text, NSLocalizedString(@"Yes", nil), NSLocalizedString(@"No", nil), nil) != 0;
}
//does an open dialog to choose an NDS file
//returns the filename or NULL if the user selected cancel
NSOpenPanel* panel;
NSString* openDialog(NSArray *file_types)
{
panel = [NSOpenPanel openPanel];
[panel setCanChooseDirectories:NO];
[panel setCanChooseFiles:YES];
[panel setAllowsMultipleSelection:NO];
if([panel runModalForDirectory:nil file:nil types:file_types] == NSOKButton)
{
//a file was selected
id selected_file = [[panel filenames] lastObject]; //hopefully also the first object
return selected_file;
}
//a file wasn't selected
return NULL;
}
BOOL CreateAppDirectory(NSString *directoryName)
{
BOOL result = NO;
BOOL isDir = YES;
NSString *tempPath = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
if ([savePaths count] > 0)
{
tempPath = [savePaths objectAtIndex:0];
}
else
{
return result;
}
NSFileManager *fileManager = [[NSFileManager alloc] init];
/*
Mac OS X v10.4 only
Code for creating new directories based on NSString paths.
*/
tempPath = [[tempPath stringByAppendingString:@"/"] stringByAppendingString:appName];
result = [fileManager createDirectoryAtPath:tempPath attributes:nil];
if (result == NO)
{
if([fileManager fileExistsAtPath:tempPath isDirectory:&isDir] == NO)
{
[fileManager release];
return result;
}
}
tempPath = [[tempPath stringByAppendingString:@"/"] stringByAppendingString:appVersion];
result = [fileManager createDirectoryAtPath:tempPath attributes:nil];
if (result == NO)
{
if([fileManager fileExistsAtPath:tempPath isDirectory:&isDir] == NO)
{
[fileManager release];
return result;
}
}
if (directoryName != nil)
{
tempPath = [[tempPath stringByAppendingString:@"/"] stringByAppendingString:directoryName];
result = [fileManager createDirectoryAtPath:tempPath attributes:nil];
if (result == NO)
{
if([fileManager fileExistsAtPath:tempPath isDirectory:&isDir] == NO)
{
[fileManager release];
return result;
}
}
}
/*
In Mac OS X v10.4, having the File Manager create new directories where they already exist
returns NO. Note that this behavior is not per Apple's own documentation. Therefore, we manually
set result=YES at the end to make sure the function returns the right result.
*/
result = YES;
/*
Mac OS X v10.5 and later
Yes, it's that simple...
*/
//result = [fileManager createDirectoryAtPath:savePath createIntermediates:YES attributes:nil error:NULL];
[fileManager release];
return result;
}
NSString* GetPathUserAppSupport(NSString *directoryName)
{
NSString *userAppSupportPath = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
if ([savePaths count] > 0)
{
userAppSupportPath = [savePaths objectAtIndex:0];
}
else
{
return userAppSupportPath;
}
if (directoryName == nil)
{
userAppSupportPath = [[[[userAppSupportPath stringByAppendingString:@"/"] stringByAppendingString:appName] stringByAppendingString:@"/"] stringByAppendingString:appVersion];
}
else
{
userAppSupportPath = [[[[[[userAppSupportPath stringByAppendingString:@"/"] stringByAppendingString:appName] stringByAppendingString:@"/"] stringByAppendingString:appVersion] stringByAppendingString:@"/"] stringByAppendingString:directoryName];
}
return userAppSupportPath;
}

View File

@ -0,0 +1,596 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 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 <http://www.gnu.org/licenses/>.
*/
#import "cocoa_util.h"
#import "cocoa_globals.h"
#import "types.h"
#undef BOOL
@implementation CocoaDSUtil
static NSDate *distantFutureDate = [[NSDate distantFuture] retain];
+ (void) messageSendOneWay:(NSPort *)sendPort msgID:(NSInteger)msgID
{
NSPortMessage *message = [[NSPortMessage alloc] initWithSendPort:sendPort receivePort:nil components:nil];
[message setMsgid:msgID];
NSDate *sendDate = [[NSDate alloc] init];
[message sendBeforeDate:distantFutureDate];
[sendDate release];
[message release];
}
+ (void) messageSendOneWayWithData:(NSPort *)sendPort msgID:(NSInteger)msgID data:(NSData *)msgData
{
NSArray *messageComponents = [[NSArray alloc] initWithObjects:msgData, nil];
NSPortMessage *message = [[NSPortMessage alloc] initWithSendPort:sendPort receivePort:nil components:messageComponents];
[message setMsgid:msgID];
NSDate *sendDate = [[NSDate alloc] init];
[message sendBeforeDate:distantFutureDate];
[sendDate release];
[messageComponents release];
[message release];
}
+ (void) messageSendOneWayWithInteger:(NSPort *)sendPort msgID:(NSInteger)msgID integerValue:(NSInteger)integerValue
{
NSData *messageData = [[NSData alloc] initWithBytes:&integerValue length:sizeof(NSInteger)];
[CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData];
[messageData release];
}
+ (void) messageSendOneWayWithFloat:(NSPort *)sendPort msgID:(NSInteger)msgID floatValue:(float)floatValue
{
NSData *messageData = [[NSData alloc] initWithBytes:&floatValue length:sizeof(float)];
[CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData];
[messageData release];
}
+ (void) messageSendOneWayWithBool:(NSPort *)sendPort msgID:(NSInteger)msgID boolValue:(BOOL)boolValue
{
NSData *messageData = [[NSData alloc] initWithBytes:&boolValue length:sizeof(BOOL)];
[CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData];
[messageData release];
}
+ (void) messageSendOneWayWithRect:(NSPort *)sendPort msgID:(NSInteger)msgID rect:(NSRect)rect
{
NSData *messageData = [[NSData alloc] initWithBytes:&rect length:sizeof(NSRect)];
[CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData];
[messageData release];
}
+ (NSInteger) getIBActionSenderTag:(id)sender
{
NSInteger senderTag = 0;
if ([sender isKindOfClass:[NSButton class]])
{
senderTag = [sender tag];
}
else if ([sender respondsToSelector:@selector(selectedCell)])
{
senderTag = [[sender selectedCell] tag];
}
else if ([sender respondsToSelector:@selector(tag)])
{
senderTag = [sender tag];
}
return senderTag;
}
+ (BOOL) getIBActionSenderButtonStateBool:(id)sender
{
BOOL theState = NO;
NSInteger buttonState = NSOffState;
if ([sender respondsToSelector:@selector(state)])
{
buttonState = [sender state];
}
if (buttonState == NSOnState)
{
theState = YES;
}
return theState;
}
+ (void) quickDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText
{
NSRunAlertPanel(titleText, messageText, nil, nil, nil);
}
+ (BOOL) quickYesNoDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText
{
return NSRunAlertPanel(titleText, messageText, NSLocalizedString(@"Yes", nil), NSLocalizedString(@"No", nil), nil) != 0;
}
@end
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4
@implementation CocoaDSThread
@synthesize thread;
@synthesize threadExit;
@synthesize autoreleaseInterval;
@synthesize sendPort;
@synthesize receivePort;
- (id)init
{
return [self initWithAutoreleaseInterval:15.0];
}
- (id) initWithAutoreleaseInterval:(NSTimeInterval)interval
{
// Set up thread info.
thread = nil;
threadExit = NO;
autoreleaseInterval = interval;
// Set up thread ports.
sendPort = [[NSPort port] retain];
[sendPort setDelegate:self];
receivePort = [[NSPort port] retain];
[receivePort setDelegate:self];
return self;
}
- (void)dealloc
{
// Exit the thread.
if (self.thread != nil)
{
// Tell the thread to shut down.
self.threadExit = YES;
// Wait until the thread has shut down.
while (self.thread != nil)
{
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
}
}
[self.sendPort release];
[self.receivePort release];
[super dealloc];
}
- (void) runThread:(id)object
{
NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init];
NSRunLoop *runLoop = [[NSRunLoop currentRunLoop] retain];
[runLoop addPort:self.receivePort forMode:NSDefaultRunLoopMode];
self.thread = [[NSThread currentThread] retain];
do
{
NSAutoreleasePool *runLoopPool = [[NSAutoreleasePool alloc] init];
NSDate *runDate = [[NSDate alloc] initWithTimeIntervalSinceNow:self.autoreleaseInterval];
[runLoop runUntilDate:runDate];
[runDate release];
[runLoopPool release];
} while (!self.threadExit);
[self.thread release];
self.thread = nil;
[runLoop release];
[threadPool release];
}
- (void)handlePortMessage:(NSPortMessage *)portMessage
{
NSInteger message = (NSInteger)[portMessage msgid];
switch (message)
{
case MESSAGE_EXIT_THREAD:
self.threadExit = YES;
break;
default:
break;
}
}
@end
#endif
@implementation NSNotificationCenter (MainThread)
- (void)postNotificationOnMainThread:(NSNotification *)notification
{
[self performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:YES];
}
- (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject
{
NSNotification *notification = [NSNotification notificationWithName:aName object:anObject];
[self postNotificationOnMainThread:notification];
}
- (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo
{
NSNotification *notification = [NSNotification notificationWithName:aName object:anObject userInfo:aUserInfo];
[self postNotificationOnMainThread:notification];
}
@end
/********************************************************************************************
RGBA5551ToRGBA8888() - INLINE
Converts a color from 16-bit RGBA5551 format into 32-bit RGBA8888 format.
Takes:
color16 - The pixel in 16-bit RGBA5551 format.
Returns:
A 32-bit unsigned integer containing the RGBA8888 formatted color.
Details:
The input and output pixels are expected to have little-endian byte order.
********************************************************************************************/
FORCEINLINE uint32_t RGBA5551ToRGBA8888(const uint16_t color16)
{
return ((color16 & 0x001F) << 3) |
((color16 & 0x03E0) << 6) |
((color16 & 0x7C00) << 9) |
0xFF000000;
}
/********************************************************************************************
RGB888ToRGBA8888() - INLINE
Converts a color from 24-bit RGB888 format into 32-bit RGBA8888 format.
Takes:
color24 - The pixel in 24-bit RGB888 format.
Returns:
A 32-bit unsigned integer containing the RGBA8888 formatted color.
Details:
The input and output pixels are expected to have little-endian byte order.
********************************************************************************************/
FORCEINLINE uint32_t RGB888ToRGBA8888(const uint32_t color24)
{
return color24 | 0xFF000000;
}
/********************************************************************************************
RGBA5551ToRGBA8888Buffer()
Copies a 16-bit RGBA5551 pixel buffer into a 32-bit RGBA8888 pixel buffer.
Takes:
srcBuffer - Pointer to the source 16-bit RGBA5551 pixel buffer.
destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer.
numberPixels - The number of pixels to copy.
Returns:
Nothing.
Details:
The source and destination pixels are expected to have little-endian byte order.
Also, it is the caller's responsibility to ensure that the source and destination
buffers are large enough to accomodate the requested number of pixels.
********************************************************************************************/
void RGBA5551ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels)
{
const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels;
while (destBuffer < destBufferEnd)
{
*destBuffer++ = RGBA5551ToRGBA8888(*srcBuffer++);
}
}
/********************************************************************************************
RGBA5551ToRGBA8888Buffer()
Copies a 24-bit RGB888 pixel buffer into a 32-bit RGBA8888 pixel buffer.
Takes:
srcBuffer - Pointer to the source 24-bit RGB888 pixel buffer.
destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer.
numberPixels - The number of pixels to copy.
Returns:
Nothing.
Details:
The source and destination pixels are expected to have little-endian byte order.
Also, it is the caller's responsibility to ensure that the source and destination
buffers are large enough to accomodate the requested number of pixels.
********************************************************************************************/
void RGB888ToRGBA8888Buffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels)
{
const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels;
while (destBuffer < destBufferEnd)
{
*destBuffer++ = RGB888ToRGBA8888(*srcBuffer++);
}
}
/********************************************************************************************
GetTransformedBounds()
Returns the bounds of a normalized 2D surface using affine transformations.
Takes:
normalBounds - The rectangular bounds of the normal 2D surface.
scalar - The scalar used to transform the 2D surface.
angleDegrees - The rotation angle, in degrees, to transform the 2D surface.
Returns:
The bounds of a normalized 2D surface using affine transformations.
Details:
The returned bounds is always a normal rectangle. Ignoring the scaling, the
returned bounds will always be at its smallest when the angle is at 0, 90, 180,
or 270 degrees, and largest when the angle is at 45, 135, 225, or 315 degrees.
********************************************************************************************/
NSSize GetTransformedBounds(NSSize normalBounds, double scalar, double angleDegrees)
{
NSSize transformBounds = {0.0, 0.0};
double angleRadians = angleDegrees * (M_PI/180.0);
double w = scalar * normalBounds.width;
double h = scalar * normalBounds.height;
double d = hypot(w, h);
double dAngle = atan2(h, w);
double px = d * cos(dAngle + angleRadians);
double py = d * sin(dAngle + angleRadians);
double qx = h * cos((M_PI/2.0) + angleRadians);
double qy = h * sin((M_PI/2.0) + angleRadians);
double rx = w * cos(angleRadians);
double ry = w * sin(angleRadians);
double transformWidth = px;
double transformHeight = py;
// Determine the transform width, which is dependent on the location of
// the x-coordinate of point p.
if (px > 0.0)
{
transformWidth = px;
if (px < qx)
{
transformWidth = qx - rx;
}
else if (px < rx)
{
transformWidth = rx - qx;
}
}
else if (px < 0.0)
{
transformWidth = -px;
if (px > qx)
{
transformWidth = -(qx - rx);
}
else if (px > rx)
{
transformWidth = -(rx - qx);
}
}
// Determine the transform height, which is dependent on the location of
// the y-coordinate of point p.
if (py > 0.0)
{
transformHeight = py;
if (py < qy)
{
transformHeight = qy - ry;
}
else if (py < ry)
{
transformHeight = ry - qy;
}
}
else if (py < 0.0)
{
transformHeight = -py;
if (py > qy)
{
transformHeight = -(qy - ry);
}
else if (py > ry)
{
transformHeight = -(ry - qy);
}
}
transformBounds.width = transformWidth;
transformBounds.height = transformHeight;
return transformBounds;
}
/********************************************************************************************
GetMaxScalarInBounds()
Returns the maximum scalar that a rectangle can grow, while maintaining its aspect
ratio, within a boundary.
Takes:
normalBoundsWidth - The rectangular width of the normal 2D surface.
normalBoundsHeight - The rectangular height of the normal 2D surface.
keepInBoundsWidth - The rectangular width of the keep in 2D surface.
keepInBoundsHeight - The rectangular height of the keep in 2D surface.
Returns:
The maximum scalar that a rectangle can grow, while maintaining its aspect ratio,
within a boundary.
Details:
If keepInBoundsWidth or keepInBoundsHeight are less than or equal to zero, the
returned scalar will be zero.
********************************************************************************************/
double GetMaxScalarInBounds(double normalBoundsWidth, double normalBoundsHeight, double keepInBoundsWidth, double keepInBoundsHeight)
{
double maxX;
double maxY;
double maxS;
if (normalBoundsWidth <= 0.0)
{
maxX = 0.0;
}
else
{
maxX = keepInBoundsWidth / normalBoundsWidth;
}
if (normalBoundsHeight <= 0.0)
{
maxY = 0.0;
}
else
{
maxY = keepInBoundsHeight / normalBoundsHeight;
}
maxS = maxY;
if (maxX < maxY)
{
maxS = maxX;
}
return maxS;
}
/********************************************************************************************
GetNormalPointFromTransformedPoint()
Returns a normalized point from a point from a 2D transformed surface.
Takes:
transformedPt - A point as it exists on a 2D transformed surface.
normalBounds - The rectangular bounds of the normal 2D surface.
transformedBounds - The rectangular bounds of the transformed 2D surface.
scalar - The scalar used on the transformed 2D surface.
angleDegrees - The rotation angle, in degrees, of the transformed 2D surface.
Returns:
A normalized point from a point from a 2D transformed surface.
Details:
It may help to call GetTransformedBounds() for the transformBounds parameter.
********************************************************************************************/
NSPoint GetNormalPointFromTransformedPoint(NSPoint transformedPt, NSSize normalBounds, NSSize transformBounds, double scalar, double angleDegrees)
{
double transformedX = 0.0;
double transformedY = 0.0;
double r = 0.0;
double theta = 0.0;
double normalizedAngle = 0.0;
double normalizedX = 0.0;
double normalizedY = 0.0;
NSPoint normalizedPt = {transformedPt.x, transformedPt.y};
// Get the coordinates of the transformed point and translate the coordinate
// system so that the origin becomes the center.
transformedX = transformedPt.x - (transformBounds.width / 2.0);
transformedY = transformedPt.y - (transformBounds.height / 2.0);
// Perform rect-polar conversion.
// Get the radius r with respect to the origin.
r = hypot(transformedX, transformedY);
// Get the angle theta with respect to the origin.
if (transformedX == 0.0)
{
if (transformedY > 0.0)
{
theta = M_PI / 2.0;
}
else if (transformedY < 0.0)
{
theta = M_PI * 1.5;
}
}
else if (transformedX < 0.0)
{
theta = M_PI - atan2(transformedY, -transformedX);
}
else if (transformedY < 0.0)
{
theta = atan2(transformedY, transformedX) + (M_PI * 2.0);
}
else
{
theta = atan2(transformedY, transformedX);
}
// Get the normalized angle and use it to rotate about the origin.
// Then do polar-rect conversion and translate back to transformed coordinates
// with a 0 degree rotation.
normalizedAngle = theta - angleDegrees;
normalizedX = (r * cos(normalizedAngle)) + (normalBounds.width * scalar / 2.0);
normalizedY = (r * sin(normalizedAngle)) + (normalBounds.height * scalar / 2.0);
// Scale the location to get a one-to-one correlation to normal coordinates.
normalizedPt.x = (CGFloat)(normalizedX / scalar);
normalizedPt.y = (CGFloat)(normalizedY / scalar);
return normalizedPt;
}
/********************************************************************************************
GetNearestPositivePOT()
Returns the next highest power of two of a 32-bit integer value.
Takes:
value - A 32-bit integer value.
Returns:
A 32-bit integer with the next highest power of two compared to the input value.
Details:
If the input value is already a power of two, this function returns the same
value.
********************************************************************************************/
uint32_t GetNearestPositivePOT(uint32_t value)
{
value--;
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
value |= value >> 8;
value |= value >> 16;
value++;
return value;
}

View File

@ -1,51 +0,0 @@
/* Copyright (C) 2007 Jeff Bland
This file is part of DeSmuME
DeSmuME 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.
DeSmuME 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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#import <Cocoa/Cocoa.h>
#ifdef __cplusplus
extern "C"
{
#endif
void messageDialog(NSString *title, NSString *text);
BOOL messageDialogYN(NSString *title, NSString *text);
NSString* openDialog(NSArray *file_types);
BOOL CreateAppDirectory(NSString *directoryName);
NSString* GetPathUserAppSupport(NSString *directoryName);
//
#if !defined(__LP64__) && !defined(NS_BUILD_32_LIKE_64)
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
// Taken from CIVector.h of the Mac OS X 10.5 SDK.
// Defines CGFloat for Mac OS X 10.4 and earlier.
#ifndef CGFLOAT_DEFINED
typedef float CGFloat;
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_DEFINED 1
#endif
#ifdef __cplusplus
}
#endif

View File

@ -1,23 +1,24 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "input.h" #import "input.h"
#import "cocoa_input.h"
#import "main_window.h" #import "main_window.h"
#import "preferences.h" #import "preferences.h"

View File

@ -0,0 +1,42 @@
/*
Copyright (C) 2012 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 <http://www.gnu.org/licenses/>.
*/
#ifndef MACOSX_10_4_COMPATIBILITY_H
#define MACOSX_10_4_COMPATIBILITY_H
// Taken from NSObjCRuntime.h of the Mac OS X 10.5 SDK.
// Defines NSInteger and NSUInteger for Mac OS X 10.4 and earlier.
#ifndef NSINTEGER_DEFINED
#define NSINTEGER_DEFINED 1
typedef int NSInteger;
typedef unsigned int NSUInteger;
#define NSIntegerMax LONG_MAX
#define NSIntegerMin LONG_MIN
#define NSUIntegerMax ULONG_MAX
#endif
// Taken from CIVector.h of the Mac OS X 10.5 SDK.
// Defines CGFloat for Mac OS X 10.4 and earlier.
#ifndef CGFLOAT_DEFINED
#define CGFLOAT_DEFINED 1
typedef float CGFloat;
#define CGFLOAT_MIN FLT_MIN
#define CGFLOAT_MAX FLT_MAX
#define CGFLOAT_IS_DOUBLE 0
#endif
#endif // MACOSX_10_4_COMPATIBILITY_H

View File

@ -1,20 +1,20 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME This file is free software: you can redistribute it and/or modify
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
DeSmuME is distributed in the hope that it will be useful, This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software along with the this software. If not, see <http://www.gnu.org/licenses/>.
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
/* /*
@ -24,6 +24,9 @@ Based on work by yopyop and the DeSmuME team!
Mac related questions can go to osx@desmume.org Mac related questions can go to osx@desmume.org
*/ */
#import <Cocoa/Cocoa.h>
#import "cocoa_file.h"
#import "cocoa_util.h"
#import "main_window.h" #import "main_window.h"
#import "preferences.h" #import "preferences.h"
@ -75,9 +78,6 @@ extern NSMenuItem *execute_item;
extern NSMenuItem *pause_item; extern NSMenuItem *pause_item;
extern NSMenuItem *reset_item; extern NSMenuItem *reset_item;
extern NSMenuItem *frame_skip_auto_item;
extern NSMenuItem *frame_skip_item[];
extern NSMenuItem *save_type_item[]; extern NSMenuItem *save_type_item[];
extern NSString *save_types[]; extern NSString *save_types[];
@ -114,7 +114,6 @@ extern NSMenuItem *rom_info_item;
//delegate methods //delegate methods
- (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename; - (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename;
- (void)application:(NSApplication*)sender openFiles:(NSArray*)filenames;
- (void)applicationWillFinishLaunching:(NSNotification*)aNotification; - (void)applicationWillFinishLaunching:(NSNotification*)aNotification;
- (void)applicationDidFinishLaunching:(NSNotification*)aNotification; - (void)applicationDidFinishLaunching:(NSNotification*)aNotification;
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender; - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender;
@ -238,30 +237,6 @@ void CreateMenu(AppDelegate *delegate)
[emulation_menu addItem:[NSMenuItem separatorItem]]; [emulation_menu addItem:[NSMenuItem separatorItem]];
//Frake skip menu
// Disabling frame skipping for now since it doesn't yield any significant speed improvements. -rogerman 03/28/2011
/*
temp = [emulation_menu addItemWithTitle:NSLocalizedString(@"Frame Skip", nil) action:nil keyEquivalent:@""];
NSMenu *frame_skip_menu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"Frame Skip", nil)];
if(frame_skip_menu != nil)
{
[temp setSubmenu:frame_skip_menu];
frame_skip_auto_item = [frame_skip_menu addItemWithTitle:NSLocalizedString(@"Auto", nil) action:@selector(setFrameSkipFromMenuItem:) keyEquivalent:@""];
[frame_skip_menu addItem:[NSMenuItem separatorItem]];
frame_skip_item[0] = [frame_skip_menu addItemWithTitle:NSLocalizedString(@"Off", nil) action:@selector(setFrameSkipFromMenuItem:) keyEquivalent:@""];
for(i = 1; i < MAX_FRAME_SKIP; i++)
{
frame_skip_item[i] = [frame_skip_menu addItemWithTitle:[NSString stringWithFormat:NSLocalizedString(@"Skip %d", nil), i] action:@selector(setFrameSkipFromMenuItem:) keyEquivalent:@""];
}
[frame_skip_menu release];
}
*/
//Speed limit menu //Speed limit menu
temp = [emulation_menu addItemWithTitle:NSLocalizedString(@"Speed Limit", nil) action:nil keyEquivalent:@""]; temp = [emulation_menu addItemWithTitle:NSLocalizedString(@"Speed Limit", nil) action:nil keyEquivalent:@""];
@ -311,11 +286,6 @@ void CreateMenu(AppDelegate *delegate)
[save_type_menu release]; [save_type_menu release];
} }
[emulation_menu addItem:[NSMenuItem separatorItem]];
[emulation_menu addItemWithTitle:NSLocalizedString(@"Set FAT Image File...", nil) action:@selector(pickFlash) keyEquivalent:@""];
[emulation_menu release]; [emulation_menu release];
} }
@ -415,12 +385,7 @@ void CreateMenu(AppDelegate *delegate)
[sound_menu addItem:[NSMenuItem separatorItem]]; [sound_menu addItem:[NSMenuItem separatorItem]];
mute_item = [sound_menu addItemWithTitle:NSLocalizedString(@"Mute", nil) action:@selector(toggleMute) keyEquivalent:@""]; mute_item = [sound_menu addItemWithTitle:NSLocalizedString(@"Mute", nil) action:@selector(toggleMute) keyEquivalent:@""];
//[sound_menu addItem:[NSMenuItem separatorItem]];
//temp = [sound_menu addItemWithTitle:@"Record to File..." action:@selector(chooseSoundOutputFile) keyEquivalent: @"r"];
//temp = [sound_menu addItemWithTitle:@"Pause Recording" action:@selector(startRecording) keyEquivalent: @""];
//temp = [sound_menu addItemWithTitle:@"Save Recording" action:@selector(pauseRecording) keyEquivalent: @""];
[sound_menu release]; [sound_menu release];
} }
@ -505,7 +470,6 @@ int main(int argc, char *argv[])
[panel setCanChooseFiles:YES]; [panel setCanChooseFiles:YES];
[panel setResolvesAliases:YES]; [panel setResolvesAliases:YES];
[panel setAllowsMultipleSelection:NO]; [panel setAllowsMultipleSelection:NO];
[panel setTitle:NSLocalizedString(@"Open ROM...", nil)]; [panel setTitle:NSLocalizedString(@"Open ROM...", nil)];
if([panel runModalForDirectory:nil file:nil types:[NSArray arrayWithObjects:@"NDS", @"DS.GBA", nil]] == NSOKButton) if([panel runModalForDirectory:nil file:nil types:[NSArray arrayWithObjects:@"NDS", @"DS.GBA", nil]] == NSOKButton)
@ -516,64 +480,18 @@ int main(int argc, char *argv[])
} }
} }
- (void)pickFlash
{
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel setCanChooseDirectories:NO];
[panel setCanChooseFiles:YES];
[panel setAllowsMultipleSelection:NO];
[panel setTitle:NSLocalizedString(@"Set FAT Image File...", nil)];
if([panel runModalForDirectory:nil file:nil types:[NSArray arrayWithObjects:@"FAT", @"IMG", nil]] == NSOKButton)
{
NSString* selected_file = [[panel filenames] lastObject];
[main_window setFlashFile:selected_file];
}
}
- (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename - (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename
{ {
//verify everything BOOL result = NO;
if(sender != NSApp)return NO; NSURL *fileURL = [NSURL fileURLWithPath:filename];
if(!filename)return NO;
if([filename length] == 0)return NO;
if([main_window loadROM:filename])
{
//[main_window execute];
return YES;
}
return NO;
}
- (void)application:(NSApplication*)sender openFiles:(NSArray*)filenames
{
//verify everything
if(sender != NSApp ||
filenames == nil ||
[filenames count] == 0)
{
[sender replyToOpenOrPrint:NSApplicationDelegateReplySuccess];
return;
}
NSString *filename = [filenames lastObject]; NSString *fileKind = [CocoaDSFile fileKind:fileURL];
if(!filename || [filename length] == 0) if ([fileKind isEqualToString:@"DS ROM"] || [fileKind isEqualToString:@"GBA ROM"])
{ {
[sender replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; result = [main_window loadRom:fileURL];
return;
} }
if([main_window loadROM:filename]) return result;
{
//[main_window execute];
[sender replyToOpenOrPrint:NSApplicationDelegateReplySuccess];
return;
}
} }
- (void)applicationWillFinishLaunching:(NSNotification*)notification - (void)applicationWillFinishLaunching:(NSNotification*)notification
@ -587,6 +505,9 @@ int main(int argc, char *argv[])
//create the menus //create the menus
CreateMenu(self); CreateMenu(self);
//create the video output window (the only window that opens with the app)
main_window = [[VideoOutputWindow alloc] init];
} }
- (void)applicationDidFinishLaunching:(NSNotification*)notification - (void)applicationDidFinishLaunching:(NSNotification*)notification
@ -595,7 +516,7 @@ int main(int argc, char *argv[])
[NSApp activateIgnoringOtherApps:TRUE]; [NSApp activateIgnoringOtherApps:TRUE];
//create the video output window (the only window that opens with the app) //create the video output window (the only window that opens with the app)
main_window = [[VideoOutputWindow alloc] init]; //main_window = [[VideoOutputWindow alloc] init];
//check if it should load something by default //check if it should load something by default
if([[[NSUserDefaults standardUserDefaults] stringForKey:PREF_AFTER_LAUNCHED] compare:PREF_AFTER_LAUNCHED_OPTION_LAST_ROM]==NSOrderedSame) if([[[NSUserDefaults standardUserDefaults] stringForKey:PREF_AFTER_LAUNCHED] compare:PREF_AFTER_LAUNCHED_OPTION_LAST_ROM]==NSOrderedSame)
@ -604,13 +525,9 @@ int main(int argc, char *argv[])
if([recent_documents count] > 0) if([recent_documents count] > 0)
{ {
//we have to convert from a URL to file path. in the future, URL's ought to be used since they are more capable/robust... NSURL *romURL = [recent_documents objectAtIndex:0];
NSString *file = [[recent_documents objectAtIndex:0] absoluteString]; //gets it in url form [main_window loadRom:romURL];
file = [file stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //convert escaped characters in url
file = [file substringFromIndex:16]; //gets rid of "File://localhost" url component (there should be a much better way to do this....)
[main_window loadROM:file];
} }
} }
} }
@ -619,8 +536,8 @@ int main(int argc, char *argv[])
{ {
//Ask user about quitting if a rom is loaded (avoid accidentally quiting with unsaved progress) //Ask user about quitting if a rom is loaded (avoid accidentally quiting with unsaved progress)
if([main_window ROMLoaded]) if([main_window ROMLoaded])
if(!messageDialogYN(NSLocalizedString(@"DeSmuME Emulator", nil), NSLocalizedString(@"Are you sure you want to quit?", nil))) if(![CocoaDSUtil quickYesNoDialogUsingTitle:NSLocalizedString(@"DeSmuME Emulator", nil) message:NSLocalizedString(@"Are you sure you want to quit?", nil)])
return NSTerminateCancel; return NSTerminateCancel;
return NSTerminateNow; return NSTerminateNow;
} }

View File

@ -48,8 +48,6 @@
bool no_smaller_than_ds; bool no_smaller_than_ds;
bool keep_proportions; bool keep_proportions;
NSString *pathLoadedRom;
} }
//initialization //initialization
@ -57,17 +55,14 @@
- (void)dealloc; - (void)dealloc;
//overloaded from NintendoDS class //overloaded from NintendoDS class
- (BOOL)loadROM:(NSString*)filename; - (BOOL) loadRom:(NSURL *)romURL;
- (void)execute; - (void)execute;
- (void)pause; - (void)pause;
- (void)reset; - (void)reset;
- (void)setFrameSkip:(int)frameskip;
- (void)setSaveType:(int)savetype; - (void)setSaveType:(int)savetype;
- (void)closeROM; - (void)closeROM;
//save features overloaded from nds class //save features overloaded from nds class
- (BOOL)saveState:(NSString*)file;
- (BOOL)loadState:(NSString*)file;
- (BOOL)saveStateToSlot:(int)slot; //0 to MAX_SLOTS-1, anything else is ignored - (BOOL)saveStateToSlot:(int)slot; //0 to MAX_SLOTS-1, anything else is ignored
- (BOOL)loadStateFromSlot:(int)slot; - (BOOL)loadStateFromSlot:(int)slot;

View File

@ -1,24 +1,27 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
//DeSmuME Cocoa includes //DeSmuME Cocoa includes
#import "main_window.h" #import "main_window.h"
#import "cocoa_globals.h"
#import "cocoa_util.h"
#import "cocoa_file.h"
#import "screenshot.h" #import "screenshot.h"
#import "screen_state.h" #import "screen_state.h"
#import "video_output_view.h" #import "video_output_view.h"
@ -30,8 +33,6 @@
//How much padding to put around the video output //How much padding to put around the video output
#define WINDOW_BORDER_PADDING 5 #define WINDOW_BORDER_PADDING 5
#define MAX_FRAME_SKIP 10
// Save types settings // Save types settings
NSString *save_types[MAX_SAVE_TYPE] = { NSString *save_types[MAX_SAVE_TYPE] = {
NSLocalizedString(@"Auto Detect", nil), // 0 NSLocalizedString(@"Auto Detect", nil), // 0
@ -58,8 +59,6 @@ NSMenuItem *load_state_from_item = nil;
NSMenuItem *saveSlot_item[MAX_SLOTS] = { nil, nil, nil, nil, nil, nil, nil, nil, nil, nil }; //make sure this corresponds to the amount in max slots NSMenuItem *saveSlot_item[MAX_SLOTS] = { nil, nil, nil, nil, nil, nil, nil, nil, nil, nil }; //make sure this corresponds to the amount in max slots
NSMenuItem *loadSlot_item[MAX_SLOTS] = { nil, nil, nil, nil, nil, nil, nil, nil, nil, nil }; NSMenuItem *loadSlot_item[MAX_SLOTS] = { nil, nil, nil, nil, nil, nil, nil, nil, nil, nil };
NSMenuItem *rom_info_item = nil; NSMenuItem *rom_info_item = nil;
NSMenuItem *frame_skip_auto_item = nil;
NSMenuItem *frame_skip_item[MAX_FRAME_SKIP] = { nil, nil, nil, nil, nil, nil, nil, nil, nil, nil };
NSMenuItem *speed_limit_25_item = nil; NSMenuItem *speed_limit_25_item = nil;
NSMenuItem *speed_limit_50_item = nil; NSMenuItem *speed_limit_50_item = nil;
NSMenuItem *speed_limit_75_item = nil; NSMenuItem *speed_limit_75_item = nil;
@ -196,7 +195,7 @@ NSMenuItem *screenshot_to_file_item = nil;
NSTitledWindowMask|NSResizableWindowMask|/*NSClosableWindowMask|*/NSMiniaturizableWindowMask|NSTexturedBackgroundWindowMask NSTitledWindowMask|NSResizableWindowMask|/*NSClosableWindowMask|*/NSMiniaturizableWindowMask|NSTexturedBackgroundWindowMask
backing:NSBackingStoreBuffered defer:NO screen:nil])==nil) backing:NSBackingStoreBuffered defer:NO screen:nil])==nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create window"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create window", nil)];
[super release]; [super release];
return nil; return nil;
} }
@ -234,8 +233,6 @@ NSMenuItem *screenshot_to_file_item = nil;
NSResponder *temp = [window nextResponder]; NSResponder *temp = [window nextResponder];
[window setNextResponder:input]; [window setNextResponder:input];
[input setNextResponder:temp]; [input setNextResponder:temp];
pathLoadedRom = nil;
return self; return self;
} }
@ -248,22 +245,21 @@ NSMenuItem *screenshot_to_file_item = nil;
[status_view release]; [status_view release];
[status_bar_text release]; [status_bar_text release];
[input release]; [input release];
[pathLoadedRom release];
[super dealloc]; [super dealloc];
} }
- (BOOL)loadROM:(NSString*)filename - (BOOL) loadRom:(NSURL *)romURL
{ {
//Attemp to load the rom //Attempt to load the rom
BOOL result = [super loadROM:filename]; BOOL result = [super loadRom:romURL];
//Set status var and screen depending on whether the rom could be loaded //Set status var and screen depending on whether the rom could be loaded
if(result == NO) if(result == NO)
{ {
[video_output_view setScreenState:[ScreenState blackScreenState]]; //black if the rom doesn't load [video_output_view setScreenState:[ScreenState blackScreenState]]; //black if the rom doesn't load
[self setStatusText:NSLocalizedString(@"No ROM Loaded", nil)]; [self setStatusText:NSLocalizedString(@"No ROM Loaded", nil)];
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't load ROM"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't load ROM", nil)];
} else } else
{ {
//if it worked, check the execute upon load option //if it worked, check the execute upon load option
@ -276,13 +272,10 @@ NSMenuItem *screenshot_to_file_item = nil;
} }
//add the rom to the recent documents list //add the rom to the recent documents list
[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[NSURL fileURLWithPath:filename]]; [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:romURL];
//update the rom info window, if needed //update the rom info window, if needed
[ROMInfo changeDS:self]; [ROMInfo changeDS:self];
pathLoadedRom = filename;
[pathLoadedRom retain];
} }
//reset menu items //reset menu items
@ -345,47 +338,7 @@ NSMenuItem *screenshot_to_file_item = nil;
- (void)emulationError - (void)emulationError
{ {
messageDialog(NSLocalizedString(@"Error", nil), NSLocalizedString(@"An emulation error occured", nil)); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"An emulation error occured", nil)];
}
- (void)setFrameSkip:(int)frameskip
{
[super setFrameSkip:frameskip];
frameskip = dsStateBuffer->frame_skip;
if([frame_skip_auto_item target] == self)
if(frameskip < 0)
[frame_skip_auto_item setState:NSOnState];
else
[frame_skip_auto_item setState:NSOffState];
int i;
for(i = 0; i < MAX_FRAME_SKIP; i++)
if([frame_skip_item[i] target] == self)
if(i == frameskip)
[frame_skip_item[i] setState:NSOnState];
else
[frame_skip_item[i] setState:NSOffState];
}
- (void)setFrameSkipFromMenuItem:(id)sender
{
//see if this was sent from the autoskip menu item
if(sender == frame_skip_auto_item)
{
//set the frame skip to auto
[self setFrameSkip:-1];
return;
}
//search through the frame skip menu items to find out which one called this function
int i;
for(i = 0; i < MAX_FRAME_SKIP; i++)
if(sender == frame_skip_item[i])
{
[self setFrameSkip:i];
return;
}
} }
- (void)setSpeedLimit:(int)speedLimit - (void)setSpeedLimit:(int)speedLimit
@ -504,33 +457,23 @@ NSMenuItem *screenshot_to_file_item = nil;
- (void)askAndCloseROM - (void)askAndCloseROM
{ {
if(messageDialogYN(NSLocalizedString(@"DeSmuME Emulator", nil), NSLocalizedString(@"Are you sure you want to close the ROM?", nil))) if([CocoaDSUtil quickYesNoDialogUsingTitle:NSLocalizedString(@"DeSmuME Emulator", nil) message:NSLocalizedString(@"Are you sure you want to close the ROM?", nil)])
[self closeROM]; [self closeROM];
} }
- (BOOL)saveState:(NSString*)file
{
return [super saveState:file];
}
- (BOOL)loadState:(NSString*)file
{
return [super loadState:file];
}
- (BOOL)saveStateToSlot:(int)slot - (BOOL)saveStateToSlot:(int)slot
{ {
BOOL result = NO; BOOL result = NO;
int i = slot; int i = slot;
NSString *savePath = GetPathUserAppSupport(@"States"); NSString *saveStatePath = [[CocoaDSFile getURLUserAppSupportByKind:@"Save State"] path];
if (savePath == nil) if (saveStatePath == nil)
{ {
// Throw an error message here... // Throw an error message here...
return result; return result;
} }
result = CreateAppDirectory(@"States"); result = [CocoaDSFile createUserAppSupportDirectory:@"States"];
if (result == NO) if (result == NO)
{ {
// Should throw an error message here... // Should throw an error message here...
@ -543,8 +486,10 @@ NSMenuItem *screenshot_to_file_item = nil;
return result; return result;
} }
NSString *fullFilePath = [[savePath stringByAppendingString:@"/"] stringByAppendingString:fileName]; BOOL wasExecuting = [self executing];
result = [self saveState:fullFilePath]; [super pause];
result = [CocoaDSFile saveState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]];
if(result) if(result)
{ {
if([saveSlot_item[i] target] == self); if([saveSlot_item[i] target] == self);
@ -554,6 +499,11 @@ NSMenuItem *screenshot_to_file_item = nil;
result = YES; result = YES;
} }
if(wasExecuting == YES)
{
[super execute];
}
return result; return result;
} }
@ -562,8 +512,8 @@ NSMenuItem *screenshot_to_file_item = nil;
{ {
BOOL result = NO; BOOL result = NO;
NSString *savePath = GetPathUserAppSupport(@"States"); NSString *saveStatePath = [[CocoaDSFile getURLUserAppSupportByKind:@"Save State"] path];
if (savePath == nil) if (saveStatePath == nil)
{ {
// Should throw an error message here... // Should throw an error message here...
return result; return result;
@ -575,48 +525,94 @@ NSMenuItem *screenshot_to_file_item = nil;
return result; return result;
} }
NSString *fullFilePath = [[savePath stringByAppendingString:@"/"] stringByAppendingString:fileName]; BOOL wasExecuting = [self executing];
result = [self loadState:fullFilePath]; [super pause];
result = [CocoaDSFile loadState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]];
if(wasExecuting == YES)
{
[super execute];
}
return result; return result;
} }
- (BOOL)saveStateAs - (BOOL) saveStateAs
{ {
//pause emulation so it doesnt save the state after BOOL result = NO;
BOOL was_executing = [self executing]; NSInteger buttonClicked;
[self pause];
//file select //file select
NSSavePanel *panel = [NSSavePanel savePanel]; NSSavePanel *panel = [NSSavePanel savePanel];
[panel setTitle:NSLocalizedString(@"Save State...", nil)]; [panel setTitle:NSLocalizedString(@"Save State...", nil)];
[panel setRequiredFileType:@"DST"]; [panel setRequiredFileType:@FILE_EXT_SAVE_STATE];
//save it //save it
if([panel runModal] == NSFileHandlingPanelOKButton) buttonClicked = [panel runModal];
if(buttonClicked == NSFileHandlingPanelOKButton)
{ {
if(was_executing == YES)[self execute]; BOOL wasExecuting = [self executing];
return [self saveState:[panel filename]]; [super pause];
result = [CocoaDSFile saveState:[panel URL]];
if (!result)
{
return result;
}
if(wasExecuting == YES)
{
[super execute];
}
} }
//unpause emulation if needed return result;
if(was_executing == YES)[self execute];
return NO;
} }
- (BOOL)loadStateFrom - (BOOL)loadStateFrom
{ {
BOOL result = NO;
NSInteger buttonClicked;
NSURL *selectedFile = nil;
NSOpenPanel *panel = [NSOpenPanel openPanel]; NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel setTitle:NSLocalizedString(@"Load State From...", nil)]; [panel setTitle:NSLocalizedString(@"Load State From...", nil)];
[panel setCanChooseFiles:YES]; [panel setCanChooseFiles:YES];
[panel setCanChooseDirectories:NO]; [panel setCanChooseDirectories:NO];
[panel setAllowsMultipleSelection:NO]; [panel setAllowsMultipleSelection:NO];
[panel setRequiredFileType:@FILE_EXT_SAVE_STATE];
if([panel runModalForTypes:[NSArray arrayWithObject:@"DST"]] == NSFileHandlingPanelOKButton)
return [self loadState:[panel filename]]; buttonClicked = [panel runModal];
if(buttonClicked == NSOKButton)
return NO; {
selectedFile = [[panel URLs] lastObject]; //hopefully also the first object
if(selectedFile == nil)
{
return result;
}
BOOL wasExecuting = [self executing];
[super pause];
result = [CocoaDSFile loadState:selectedFile];
if (!result)
{
if(wasExecuting == YES)
{
[super execute];
}
return result;
}
if(wasExecuting == YES)
{
[super execute];
}
}
return result;
} }
- (BOOL)saveToSlot:(id)menu_item - (BOOL)saveToSlot:(id)menu_item
@ -876,7 +872,7 @@ NSMenuItem *screenshot_to_file_item = nil;
} else } else
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create status bar"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create status bar", nil)];
return; return;
} }
@ -1289,10 +1285,6 @@ NSMenuItem *screenshot_to_file_item = nil;
[execute_item setState:NSOffState]; [execute_item setState:NSOffState];
[pause_item setState:NSOffState]; [pause_item setState:NSOffState];
} }
[frame_skip_auto_item setTarget:self];
for(i = 0; i < MAX_FRAME_SKIP; i++)[frame_skip_item[i] setTarget:self];
[self setFrameSkip:[self frameSkip]]; //set the menu checkmarks correctly
// Backup media type // Backup media type
for(i = 0; i < MAX_SAVE_TYPE; i++)[save_type_item[i] setTarget:self]; for(i = 0; i < MAX_SAVE_TYPE; i++)[save_type_item[i] setTarget:self];
@ -1480,7 +1472,7 @@ NSMenuItem *screenshot_to_file_item = nil;
{ {
BOOL exists = false; BOOL exists = false;
NSString *searchPath = GetPathUserAppSupport(@"States"); NSString *searchPath = [[CocoaDSFile getURLUserAppSupportByKind:@"Save State"] path];
NSString *searchFileName = [self getSaveSlotFileName:slot]; NSString *searchFileName = [self getSaveSlotFileName:slot];
if (searchPath == nil || searchFileName == nil) if (searchPath == nil || searchFileName == nil)
@ -1489,7 +1481,7 @@ NSMenuItem *screenshot_to_file_item = nil;
} }
NSFileManager *fileManager = [[NSFileManager alloc] init]; NSFileManager *fileManager = [[NSFileManager alloc] init];
NSString *searchFullPath = [[searchPath stringByAppendingString:@"/"] stringByAppendingString:searchFileName]; NSString *searchFullPath = [searchPath stringByAppendingPathComponent:searchFileName];
exists = [fileManager isReadableFileAtPath:searchFullPath]; exists = [fileManager isReadableFileAtPath:searchFullPath];
@ -1502,7 +1494,7 @@ NSMenuItem *screenshot_to_file_item = nil;
{ {
NSString *fileExtension = [NSString stringWithFormat:@".ds%d", slotNumber]; NSString *fileExtension = [NSString stringWithFormat:@".ds%d", slotNumber];
return [[[pathLoadedRom lastPathComponent] stringByDeletingPathExtension] stringByAppendingString:fileExtension]; return [[[self romFileName] stringByDeletingPathExtension] stringByAppendingString:fileExtension];
} }
@end @end

View File

@ -1,26 +1,27 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "globals.h" #import <Cocoa/Cocoa.h>
#import "cocoa_input.h"
@class ScreenState; #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
#include "macosx_10_4_compat.h"
#endif
#ifdef GDB_STUB #ifdef GDB_STUB
#define OBJ_C #define OBJ_C
@ -28,7 +29,9 @@
#endif #endif
#define MAX_SLOTS 10 #define MAX_SLOTS 10
#define MAX_FRAME_SKIP 10
@class CocoaDSController;
@class ScreenState;
@interface CocoaDSStateBuffer : NSObject @interface CocoaDSStateBuffer : NSObject
{ {
@ -75,8 +78,7 @@
volatile int speed_limit; volatile int speed_limit;
volatile int save_type; volatile int save_type;
NSString *current_file; NSURL *loadedRomURL;
NSString *flash_file;
bool doesConfigNeedUpdate; bool doesConfigNeedUpdate;
NSTimeInterval calcTimeBudget; NSTimeInterval calcTimeBudget;
@ -109,32 +111,26 @@
- (void)setPlayerName:(NSString*)player_name; - (void)setPlayerName:(NSString*)player_name;
//ROM control //ROM control
- (BOOL)loadROM:(NSString*)filename; - (BOOL) loadRom:(NSURL *)romURL;
- (BOOL)ROMLoaded; - (BOOL)ROMLoaded;
- (void)closeROM; - (void)closeROM;
//ROM Info //ROM Info
- (NSImage*)ROMIcon; - (NSImage *)ROMIcon;
- (NSString*)ROMFile; - (NSString *) romFileName;
- (NSString*)ROMTitle; - (NSString *)ROMTitle;
- (NSInteger)ROMMaker; - (NSInteger)ROMMaker;
- (NSInteger)ROMSize; - (NSInteger)ROMSize;
- (NSInteger)ROMARM9Size; - (NSInteger)ROMARM9Size;
- (NSInteger)ROMARM7Size; - (NSInteger)ROMARM7Size;
- (NSInteger)ROMDataSize; - (NSInteger)ROMDataSize;
//Flash memory
- (NSString*)flashFile;
- (void)setFlashFile:(NSString*)filename;
//execution control //execution control
- (BOOL)executing; - (BOOL)executing;
- (void)execute; - (void)execute;
- (BOOL)paused; - (BOOL)paused;
- (void)pause; - (void)pause;
- (void)reset; - (void)reset;
- (void)setFrameSkip:(int)frameskip; //negative is auto, 0 is off, more than 0 is the amount of frames to skip before showing a frame
- (int)frameSkip; //defaults to -1
- (void)setSpeedLimit:(int)percent; //0 is off, 1-1000 is the pertance speed it runs at, anything else does nothing - (void)setSpeedLimit:(int)percent; //0 is off, 1-1000 is the pertance speed it runs at, anything else does nothing
- (int)speedLimit; - (int)speedLimit;
- (void)setSaveType:(int)savetype; // see save_types in src/mmu.h - (void)setSaveType:(int)savetype; // see save_types in src/mmu.h
@ -144,10 +140,6 @@
- (void) drawFrame; - (void) drawFrame;
- (void) padTime:(NSTimeInterval)timePad; - (void) padTime:(NSTimeInterval)timePad;
//save states
- (BOOL)saveState:(NSString*)file;
- (BOOL)loadState:(NSString*)file;
- (BOOL) isSubScreenLayerDisplayed:(int)i; - (BOOL) isSubScreenLayerDisplayed:(int)i;
- (BOOL) isMainScreenLayerDisplayed:(int)i; - (BOOL) isMainScreenLayerDisplayed:(int)i;
- (void) toggleMainScreenLayer:(int)i; - (void) toggleMainScreenLayer:(int)i;

View File

@ -1,23 +1,27 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "nds_control.h" #import "nds_control.h"
#import "cocoa_globals.h"
#import "cocoa_file.h"
#import "cocoa_input.h"
#import "cocoa_util.h"
#import "preferences.h" #import "preferences.h"
#import "screen_state.h" #import "screen_state.h"
#import "main_window.h" #import "main_window.h"
@ -44,11 +48,6 @@
//or if we can use inter-thread messaging introduced in leopard to update the screen (more efficient) //or if we can use inter-thread messaging introduced in leopard to update the screen (more efficient)
bool timer_based; bool timer_based;
//ds screens are 59.8 frames per sec, so 1/59.8 seconds per frame
//times one million for microseconds per frame
#define DS_SECONDS_PER_FRAME (1.0 / 59.8)
#define DS_MICROSECONDS_PER_FRAME (1.0 / 59.8) * 1000000.0
//accessed from other files //accessed from other files
volatile bool execute = true; volatile bool execute = true;
@ -61,13 +60,6 @@ GPU3DInterface *core3DList[] = {
NULL NULL
}; };
enum
{
CORE3DLIST_NULL = 0,
CORE3DLIST_RASTERIZE,
CORE3DLIST_OPENGL
};
SoundInterface_struct *SNDCoreList[] = { SoundInterface_struct *SNDCoreList[] = {
&SNDDummy, &SNDDummy,
#ifdef DESMUME_COCOA #ifdef DESMUME_COCOA
@ -108,8 +100,7 @@ bool opengl_init()
speed_limit = 100; //default to max speed = normal speed speed_limit = 100; //default to max speed = normal speed
calcTimeBudget = (NSTimeInterval)(DS_SECONDS_PER_FRAME / ((float)speed_limit / 100.0)); calcTimeBudget = (NSTimeInterval)(DS_SECONDS_PER_FRAME / ((float)speed_limit / 100.0));
gui_thread = [NSThread currentThread]; gui_thread = [NSThread currentThread];
current_file = nil; loadedRomURL = nil;
flash_file = nil;
execution_lock = [[NSLock alloc] init]; execution_lock = [[NSLock alloc] init];
sound_lock = [[NSLock alloc] init]; sound_lock = [[NSLock alloc] init];
current_screen = nil; current_screen = nil;
@ -123,20 +114,7 @@ bool opengl_init()
struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface; struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface;
struct armcpu_ctrl_iface *arm9_ctrl_iface; struct armcpu_ctrl_iface *arm9_ctrl_iface;
struct armcpu_ctrl_iface *arm7_ctrl_iface; struct armcpu_ctrl_iface *arm7_ctrl_iface;
#endif
//Set the flash file if it's in the prefs/cmd line. It will be nil if it isn't.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
flash_file = [[defaults stringForKey:PREF_FLASH_FILE] retain];
if ([flash_file length] > 0) {
//NSLog(@"Using flash file: \"%@\"\n", flash_file);
} else {
[flash_file release];
flash_file = nil;
//NSLog(@"No flash file given\n");
}
#ifdef GDB_STUB
//create GDB stubs if required //create GDB stubs if required
arm9_gdb_port = [defaults integerForKey:PREF_ARM9_GDB_PORT]; arm9_gdb_port = [defaults integerForKey:PREF_ARM9_GDB_PORT];
arm7_gdb_port = [defaults integerForKey:PREF_ARM7_GDB_PORT]; arm7_gdb_port = [defaults integerForKey:PREF_ARM7_GDB_PORT];
@ -219,14 +197,14 @@ bool opengl_init()
if((pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]) == nil) if((pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]) == nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL pixel format for 3D rendering"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL pixel format for 3D rendering", nil)];
context = nil; context = nil;
} else if((context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]) == nil) } else if((context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]) == nil)
{ {
[pixel_format release]; [pixel_format release];
pixel_format = nil; pixel_format = nil;
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL context for 3D rendering"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL context for 3D rendering", nil)];
} else } else
{ {
[context makeCurrentContext]; [context makeCurrentContext];
@ -253,8 +231,8 @@ bool opengl_init()
if(pixel_buffer == nil) if(pixel_buffer == nil)
{ {
GLenum error = glGetError(); GLenum error = glGetError();
messageDialog(NSLocalizedString(@"Error", nil), NSString *errorStr = [NSString stringWithFormat:@"Error setting up rgba pixel buffer for 3D rendering (glerror: %d)", error];
[NSString stringWithFormat:@"Error setting up rgba pixel buffer for 3D rendering (glerror: %d)", error]); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(errorStr, nil)];
} else } else
{ {
[context setPixelBuffer:pixel_buffer cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:0]; [context setPixelBuffer:pixel_buffer cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:0];
@ -276,9 +254,9 @@ bool opengl_init()
[context makeCurrentContext]; [context makeCurrentContext];
//oglrender_init = &opengl_init; //oglrender_init = &opengl_init;
NDS_3D_SetDriver(CORE3DLIST_RASTERIZE); NDS_3D_SetDriver(CORE3DLIST_SWRASTERIZE);
if(!gpu3D->NDS_3D_Init()) if(!gpu3D->NDS_3D_Init())
messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize OpenGL components"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Unable to initialize OpenGL components", nil)];
} }
if(prev_context != nil) //make sure the old context is restored, and make sure our new context is not set in this thread (since the other thread will need it) if(prev_context != nil) //make sure the old context is restored, and make sure our new context is not set in this thread (since the other thread will need it)
@ -294,7 +272,7 @@ bool opengl_init()
volume = 100; volume = 100;
#ifdef DESMUME_COCOA #ifdef DESMUME_COCOA
if(SPU_ChangeSoundCore(SNDCORE_OSX, 735 * 4) != 0) if(SPU_ChangeSoundCore(SNDCORE_OSX, 735 * 4) != 0)
messageDialog(NSLocalizedString(@"Error", nil), @"Unable to initialize sound core"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Unable to initialize sound core", nil)];
else else
SPU_SetVolume(volume); SPU_SetVolume(volume);
#endif #endif
@ -355,8 +333,7 @@ bool opengl_init()
[error_object release]; [error_object release];
[context release]; [context release];
[pixel_format release]; [pixel_format release];
[current_file release]; [loadedRomURL release];
[flash_file release];
[sound_lock release]; [sound_lock release];
[execution_lock release]; [execution_lock release];
@ -395,24 +372,20 @@ bool opengl_init()
//NDS_CreateDummyFirmware(&macDS_firmware); //NDS_CreateDummyFirmware(&macDS_firmware);
} }
- (BOOL)loadROM:(NSString*)filename - (BOOL) loadRom:(NSURL *)romURL
{ {
BOOL result = NO;
//pause if not already paused //pause if not already paused
BOOL was_paused = [self paused]; BOOL was_paused = [self paused];
[self pause]; [self pause];
//get the flash file
const char *flash;
if (flash_file != nil)
flash = [flash_file UTF8String];
else
flash = NULL;
//load the rom //load the rom
if(!NDS_LoadROM([filename cStringUsingEncoding:NSUTF8StringEncoding], flash) > 0) result = [CocoaDSFile loadRom:romURL];
if(!result)
{ {
//if it didn't work give an error and dont unpause //if it didn't work give an error and dont unpause
messageDialog(NSLocalizedString(@"Error", nil), @"Could not open file"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Could not open file", nil)];
//continue playing if load didn't work //continue playing if load didn't work
if(was_paused == NO)[self execute]; if(was_paused == NO)[self execute];
@ -427,9 +400,10 @@ bool opengl_init()
current_screen = nil; current_screen = nil;
} }
//set local vars // Retain a copy of the URL of the currently loaded ROM, since we'll be
current_file = filename; // using it later.
[current_file retain]; loadedRomURL = romURL;
[loadedRomURL retain];
//this is incase emulation stopped from the //this is incase emulation stopped from the
//emulation core somehow //emulation core somehow
@ -440,7 +414,7 @@ bool opengl_init()
- (BOOL)ROMLoaded - (BOOL)ROMLoaded
{ {
return (current_file==nil)?NO:YES; return (loadedRomURL==nil)?NO:YES;
} }
- (void)closeROM - (void)closeROM
@ -455,8 +429,8 @@ bool opengl_init()
NDS_FreeROM(); NDS_FreeROM();
[current_file release]; [loadedRomURL release];
current_file = nil; loadedRomURL = nil;
} }
- (NSImage*)ROMIcon - (NSImage*)ROMIcon
@ -538,9 +512,9 @@ bool opengl_init()
return result; return result;
} }
- (NSString*)ROMFile - (NSString*)romFileName
{ {
return current_file; return [[loadedRomURL path] lastPathComponent];
} }
- (NSString*)ROMTitle - (NSString*)ROMTitle
@ -573,18 +547,6 @@ bool opengl_init()
return NDS_getROMHeader()->ARM7binSize + NDS_getROMHeader()->ARM7src; return NDS_getROMHeader()->ARM7binSize + NDS_getROMHeader()->ARM7src;
} }
- (NSString*)flashFile
{
return flash_file;
}
- (void)setFlashFile:(NSString*)filename
{
if (flash_file)
[flash_file release];
flash_file = [filename retain];
}
- (BOOL)executing - (BOOL)executing
{ {
return run; return run;
@ -633,23 +595,6 @@ bool opengl_init()
execute = true; execute = true;
} }
- (void)setFrameSkip:(int)frameskip
{
dsStateBuffer->frame_skip = frameskip;
if(frameskip < 0)
{
dsStateBuffer->frame_skip = -1;
}
doesConfigNeedUpdate = true;
}
- (int)frameSkip
{
return frame_skip;
}
- (void)setSpeedLimit:(int)speedLimit - (void)setSpeedLimit:(int)speedLimit
{ {
if(speedLimit < 0 || speedLimit > 1000) if(speedLimit < 0 || speedLimit > 1000)
@ -680,44 +625,6 @@ bool opengl_init()
return CommonSettings.manualBackupType; return CommonSettings.manualBackupType;
} }
- (BOOL)saveState:(NSString*)file
{
[execution_lock lock];
BOOL result = NO;
if(savestate_save([file cStringUsingEncoding:NSUTF8StringEncoding]))
result = YES;
[execution_lock unlock];
return result;
}
- (BOOL)loadState:(NSString*)file
{
[execution_lock lock];
//Set the GPU context (if it exists) incase the core needs to load anything into opengl during state load
NSOpenGLContext *prev_context = [NSOpenGLContext currentContext];
[prev_context retain];
[context makeCurrentContext];
BOOL result = NO;
if(savestate_load([file cStringUsingEncoding:NSUTF8StringEncoding]))
result = YES;
[execution_lock unlock];
if(prev_context != nil)
{
[prev_context makeCurrentContext];
[prev_context release];
} else
[NSOpenGLContext clearCurrentContext];
return result;
}
- (BOOL) isSubScreenLayerDisplayed:(int)i - (BOOL) isSubScreenLayerDisplayed:(int)i
{ {
GPU *theGPU = SubScreen.gpu; GPU *theGPU = SubScreen.gpu;
@ -1106,7 +1013,7 @@ bool opengl_init()
- (void) padTime:(NSTimeInterval)timePad - (void) padTime:(NSTimeInterval)timePad
{ {
#if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) // Code for Mac OS X 10.4 and earlier #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 // Code for Mac OS X 10.4 and earlier
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:timePad]]; [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:timePad]];

View File

@ -1,32 +1,34 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME This file is free software: you can redistribute it and/or modify
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
DeSmuME is distributed in the hope that it will be useful, This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software along with the this software. If not, see <http://www.gnu.org/licenses/>.
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
#include "macosx_10_4_compat.h"
#endif
#define PREF_EXECUTE_UPON_LOAD @"Execute Upon Load" #define PREF_EXECUTE_UPON_LOAD @"Execute Upon Load"
#define PREF_AFTER_LAUNCHED @"When Launching, Load" #define PREF_AFTER_LAUNCHED @"When Launching, Load"
#define PREF_AFTER_LAUNCHED_OPTION_NOTHING @"Load Nothing" #define PREF_AFTER_LAUNCHED_OPTION_NOTHING @"Load Nothing"
#define PREF_AFTER_LAUNCHED_OPTION_LAST_ROM @"Load Last ROM" #define PREF_AFTER_LAUNCHED_OPTION_LAST_ROM @"Load Last ROM"
#define PREF_FLASH_FILE @"Flash File"
#ifdef GDB_STUB #ifdef GDB_STUB
#define PREF_ARM9_GDB_PORT @"arm9gdb" #define PREF_ARM9_GDB_PORT @"arm9gdb"
#define PREF_ARM7_GDB_PORT @"arm7gdb" #define PREF_ARM7_GDB_PORT @"arm7gdb"

View File

@ -1,24 +1,24 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "preferences.h" #import "preferences.h"
#import "globals.h" #import "cocoa_util.h"
#import "input.h" #import "input.h"
/* Preference settings are stored using NSUserDefaults /* Preference settings are stored using NSUserDefaults
@ -49,9 +49,6 @@ NSMutableDictionary *defaults;
void setAppDefaults() void setAppDefaults()
{ {
defaults = [[NSMutableDictionary alloc] initWithObjectsAndKeys: defaults = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
//Flash file default
@"", PREF_FLASH_FILE,
//Interface defaults //Interface defaults
@"Yes", PREF_EXECUTE_UPON_LOAD, @"Yes", PREF_EXECUTE_UPON_LOAD,
@ -376,7 +373,7 @@ NSView *createPreferencesView(NSString *helpinfo, NSDictionary *options, id dele
NSString *default_setting = [defaults objectForKey:key_raw]; NSString *default_setting = [defaults objectForKey:key_raw];
//show an error //show an error
messageDialog(NSLocalizedString(@"Error",nil), [NSString stringWithFormat:@"%@ setting corrupt (%@), resetting to default (%@)", key, NSLocalizedString(current_setting, nil), NSLocalizedString(default_setting, nil)]); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:[NSString stringWithFormat:@"%@ setting corrupt (%@), resetting to default (%@)", key, NSLocalizedString(current_setting, nil), NSLocalizedString(default_setting, nil)]];
//set the setting to default //set the setting to default
[[NSUserDefaults standardUserDefaults] setObject:default_setting forKey:key_raw]; [[NSUserDefaults standardUserDefaults] setObject:default_setting forKey:key_raw];

View File

@ -1,23 +1,27 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "globals.h" #import <Cocoa/Cocoa.h>
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
#include "macosx_10_4_compat.h"
#endif
#define DS_BPP 2 //bytes per pixel #define DS_BPP 2 //bytes per pixel
#define DS_SCREEN_X_RATIO (256.0 / (192.0 * 2.0)) #define DS_SCREEN_X_RATIO (256.0 / (192.0 * 2.0))

View File

@ -1,23 +1,24 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "screen_state.h" #import "screen_state.h"
#import "cocoa_util.h"
@implementation ScreenState @implementation ScreenState
+ (NSInteger)width + (NSInteger)width
@ -85,41 +86,67 @@
return color_data; return color_data;
} }
- (NSImage*)image - (NSImage *)image
{ {
NSImage *result = [[NSImage alloc] initWithSize:[ScreenState size]]; NSImage *newImage = [[NSImage alloc] initWithSize:[ScreenState size]];
[result addRepresentation:[self imageRep]]; if (newImage == nil)
return [result autorelease]; {
} return newImage;
- (NSBitmapImageRep*)imageRep
{
NSBitmapImageRep *image = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:DS_SCREEN_WIDTH
pixelsHigh:DS_SCREEN_HEIGHT*2
bitsPerSample:8
samplesPerPixel:3
hasAlpha:NO
isPlanar:NO
colorSpaceName:NSCalibratedRGBColorSpace
bytesPerRow:DS_SCREEN_WIDTH*3
bitsPerPixel:24];
if(image == nil)return nil;
unsigned char *bitmap_data = [image bitmapData];
const unsigned short *buffer_16 = (unsigned short*)color_data;
int i;
for(i = 0; i < DS_SCREEN_WIDTH * DS_SCREEN_HEIGHT*2; i++)
{ //this loop we go through pixel by pixel and convert from 16bit to 24bit for the NSImage
*(bitmap_data++) = (*buffer_16 & 0x001F) << 3;
*(bitmap_data++) = (*buffer_16 & 0x03E0) >> 5 << 3;
*(bitmap_data++) = (*buffer_16 & 0x7C00) >> 10 << 3;
buffer_16++;
} }
return [image autorelease]; // Render the frame in an NSBitmapImageRep
NSBitmapImageRep *newImageRep = [self imageRep];
if (newImageRep == nil)
{
[newImage release];
newImage = nil;
return newImage;
}
// Attach the rendered frame to the NSImageRep
[newImage addRepresentation:newImageRep];
return newImage;
} }
@end
- (NSBitmapImageRep *)imageRep
{
if (color_data == nil)
{
return nil;
}
NSUInteger w = DS_SCREEN_WIDTH;
NSUInteger h = DS_SCREEN_HEIGHT * 2;
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:w
pixelsHigh:h
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSCalibratedRGBColorSpace
bytesPerRow:w * 4
bitsPerPixel:32];
if(imageRep == nil)
{
return imageRep;
}
UInt32 *bitmapData = (UInt32 *)[imageRep bitmapData];
RGBA5551ToRGBA8888Buffer((const uint16_t *)color_data, (uint32_t *)bitmapData, (w * h));
#ifdef __BIG_ENDIAN__
UInt32 *bitmapDataEnd = bitmapData + (w * h);
while (bitmapData < bitmapDataEnd)
{
*bitmapData++ = CFSwapInt32LittleToHost(*bitmapData);
}
#endif
return [imageRep autorelease];
}
@end

View File

@ -1,23 +1,24 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "screenshot.h" #import "screenshot.h"
#import "cocoa_util.h"
#import "nds_control.h" #import "nds_control.h"
#import "screen_state.h" #import "screen_state.h"
@ -180,7 +181,7 @@
//tell cocoa save the file //tell cocoa save the file
NSBitmapImageRep *image = [screen imageRep]; NSBitmapImageRep *image = [screen imageRep];
if(image == nil) if(image == nil)
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create the screenshot image"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create the screenshot image", nil)];
else else
[[image representationUsingType:type properties:[NSDictionary dictionary]] [[image representationUsingType:type properties:[NSDictionary dictionary]]
writeToFile:[panel filename] atomically:NO]; writeToFile:[panel filename] atomically:NO];

View File

@ -1,23 +1,23 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "nds_control.h" #import <Cocoa/Cocoa.h>
//This class uses OpenGL for drawing for speed //This class uses OpenGL for drawing for speed
//if opengl is not available it uses NSImage //if opengl is not available it uses NSImage

View File

@ -1,23 +1,25 @@
/* Copyright (C) 2007 Jeff Bland /*
Copyright (C) 2007 Jeff Bland
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012 DeSmuME team
This file is part of DeSmuME 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.
DeSmuME is free software; you can redistribute it and/or modify This file is distributed in the hope that it will be useful,
it under the terms of the GNU General Public License as published by but WITHOUT ANY WARRANTY; without even the implied warranty of
the Free Software Foundation; either version 2 of the License, or MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(at your option) any later version. GNU General Public License for more details.
DeSmuME is distributed in the hope that it will be useful, You should have received a copy of the GNU General Public License
but WITHOUT ANY WARRANTY; without even the implied warranty of along with the this software. If not, see <http://www.gnu.org/licenses/>.
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 DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#import "video_output_view.h" #import "video_output_view.h"
#import "nds_control.h"
#import "cocoa_util.h"
#import "screen_state.h" #import "screen_state.h"
#define HORIZONTAL(angle) ((angle) == -90 || (angle) == -270) #define HORIZONTAL(angle) ((angle) == -90 || (angle) == -270)
@ -45,7 +47,7 @@
if(self==nil) if(self==nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create a view for video output"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create a view for video output", nil)];
return nil; return nil;
} }
@ -72,7 +74,7 @@
NSOpenGLPixelFormat* pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; NSOpenGLPixelFormat* pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
if(pixel_format == nil) if(pixel_format == nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL pixel format for video output"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL pixel format for video output", nil)];
context = nil; context = nil;
[self release]; [self release];
return nil; return nil;
@ -83,7 +85,7 @@
[pixel_format release]; [pixel_format release];
if(context == nil) if(context == nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create OpenGL context for video output"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL context for video output", nil)];
[self release]; [self release];
return nil; return nil;
} }
@ -116,7 +118,7 @@
if(screen == nil) if(screen == nil)
{ {
messageDialog(NSLocalizedString(@"Error", nil), @"Recieved invalid screen update"); [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Recieved invalid screen update", nil)];
return; return;
} }