diff --git a/desmume/src/cocoa/DeSmuME.xcodeproj/project.pbxproj b/desmume/src/cocoa/DeSmuME.xcodeproj/project.pbxproj index 2e790962b..8db87849a 100644 --- a/desmume/src/cocoa/DeSmuME.xcodeproj/project.pbxproj +++ b/desmume/src/cocoa/DeSmuME.xcodeproj/project.pbxproj @@ -25,7 +25,6 @@ 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 */; }; 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 */; }; AB06CB5A135B8A4D00E977B3 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_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 */; }; 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 */; }; - 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 */; }; AB06CB66135B8A4D00E977B3 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_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 */; }; AB0A0D3714AACE9500E83E91 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; 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 */; }; AB0A0D3D14AACE9500E83E91 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_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 */; }; 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 */; }; + 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 */; }; 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 */; }; 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 */; }; 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 */; }; @@ -392,7 +398,6 @@ ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; ABFE4242143E32F0009A3CCE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; 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 */; }; ABFE4248143E32F0009A3CCE /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB06CB4E135B8A4D00E977B3 /* cocoa_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 = ""; }; 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 = ""; }; - AB06CB42135B8A4D00E977B3 /* globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = globals.h; sourceTree = ""; }; AB06CB43135B8A4D00E977B3 /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; AB06CB44135B8A4D00E977B3 /* main_window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main_window.h; sourceTree = ""; }; AB06CB45135B8A4D00E977B3 /* nds_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nds_control.h; sourceTree = ""; }; @@ -529,7 +533,6 @@ AB06CB49135B8A4D00E977B3 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = ""; }; AB06CB4A135B8A4D00E977B3 /* video_output_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_output_view.h; sourceTree = ""; }; AB06CB4B135B8A4D00E977B3 /* about.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = about.m; sourceTree = ""; }; - AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cocoa_util.m; sourceTree = ""; }; AB06CB4D135B8A4D00E977B3 /* screen_state.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = screen_state.m; sourceTree = ""; }; AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = ""; }; AB06CB4F135B8A4D00E977B3 /* input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = input.mm; sourceTree = ""; }; @@ -750,6 +753,9 @@ AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = ""; }; AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = ""; }; AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = ""; }; + AB8FE30A14B647D6009E20B1 /* macosx_10_4_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macosx_10_4_compat.h; sourceTree = ""; }; + AB8FE37414B652EC009E20B1 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; + AB8FE37514B652EC009E20B1 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = ""; }; ABBF045E14B5144D00E505A0 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = "translations/English.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; ABBF04C114B519CD00E505A0 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = "translations/French.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; ABBF04C314B519DF00E505A0 /* Italian */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Italian; path = "translations/Italian.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; @@ -760,6 +766,8 @@ ABBF04CB14B51BBB00E505A0 /* Chinese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Chinese; path = translations/Chinese.lproj/Localizable.strings; sourceTree = ""; }; ABBF04CC14B51BC300E505A0 /* Norwegian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Norwegian; path = translations/Norwegian.lproj/Localizable.strings; sourceTree = ""; }; ABBF04CD14B51BC900E505A0 /* Romanian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Romanian; path = translations/Romanian.lproj/Localizable.strings; sourceTree = ""; }; + ABBF052F14B5436E00E505A0 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; + ABBF053B14B543B600E505A0 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = ""; }; ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = ""; }; ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = ""; }; @@ -814,6 +822,7 @@ ABFE42AF143E32F0009A3CCE /* AudioUnit.framework in Frameworks */, ABFE42B0143E32F0009A3CCE /* AppKit.framework in Frameworks */, ABFE42B1143E32F0009A3CCE /* Foundation.framework in Frameworks */, + AB8FE48C14B6657D009E20B1 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -825,10 +834,12 @@ children = ( AB06CEC4135B8E0B00E977B3 /* dialogs */, ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */, + ABBF053B14B543B600E505A0 /* cocoa_file.h */, ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */, AB06CB41135B8A4D00E977B3 /* cocoa_input.h */, - AB06CB42135B8A4D00E977B3 /* globals.h */, + AB8FE37414B652EC009E20B1 /* cocoa_util.h */, AB06CB43135B8A4D00E977B3 /* input.h */, + AB8FE30A14B647D6009E20B1 /* macosx_10_4_compat.h */, AB06CB44135B8A4D00E977B3 /* main_window.h */, AB06CB45135B8A4D00E977B3 /* nds_control.h */, AB06CB46135B8A4D00E977B3 /* preferences.h */, @@ -837,9 +848,10 @@ AB06CB49135B8A4D00E977B3 /* sndOSX.h */, AB06CB4A135B8A4D00E977B3 /* video_output_view.h */, AB06CB4B135B8A4D00E977B3 /* about.m */, - AB06CB4C135B8A4D00E977B3 /* cocoa_util.m */, AB06CB4D135B8A4D00E977B3 /* screen_state.m */, + ABBF052F14B5436E00E505A0 /* cocoa_file.mm */, AB06CB4E135B8A4D00E977B3 /* cocoa_input.mm */, + AB8FE37514B652EC009E20B1 /* cocoa_util.mm */, AB06CB4F135B8A4D00E977B3 /* input.mm */, AB06CB51135B8A4D00E977B3 /* main.mm */, AB06CB50135B8A4D00E977B3 /* main_window.mm */, @@ -1446,7 +1458,6 @@ buildActionMask = 2147483647; files = ( AB06CB63135B8A4D00E977B3 /* about.m in Sources */, - AB06CB64135B8A4D00E977B3 /* cocoa_util.m in Sources */, AB06CB65135B8A4D00E977B3 /* screen_state.m in Sources */, AB06CB66135B8A4D00E977B3 /* cocoa_input.mm in Sources */, AB06CB67135B8A4D00E977B3 /* input.mm in Sources */, @@ -1557,6 +1568,8 @@ 7FA912261426523900E2ABDD /* tinyxmlerror.cpp in Sources */, 7FA912271426523900E2ABDD /* tinyxmlparser.cpp in Sources */, ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */, + ABBF053314B5436E00E505A0 /* cocoa_file.mm in Sources */, + AB8FE37914B652EC009E20B1 /* cocoa_util.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1565,7 +1578,6 @@ buildActionMask = 2147483647; files = ( AB06CB57135B8A4D00E977B3 /* about.m in Sources */, - AB06CB58135B8A4D00E977B3 /* cocoa_util.m in Sources */, AB06CB59135B8A4D00E977B3 /* screen_state.m in Sources */, AB06CB5A135B8A4D00E977B3 /* cocoa_input.mm in Sources */, AB06CB5B135B8A4D00E977B3 /* input.mm in Sources */, @@ -1666,6 +1678,8 @@ 7FA912221426523900E2ABDD /* tinyxmlerror.cpp in Sources */, 7FA912231426523900E2ABDD /* tinyxmlparser.cpp in Sources */, ABF4007F14B4F1C000578AE7 /* sndOSX.cpp in Sources */, + ABBF053014B5436E00E505A0 /* cocoa_file.mm in Sources */, + AB8FE37714B652EC009E20B1 /* cocoa_util.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1674,7 +1688,6 @@ buildActionMask = 2147483647; files = ( AB0A0D3A14AACE9500E83E91 /* about.m in Sources */, - AB0A0D3B14AACE9500E83E91 /* cocoa_util.m in Sources */, AB0A0D3C14AACE9500E83E91 /* screen_state.m in Sources */, AB0A0D3D14AACE9500E83E91 /* cocoa_input.mm in Sources */, AB0A0D3E14AACE9500E83E91 /* input.mm in Sources */, @@ -1775,6 +1788,8 @@ AB0A0D9F14AACE9500E83E91 /* tinyxmlerror.cpp in Sources */, AB0A0DA014AACE9500E83E91 /* tinyxmlparser.cpp in Sources */, ABF4008014B4F1C000578AE7 /* sndOSX.cpp in Sources */, + ABBF053114B5436E00E505A0 /* cocoa_file.mm in Sources */, + AB8FE37614B652EC009E20B1 /* cocoa_util.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1783,7 +1798,6 @@ buildActionMask = 2147483647; files = ( ABFE4245143E32F0009A3CCE /* about.m in Sources */, - ABFE4246143E32F0009A3CCE /* cocoa_util.m in Sources */, ABFE4247143E32F0009A3CCE /* screen_state.m in Sources */, ABFE4248143E32F0009A3CCE /* cocoa_input.mm in Sources */, ABFE4249143E32F0009A3CCE /* input.mm in Sources */, @@ -1884,6 +1898,8 @@ ABFE42AA143E32F0009A3CCE /* tinyxmlerror.cpp in Sources */, ABFE42AB143E32F0009A3CCE /* tinyxmlparser.cpp in Sources */, ABF4008114B4F1C000578AE7 /* sndOSX.cpp in Sources */, + ABBF053214B5436E00E505A0 /* cocoa_file.mm in Sources */, + AB8FE37814B652EC009E20B1 /* cocoa_util.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/desmume/src/cocoa/DeSmuME_Prefix.pch b/desmume/src/cocoa/DeSmuME_Prefix.pch index f204dcbd4..56a344a1b 100644 --- a/desmume/src/cocoa/DeSmuME_Prefix.pch +++ b/desmume/src/cocoa/DeSmuME_Prefix.pch @@ -1,20 +1,19 @@ -/* Copyright (C) 2011 Roger Manuel - - 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 +/* + 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 . */ #ifdef __OBJC__ @@ -23,4 +22,5 @@ #define DESMUME_COCOA #define HAVE_OPENGL -#define HAVE_LIBZ \ No newline at end of file +#define HAVE_LIBZ +#define PORT_VERSION "Cocoa" \ No newline at end of file diff --git a/desmume/src/cocoa/about.m b/desmume/src/cocoa/about.m index c58106dc7..a4f31d635 100644 --- a/desmume/src/cocoa/about.m +++ b/desmume/src/cocoa/about.m @@ -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 - - 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 - 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. - 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 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 + along with the this software. If not, see . */ -#import "globals.h" +#import -#define STRING_DESMUME_WEBSITE "http://www.desmume.org" -#define STRING_DESMUME_FORUM_SITE "http://forums.desmume.org/index.php" -#define STRING_DESMUME_BUG_SITE "http://sourceforge.net/tracker/?group_id=164579&atid=832291" +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + #include "macosx_10_4_compat.h" +#endif + +#import "cocoa_globals.h" #define STRING_FILENAME_README "README" #define STRING_FILENAME_COPYING "COPYING" diff --git a/desmume/src/cocoa/cocoa_file.h b/desmume/src/cocoa/cocoa_file.h new file mode 100644 index 000000000..557ee3516 --- /dev/null +++ b/desmume/src/cocoa/cocoa_file.h @@ -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 . +*/ + +#import + +#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 diff --git a/desmume/src/cocoa/cocoa_file.mm b/desmume/src/cocoa/cocoa_file.mm new file mode 100644 index 000000000..0d484073f --- /dev/null +++ b/desmume/src/cocoa/cocoa_file.mm @@ -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 . +*/ + +#import "cocoa_file.h" +#include +#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 diff --git a/desmume/src/cocoa/cocoa_util.h b/desmume/src/cocoa/cocoa_util.h new file mode 100644 index 000000000..c67ae8cca --- /dev/null +++ b/desmume/src/cocoa/cocoa_util.h @@ -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 . +*/ + +#import + +#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 +#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 diff --git a/desmume/src/cocoa/cocoa_util.m b/desmume/src/cocoa/cocoa_util.m deleted file mode 100644 index fd8447e47..000000000 --- a/desmume/src/cocoa/cocoa_util.m +++ /dev/null @@ -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 -#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; -} \ No newline at end of file diff --git a/desmume/src/cocoa/cocoa_util.mm b/desmume/src/cocoa/cocoa_util.mm new file mode 100644 index 000000000..e42174291 --- /dev/null +++ b/desmume/src/cocoa/cocoa_util.mm @@ -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 . +*/ + +#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; +} diff --git a/desmume/src/cocoa/globals.h b/desmume/src/cocoa/globals.h deleted file mode 100644 index e4b8c82a1..000000000 --- a/desmume/src/cocoa/globals.h +++ /dev/null @@ -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 - -#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 \ No newline at end of file diff --git a/desmume/src/cocoa/input.mm b/desmume/src/cocoa/input.mm index eb5af23f3..051044ad2 100644 --- a/desmume/src/cocoa/input.mm +++ b/desmume/src/cocoa/input.mm @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ #import "input.h" +#import "cocoa_input.h" #import "main_window.h" #import "preferences.h" diff --git a/desmume/src/cocoa/macosx_10_4_compat.h b/desmume/src/cocoa/macosx_10_4_compat.h new file mode 100644 index 000000000..05c82bfe4 --- /dev/null +++ b/desmume/src/cocoa/macosx_10_4_compat.h @@ -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 . +*/ + +#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 diff --git a/desmume/src/cocoa/main.mm b/desmume/src/cocoa/main.mm index d3b4c0e6f..e9dd3ccab 100644 --- a/desmume/src/cocoa/main.mm +++ b/desmume/src/cocoa/main.mm @@ -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 - - 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 - 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. - 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 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 + along with the this software. If not, see . */ /* @@ -24,6 +24,9 @@ Based on work by yopyop and the DeSmuME team! Mac related questions can go to osx@desmume.org */ +#import +#import "cocoa_file.h" +#import "cocoa_util.h" #import "main_window.h" #import "preferences.h" @@ -75,9 +78,6 @@ extern NSMenuItem *execute_item; extern NSMenuItem *pause_item; extern NSMenuItem *reset_item; -extern NSMenuItem *frame_skip_auto_item; -extern NSMenuItem *frame_skip_item[]; - extern NSMenuItem *save_type_item[]; extern NSString *save_types[]; @@ -114,7 +114,6 @@ extern NSMenuItem *rom_info_item; //delegate methods - (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename; -- (void)application:(NSApplication*)sender openFiles:(NSArray*)filenames; - (void)applicationWillFinishLaunching:(NSNotification*)aNotification; - (void)applicationDidFinishLaunching:(NSNotification*)aNotification; - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender; @@ -238,30 +237,6 @@ void CreateMenu(AppDelegate *delegate) [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 temp = [emulation_menu addItemWithTitle:NSLocalizedString(@"Speed Limit", nil) action:nil keyEquivalent:@""]; @@ -311,11 +286,6 @@ void CreateMenu(AppDelegate *delegate) [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]; } @@ -415,12 +385,7 @@ void CreateMenu(AppDelegate *delegate) [sound_menu addItem:[NSMenuItem separatorItem]]; 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]; } @@ -505,7 +470,6 @@ int main(int argc, char *argv[]) [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; - [panel setTitle:NSLocalizedString(@"Open ROM...", nil)]; 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 { - //verify everything - if(sender != NSApp)return NO; - 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; - } + BOOL result = NO; + NSURL *fileURL = [NSURL fileURLWithPath:filename]; - NSString *filename = [filenames lastObject]; - if(!filename || [filename length] == 0) + NSString *fileKind = [CocoaDSFile fileKind:fileURL]; + if ([fileKind isEqualToString:@"DS ROM"] || [fileKind isEqualToString:@"GBA ROM"]) { - [sender replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; - return; + result = [main_window loadRom:fileURL]; } - if([main_window loadROM:filename]) - { - //[main_window execute]; - [sender replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; - return; - } + return result; } - (void)applicationWillFinishLaunching:(NSNotification*)notification @@ -587,6 +505,9 @@ int main(int argc, char *argv[]) //create the menus CreateMenu(self); + + //create the video output window (the only window that opens with the app) + main_window = [[VideoOutputWindow alloc] init]; } - (void)applicationDidFinishLaunching:(NSNotification*)notification @@ -595,7 +516,7 @@ int main(int argc, char *argv[]) [NSApp activateIgnoringOtherApps:TRUE]; //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 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) { - //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 - 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]; + [main_window loadRom:romURL]; } } } @@ -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) if([main_window ROMLoaded]) - if(!messageDialogYN(NSLocalizedString(@"DeSmuME Emulator", nil), NSLocalizedString(@"Are you sure you want to quit?", nil))) - return NSTerminateCancel; + if(![CocoaDSUtil quickYesNoDialogUsingTitle:NSLocalizedString(@"DeSmuME Emulator", nil) message:NSLocalizedString(@"Are you sure you want to quit?", nil)]) + return NSTerminateCancel; return NSTerminateNow; } diff --git a/desmume/src/cocoa/main_window.h b/desmume/src/cocoa/main_window.h index b078127df..fd1df1953 100644 --- a/desmume/src/cocoa/main_window.h +++ b/desmume/src/cocoa/main_window.h @@ -48,8 +48,6 @@ bool no_smaller_than_ds; bool keep_proportions; - - NSString *pathLoadedRom; } //initialization @@ -57,17 +55,14 @@ - (void)dealloc; //overloaded from NintendoDS class -- (BOOL)loadROM:(NSString*)filename; +- (BOOL) loadRom:(NSURL *)romURL; - (void)execute; - (void)pause; - (void)reset; -- (void)setFrameSkip:(int)frameskip; - (void)setSaveType:(int)savetype; - (void)closeROM; //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)loadStateFromSlot:(int)slot; diff --git a/desmume/src/cocoa/main_window.mm b/desmume/src/cocoa/main_window.mm index 11313e681..aa4e663bf 100644 --- a/desmume/src/cocoa/main_window.mm +++ b/desmume/src/cocoa/main_window.mm @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ //DeSmuME Cocoa includes #import "main_window.h" +#import "cocoa_globals.h" +#import "cocoa_util.h" +#import "cocoa_file.h" #import "screenshot.h" #import "screen_state.h" #import "video_output_view.h" @@ -30,8 +33,6 @@ //How much padding to put around the video output #define WINDOW_BORDER_PADDING 5 -#define MAX_FRAME_SKIP 10 - // Save types settings NSString *save_types[MAX_SAVE_TYPE] = { 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 *loadSlot_item[MAX_SLOTS] = { nil, nil, nil, nil, nil, nil, nil, nil, nil, 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_50_item = nil; NSMenuItem *speed_limit_75_item = nil; @@ -196,7 +195,7 @@ NSMenuItem *screenshot_to_file_item = nil; NSTitledWindowMask|NSResizableWindowMask|/*NSClosableWindowMask|*/NSMiniaturizableWindowMask|NSTexturedBackgroundWindowMask 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]; return nil; } @@ -234,8 +233,6 @@ NSMenuItem *screenshot_to_file_item = nil; NSResponder *temp = [window nextResponder]; [window setNextResponder:input]; [input setNextResponder:temp]; - - pathLoadedRom = nil; return self; } @@ -248,22 +245,21 @@ NSMenuItem *screenshot_to_file_item = nil; [status_view release]; [status_bar_text release]; [input release]; - [pathLoadedRom release]; - + [super dealloc]; } -- (BOOL)loadROM:(NSString*)filename +- (BOOL) loadRom:(NSURL *)romURL { - //Attemp to load the rom - BOOL result = [super loadROM:filename]; + //Attempt to load the rom + BOOL result = [super loadRom:romURL]; //Set status var and screen depending on whether the rom could be loaded if(result == NO) { [video_output_view setScreenState:[ScreenState blackScreenState]]; //black if the rom doesn't load [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 { //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 - [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[NSURL fileURLWithPath:filename]]; + [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:romURL]; //update the rom info window, if needed [ROMInfo changeDS:self]; - - pathLoadedRom = filename; - [pathLoadedRom retain]; } //reset menu items @@ -345,47 +338,7 @@ NSMenuItem *screenshot_to_file_item = nil; - (void)emulationError { - messageDialog(NSLocalizedString(@"Error", nil), 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; - } + [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"An emulation error occured", nil)]; } - (void)setSpeedLimit:(int)speedLimit @@ -504,33 +457,23 @@ NSMenuItem *screenshot_to_file_item = nil; - (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]; } -- (BOOL)saveState:(NSString*)file -{ - return [super saveState:file]; -} - -- (BOOL)loadState:(NSString*)file -{ - return [super loadState:file]; -} - - (BOOL)saveStateToSlot:(int)slot { BOOL result = NO; int i = slot; - NSString *savePath = GetPathUserAppSupport(@"States"); - if (savePath == nil) + NSString *saveStatePath = [[CocoaDSFile getURLUserAppSupportByKind:@"Save State"] path]; + if (saveStatePath == nil) { // Throw an error message here... return result; } - result = CreateAppDirectory(@"States"); + result = [CocoaDSFile createUserAppSupportDirectory:@"States"]; if (result == NO) { // Should throw an error message here... @@ -543,8 +486,10 @@ NSMenuItem *screenshot_to_file_item = nil; return result; } - NSString *fullFilePath = [[savePath stringByAppendingString:@"/"] stringByAppendingString:fileName]; - result = [self saveState:fullFilePath]; + BOOL wasExecuting = [self executing]; + [super pause]; + + result = [CocoaDSFile saveState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; if(result) { if([saveSlot_item[i] target] == self); @@ -554,6 +499,11 @@ NSMenuItem *screenshot_to_file_item = nil; result = YES; } + + if(wasExecuting == YES) + { + [super execute]; + } return result; } @@ -562,8 +512,8 @@ NSMenuItem *screenshot_to_file_item = nil; { BOOL result = NO; - NSString *savePath = GetPathUserAppSupport(@"States"); - if (savePath == nil) + NSString *saveStatePath = [[CocoaDSFile getURLUserAppSupportByKind:@"Save State"] path]; + if (saveStatePath == nil) { // Should throw an error message here... return result; @@ -575,48 +525,94 @@ NSMenuItem *screenshot_to_file_item = nil; return result; } - NSString *fullFilePath = [[savePath stringByAppendingString:@"/"] stringByAppendingString:fileName]; - result = [self loadState:fullFilePath]; + BOOL wasExecuting = [self executing]; + [super pause]; + + result = [CocoaDSFile loadState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; + + if(wasExecuting == YES) + { + [super execute]; + } return result; } -- (BOOL)saveStateAs +- (BOOL) saveStateAs { - //pause emulation so it doesnt save the state after - BOOL was_executing = [self executing]; - [self pause]; - + BOOL result = NO; + NSInteger buttonClicked; + //file select NSSavePanel *panel = [NSSavePanel savePanel]; [panel setTitle:NSLocalizedString(@"Save State...", nil)]; - [panel setRequiredFileType:@"DST"]; + [panel setRequiredFileType:@FILE_EXT_SAVE_STATE]; //save it - if([panel runModal] == NSFileHandlingPanelOKButton) + buttonClicked = [panel runModal]; + if(buttonClicked == NSFileHandlingPanelOKButton) { - if(was_executing == YES)[self execute]; - return [self saveState:[panel filename]]; + BOOL wasExecuting = [self executing]; + [super pause]; + + result = [CocoaDSFile saveState:[panel URL]]; + if (!result) + { + return result; + } + + if(wasExecuting == YES) + { + [super execute]; + } } - - //unpause emulation if needed - if(was_executing == YES)[self execute]; - - return NO; + + return result; } - (BOOL)loadStateFrom { + BOOL result = NO; + NSInteger buttonClicked; + NSURL *selectedFile = nil; + NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setTitle:NSLocalizedString(@"Load State From...", nil)]; [panel setCanChooseFiles:YES]; [panel setCanChooseDirectories:NO]; [panel setAllowsMultipleSelection:NO]; - - if([panel runModalForTypes:[NSArray arrayWithObject:@"DST"]] == NSFileHandlingPanelOKButton) - return [self loadState:[panel filename]]; - - return NO; + [panel setRequiredFileType:@FILE_EXT_SAVE_STATE]; + + buttonClicked = [panel runModal]; + if(buttonClicked == NSOKButton) + { + 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 @@ -876,7 +872,7 @@ NSMenuItem *screenshot_to_file_item = nil; } else { - messageDialog(NSLocalizedString(@"Error", nil), @"Couldn't create status bar"); + [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create status bar", nil)]; return; } @@ -1289,10 +1285,6 @@ NSMenuItem *screenshot_to_file_item = nil; [execute_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 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; - NSString *searchPath = GetPathUserAppSupport(@"States"); + NSString *searchPath = [[CocoaDSFile getURLUserAppSupportByKind:@"Save State"] path]; NSString *searchFileName = [self getSaveSlotFileName:slot]; if (searchPath == nil || searchFileName == nil) @@ -1489,7 +1481,7 @@ NSMenuItem *screenshot_to_file_item = nil; } NSFileManager *fileManager = [[NSFileManager alloc] init]; - NSString *searchFullPath = [[searchPath stringByAppendingString:@"/"] stringByAppendingString:searchFileName]; + NSString *searchFullPath = [searchPath stringByAppendingPathComponent:searchFileName]; exists = [fileManager isReadableFileAtPath:searchFullPath]; @@ -1502,7 +1494,7 @@ NSMenuItem *screenshot_to_file_item = nil; { NSString *fileExtension = [NSString stringWithFormat:@".ds%d", slotNumber]; - return [[[pathLoadedRom lastPathComponent] stringByDeletingPathExtension] stringByAppendingString:fileExtension]; + return [[[self romFileName] stringByDeletingPathExtension] stringByAppendingString:fileExtension]; } @end diff --git a/desmume/src/cocoa/nds_control.h b/desmume/src/cocoa/nds_control.h index 7ef4d89d4..68399d049 100644 --- a/desmume/src/cocoa/nds_control.h +++ b/desmume/src/cocoa/nds_control.h @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ -#import "globals.h" -#import "cocoa_input.h" +#import -@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 #define OBJ_C @@ -28,7 +29,9 @@ #endif #define MAX_SLOTS 10 -#define MAX_FRAME_SKIP 10 + +@class CocoaDSController; +@class ScreenState; @interface CocoaDSStateBuffer : NSObject { @@ -75,8 +78,7 @@ volatile int speed_limit; volatile int save_type; - NSString *current_file; - NSString *flash_file; + NSURL *loadedRomURL; bool doesConfigNeedUpdate; NSTimeInterval calcTimeBudget; @@ -109,32 +111,26 @@ - (void)setPlayerName:(NSString*)player_name; //ROM control -- (BOOL)loadROM:(NSString*)filename; +- (BOOL) loadRom:(NSURL *)romURL; - (BOOL)ROMLoaded; - (void)closeROM; //ROM Info -- (NSImage*)ROMIcon; -- (NSString*)ROMFile; -- (NSString*)ROMTitle; +- (NSImage *)ROMIcon; +- (NSString *) romFileName; +- (NSString *)ROMTitle; - (NSInteger)ROMMaker; - (NSInteger)ROMSize; - (NSInteger)ROMARM9Size; - (NSInteger)ROMARM7Size; - (NSInteger)ROMDataSize; -//Flash memory -- (NSString*)flashFile; -- (void)setFlashFile:(NSString*)filename; - //execution control - (BOOL)executing; - (void)execute; - (BOOL)paused; - (void)pause; - (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 - (int)speedLimit; - (void)setSaveType:(int)savetype; // see save_types in src/mmu.h @@ -144,10 +140,6 @@ - (void) drawFrame; - (void) padTime:(NSTimeInterval)timePad; -//save states -- (BOOL)saveState:(NSString*)file; -- (BOOL)loadState:(NSString*)file; - - (BOOL) isSubScreenLayerDisplayed:(int)i; - (BOOL) isMainScreenLayerDisplayed:(int)i; - (void) toggleMainScreenLayer:(int)i; diff --git a/desmume/src/cocoa/nds_control.mm b/desmume/src/cocoa/nds_control.mm index a5b8268d6..3eab1625e 100644 --- a/desmume/src/cocoa/nds_control.mm +++ b/desmume/src/cocoa/nds_control.mm @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ #import "nds_control.h" +#import "cocoa_globals.h" +#import "cocoa_file.h" +#import "cocoa_input.h" +#import "cocoa_util.h" #import "preferences.h" #import "screen_state.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) 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 volatile bool execute = true; @@ -61,13 +60,6 @@ GPU3DInterface *core3DList[] = { NULL }; -enum -{ - CORE3DLIST_NULL = 0, - CORE3DLIST_RASTERIZE, - CORE3DLIST_OPENGL -}; - SoundInterface_struct *SNDCoreList[] = { &SNDDummy, #ifdef DESMUME_COCOA @@ -108,8 +100,7 @@ bool opengl_init() speed_limit = 100; //default to max speed = normal speed calcTimeBudget = (NSTimeInterval)(DS_SECONDS_PER_FRAME / ((float)speed_limit / 100.0)); gui_thread = [NSThread currentThread]; - current_file = nil; - flash_file = nil; + loadedRomURL = nil; execution_lock = [[NSLock alloc] init]; sound_lock = [[NSLock alloc] init]; current_screen = nil; @@ -123,20 +114,7 @@ bool opengl_init() struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface; struct armcpu_ctrl_iface *arm9_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 arm9_gdb_port = [defaults integerForKey:PREF_ARM9_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) { - 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; } else if((context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]) == nil) { [pixel_format release]; 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 { [context makeCurrentContext]; @@ -253,8 +231,8 @@ bool opengl_init() if(pixel_buffer == nil) { GLenum error = glGetError(); - messageDialog(NSLocalizedString(@"Error", nil), - [NSString stringWithFormat:@"Error setting up rgba pixel buffer for 3D rendering (glerror: %d)", error]); + NSString *errorStr = [NSString stringWithFormat:@"Error setting up rgba pixel buffer for 3D rendering (glerror: %d)", error]; + [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(errorStr, nil)]; } else { [context setPixelBuffer:pixel_buffer cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:0]; @@ -276,9 +254,9 @@ bool opengl_init() [context makeCurrentContext]; //oglrender_init = &opengl_init; - NDS_3D_SetDriver(CORE3DLIST_RASTERIZE); + NDS_3D_SetDriver(CORE3DLIST_SWRASTERIZE); 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) @@ -294,7 +272,7 @@ bool opengl_init() volume = 100; #ifdef DESMUME_COCOA 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 SPU_SetVolume(volume); #endif @@ -355,8 +333,7 @@ bool opengl_init() [error_object release]; [context release]; [pixel_format release]; - [current_file release]; - [flash_file release]; + [loadedRomURL release]; [sound_lock release]; [execution_lock release]; @@ -395,24 +372,20 @@ bool opengl_init() //NDS_CreateDummyFirmware(&macDS_firmware); } -- (BOOL)loadROM:(NSString*)filename +- (BOOL) loadRom:(NSURL *)romURL { + BOOL result = NO; + //pause if not already paused BOOL was_paused = [self paused]; [self pause]; - //get the flash file - const char *flash; - if (flash_file != nil) - flash = [flash_file UTF8String]; - else - flash = NULL; - //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 - 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 if(was_paused == NO)[self execute]; @@ -427,9 +400,10 @@ bool opengl_init() current_screen = nil; } - //set local vars - current_file = filename; - [current_file retain]; + // Retain a copy of the URL of the currently loaded ROM, since we'll be + // using it later. + loadedRomURL = romURL; + [loadedRomURL retain]; //this is incase emulation stopped from the //emulation core somehow @@ -440,7 +414,7 @@ bool opengl_init() - (BOOL)ROMLoaded { - return (current_file==nil)?NO:YES; + return (loadedRomURL==nil)?NO:YES; } - (void)closeROM @@ -455,8 +429,8 @@ bool opengl_init() NDS_FreeROM(); - [current_file release]; - current_file = nil; + [loadedRomURL release]; + loadedRomURL = nil; } - (NSImage*)ROMIcon @@ -538,9 +512,9 @@ bool opengl_init() return result; } -- (NSString*)ROMFile +- (NSString*)romFileName { - return current_file; + return [[loadedRomURL path] lastPathComponent]; } - (NSString*)ROMTitle @@ -573,18 +547,6 @@ bool opengl_init() 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 { return run; @@ -633,23 +595,6 @@ bool opengl_init() 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 { if(speedLimit < 0 || speedLimit > 1000) @@ -680,44 +625,6 @@ bool opengl_init() 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 { GPU *theGPU = SubScreen.gpu; @@ -1106,7 +1013,7 @@ bool opengl_init() - (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]]; diff --git a/desmume/src/cocoa/preferences.h b/desmume/src/cocoa/preferences.h index 56780c194..2ad99bce5 100644 --- a/desmume/src/cocoa/preferences.h +++ b/desmume/src/cocoa/preferences.h @@ -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 - - 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 - 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. - 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 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 + along with the this software. If not, see . */ #import +#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_AFTER_LAUNCHED @"When Launching, Load" #define PREF_AFTER_LAUNCHED_OPTION_NOTHING @"Load Nothing" #define PREF_AFTER_LAUNCHED_OPTION_LAST_ROM @"Load Last ROM" -#define PREF_FLASH_FILE @"Flash File" - #ifdef GDB_STUB #define PREF_ARM9_GDB_PORT @"arm9gdb" #define PREF_ARM7_GDB_PORT @"arm7gdb" diff --git a/desmume/src/cocoa/preferences.mm b/desmume/src/cocoa/preferences.mm index a4cb3878e..eb9b642b0 100644 --- a/desmume/src/cocoa/preferences.mm +++ b/desmume/src/cocoa/preferences.mm @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ #import "preferences.h" -#import "globals.h" +#import "cocoa_util.h" #import "input.h" /* Preference settings are stored using NSUserDefaults @@ -49,9 +49,6 @@ NSMutableDictionary *defaults; void setAppDefaults() { defaults = [[NSMutableDictionary alloc] initWithObjectsAndKeys: - - //Flash file default - @"", PREF_FLASH_FILE, //Interface defaults @"Yes", PREF_EXECUTE_UPON_LOAD, @@ -376,7 +373,7 @@ NSView *createPreferencesView(NSString *helpinfo, NSDictionary *options, id dele NSString *default_setting = [defaults objectForKey:key_raw]; //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 [[NSUserDefaults standardUserDefaults] setObject:default_setting forKey:key_raw]; diff --git a/desmume/src/cocoa/screen_state.h b/desmume/src/cocoa/screen_state.h index 0544f15fa..21427dd5e 100644 --- a/desmume/src/cocoa/screen_state.h +++ b/desmume/src/cocoa/screen_state.h @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ -#import "globals.h" +#import + +#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_SCREEN_X_RATIO (256.0 / (192.0 * 2.0)) diff --git a/desmume/src/cocoa/screen_state.m b/desmume/src/cocoa/screen_state.m index c23f2c884..4b5ddb691 100644 --- a/desmume/src/cocoa/screen_state.m +++ b/desmume/src/cocoa/screen_state.m @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ #import "screen_state.h" +#import "cocoa_util.h" @implementation ScreenState + (NSInteger)width @@ -85,41 +86,67 @@ return color_data; } -- (NSImage*)image +- (NSImage *)image { - NSImage *result = [[NSImage alloc] initWithSize:[ScreenState size]]; - [result addRepresentation:[self imageRep]]; - return [result autorelease]; -} - -- (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++; + NSImage *newImage = [[NSImage alloc] initWithSize:[ScreenState size]]; + if (newImage == nil) + { + return newImage; } - - 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 \ No newline at end of file + +- (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 diff --git a/desmume/src/cocoa/screenshot.mm b/desmume/src/cocoa/screenshot.mm index 1c11fb1b7..a1f27e32b 100644 --- a/desmume/src/cocoa/screenshot.mm +++ b/desmume/src/cocoa/screenshot.mm @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ #import "screenshot.h" +#import "cocoa_util.h" #import "nds_control.h" #import "screen_state.h" @@ -180,7 +181,7 @@ //tell cocoa save the file NSBitmapImageRep *image = [screen imageRep]; 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 [[image representationUsingType:type properties:[NSDictionary dictionary]] writeToFile:[panel filename] atomically:NO]; diff --git a/desmume/src/cocoa/video_output_view.h b/desmume/src/cocoa/video_output_view.h index d8c52cace..8bfed3239 100644 --- a/desmume/src/cocoa/video_output_view.h +++ b/desmume/src/cocoa/video_output_view.h @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ -#import "nds_control.h" +#import //This class uses OpenGL for drawing for speed //if opengl is not available it uses NSImage diff --git a/desmume/src/cocoa/video_output_view.mm b/desmume/src/cocoa/video_output_view.mm index bf188cd72..ca9960d95 100644 --- a/desmume/src/cocoa/video_output_view.mm +++ b/desmume/src/cocoa/video_output_view.mm @@ -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 - 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. - 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ #import "video_output_view.h" +#import "nds_control.h" +#import "cocoa_util.h" #import "screen_state.h" #define HORIZONTAL(angle) ((angle) == -90 || (angle) == -270) @@ -45,7 +47,7 @@ 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; } @@ -72,7 +74,7 @@ NSOpenGLPixelFormat* pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; 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; [self release]; return nil; @@ -83,7 +85,7 @@ [pixel_format release]; 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]; return nil; } @@ -116,7 +118,7 @@ if(screen == nil) { - messageDialog(NSLocalizedString(@"Error", nil), @"Recieved invalid screen update"); + [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Recieved invalid screen update", nil)]; return; }