diff --git a/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj b/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj index 6d90da37f..42d2e5fad 100644 --- a/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj +++ b/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj @@ -1012,6 +1012,7 @@ ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; + ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; ABBCE29715ACB1FF00A2C965 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */; }; ABBCE29815ACB1FF00A2C965 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */; }; ABBF04A614B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; @@ -1227,6 +1228,7 @@ ABAAFBE8172122B6005DDDBE /* FileMigrationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMigrationDelegate.h; sourceTree = ""; }; ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileMigrationDelegate.mm; sourceTree = ""; }; ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_32x32.png; path = Images/Icon_ActionReplay_32x32.png; sourceTree = ""; }; ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = Images/Icon_CodeBreaker_32x32.png; sourceTree = ""; }; ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = Images/Icon_DeSmuME_32x32.png; sourceTree = ""; }; @@ -1536,6 +1538,7 @@ AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */, AB2A9A741725F00F0062C1A1 /* libz.dylib in Frameworks */, AB2A9A751725F00F0062C1A1 /* AudioToolbox.framework in Frameworks */, + ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1654,6 +1657,7 @@ 29B97324FDCFA39411CA2CEA /* AppKit.framework */, AB213E981710D074006DDB0F /* AudioToolbox.framework */, ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, + ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, diff --git a/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj b/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj index ae2a7058e..76be80567 100644 --- a/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj +++ b/desmume/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj @@ -74,6 +74,7 @@ AB29B33216D4BEBF000EF671 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB29B33016D4BEBF000EF671 /* InputManager.mm */; }; AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; + AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB74EC891738499C0026C41E /* Carbon.framework */; }; AB3A655E16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */; }; AB3A655F16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */; }; AB3A656116CC5438001F5D4A /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; @@ -187,6 +188,7 @@ AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB68A0DD16B139BC00DE0546 /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB6FBEF6139B6258007BB045 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; + AB74EC8A1738499C0026C41E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB74EC891738499C0026C41E /* Carbon.framework */; }; AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB796C9C15CDCB0F00C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB796C9F15CDCB0F00C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; @@ -796,6 +798,7 @@ AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = FileTypeInfo.plist; sourceTree = ""; }; AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender_3_2.cpp; path = ../OGLRender_3_2.cpp; sourceTree = ""; }; AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; + AB74EC891738499C0026C41E /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_FirmwareConfig.icns; sourceTree = ""; }; AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_jit.cpp; path = ../arm_jit.cpp; sourceTree = ""; }; AB796CA115CDCB4600C59155 /* arm_jit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arm_jit.h; path = ../arm_jit.h; sourceTree = ""; }; @@ -1090,6 +1093,7 @@ AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */, ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */, AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */, + AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1101,6 +1105,7 @@ AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */, ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */, AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */, + AB74EC8A1738499C0026C41E /* Carbon.framework in Frameworks */, AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */, AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */, AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */, @@ -1178,6 +1183,7 @@ 29B97324FDCFA39411CA2CEA /* AppKit.framework */, ABACB8DB1710B621003B845D /* AudioToolbox.framework */, ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, + AB74EC891738499C0026C41E /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, diff --git a/desmume/src/cocoa/cocoa_globals.h b/desmume/src/cocoa/cocoa_globals.h index 966843267..a27c4b3f9 100644 --- a/desmume/src/cocoa/cocoa_globals.h +++ b/desmume/src/cocoa/cocoa_globals.h @@ -46,6 +46,8 @@ #define NSSTRING_TITLE_ENABLE_CHEATS NSLocalizedString(@"Enable Cheats", nil) #define NSSTRING_TITLE_DISABLE_HUD NSLocalizedString(@"Disable HUD", nil) #define NSSTRING_TITLE_ENABLE_HUD NSLocalizedString(@"Enable HUD", nil) +#define NSSTRING_TITLE_EXIT_FULL_SCREEN NSLocalizedString(@"Exit Full Screen", nil) +#define NSSTRING_TITLE_ENTER_FULL_SCREEN NSLocalizedString(@"Enter Full Screen", nil) #define NSSTRING_TITLE_HIDE_STATUS_BAR NSLocalizedString(@"Hide Status Bar", nil) #define NSSTRING_TITLE_SHOW_STATUS_BAR NSLocalizedString(@"Show Status Bar", nil) #define NSSTRING_TITLE_HIDE_TOOLBAR NSLocalizedString(@"Hide Toolbar", nil) diff --git a/desmume/src/cocoa/translations/English.lproj/DisplayWindow.xib b/desmume/src/cocoa/translations/English.lproj/DisplayWindow.xib index 7ef3891d9..8ec88e281 100644 --- a/desmume/src/cocoa/translations/English.lproj/DisplayWindow.xib +++ b/desmume/src/cocoa/translations/English.lproj/DisplayWindow.xib @@ -314,7 +314,6 @@ 5156 {{2, 3}, {16, 16}} - 28938 100 @@ -336,7 +335,6 @@ {{160, 1}, {20, 20}} - YES @@ -359,7 +357,6 @@ 294 {{17, 5}, {137, 14}} - YES @@ -399,7 +396,6 @@ 45 {{0, 24}, {256, 384}} - YES DisplayView @@ -409,7 +405,6 @@ 289 {{180, 3}, {56, 15}} - YES -2080112384 @@ -430,7 +425,6 @@ {256, 408} - {{0, 0}, {1920, 1178}} @@ -1177,217 +1171,7 @@ 109 - - - YES - - DisplayView - NSView - - IBProjectSource - ./Classes/DisplayView.h - - - - DisplayWindowController - NSWindowController - - YES - - YES - changeCoreSpeed: - changeDisplayGap: - changeDisplayMode: - changeDisplayOrder: - changeDisplayOrientation: - changeRotation: - changeRotationRelative: - changeScale: - changeVolume: - copy: - openRom: - reset: - saveScreenshotAs: - toggleExecutePause: - toggleKeepMinDisplaySizeAtNormal: - toggleStatusBar: - writeDefaultsDisplayGap: - writeDefaultsDisplayRotation: - writeDefaultsDisplayVideoSettings: - writeDefaultsHUDSettings: - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - changeCoreSpeed: - changeDisplayGap: - changeDisplayMode: - changeDisplayOrder: - changeDisplayOrientation: - changeRotation: - changeRotationRelative: - changeScale: - changeVolume: - copy: - openRom: - reset: - saveScreenshotAs: - toggleExecutePause: - toggleKeepMinDisplaySizeAtNormal: - toggleStatusBar: - writeDefaultsDisplayGap: - writeDefaultsDisplayRotation: - writeDefaultsDisplayVideoSettings: - writeDefaultsHUDSettings: - - - YES - - changeCoreSpeed: - id - - - changeDisplayGap: - id - - - changeDisplayMode: - id - - - changeDisplayOrder: - id - - - changeDisplayOrientation: - id - - - changeRotation: - id - - - changeRotationRelative: - id - - - changeScale: - id - - - changeVolume: - id - - - copy: - id - - - openRom: - id - - - reset: - id - - - saveScreenshotAs: - id - - - toggleExecutePause: - id - - - toggleKeepMinDisplaySizeAtNormal: - id - - - toggleStatusBar: - id - - - writeDefaultsDisplayGap: - id - - - writeDefaultsDisplayRotation: - id - - - writeDefaultsDisplayVideoSettings: - id - - - writeDefaultsHUDSettings: - id - - - - - YES - - YES - saveScreenshotPanelAccessoryView - view - - - YES - NSView - DisplayView - - - - YES - - YES - saveScreenshotPanelAccessoryView - view - - - YES - - saveScreenshotPanelAccessoryView - NSView - - - view - DisplayView - - - - - IBProjectSource - ./Classes/DisplayWindowController.h - - - - + 0 IBCocoaFramework diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.strings b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings index 1a12bc4d6..9d96afd73 100644 Binary files a/desmume/src/cocoa/translations/English.lproj/MainMenu.strings and b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings differ diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.xib b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib index eedc07eaa..6b2dfd2d9 100644 --- a/desmume/src/cocoa/translations/English.lproj/MainMenu.xib +++ b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib @@ -1225,6 +1225,235 @@ + + + Display Video Output + + 2147483647 + + + submenuAction: + + Display Video Output + + YES + + + Show Settings... + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Use Bilinear Filtered Output + + 2147483647 + + + + + + Use Vertical Sync + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + None + + 2147483647 + + + + + + LQ2x + + 2147483647 + + + 1 + + + + LQ2xS + + 2147483647 + + + 2 + + + + HQ2x + + 2147483647 + + + 3 + + + + HQ2xS + + 2147483647 + + + 4 + + + + HQ4x + + 2147483647 + + + 5 + + + + HQ4xS + + 2147483647 + + + 18 + + + + 2xSaI + + 2147483647 + + + 6 + + + + Super 2xSaI + + 2147483647 + + + 7 + + + + Super Eagle + + 2147483647 + + + 8 + + + + Scanline + + 2147483647 + + + 9 + + + + Bilinear + + 2147483647 + + + 10 + + + + Nearest 2x + + 2147483647 + + + 11 + + + + Nearest 1.5x + + 2147483647 + + + 12 + + + + Nearest+ 1.5x + + 2147483647 + + + 13 + + + + EPX + + 2147483647 + + + 14 + + + + EPX+ + + 2147483647 + + + 15 + + + + EPX 1.5x + + 2147483647 + + + 16 + + + + EPX+ 1.5x + + 2147483647 + + + 17 + + + + YES @@ -1235,14 +1464,6 @@ - - - Show Display Video Settings... - - 2147483647 - - - Show 3D Rendering Settings... @@ -1277,6 +1498,15 @@ + + + Enter Full Screen + f + 1310720 + 2147483647 + + + Keep Minimum Display Size at 1x @@ -1571,7 +1801,7 @@ - + 256 YES @@ -2261,7 +2491,6 @@ {550, 450} - {{0, 0}, {1920, 1178}} {10000000000000, 10000000000000} @@ -2490,11 +2719,9 @@ - + 256 {400, 100} - - {{0, 0}, {1920, 1178}} {10000000000000, 10000000000000} @@ -2994,7 +3221,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXANSView - + 268 YES @@ -3481,7 +3708,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA - QSAAAEEgAABBmAAAQZgAAA 0.25 4 @@ -3509,7 +3735,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {640, 495} - InputPrefsView @@ -7562,7 +7787,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {620, 180} - + 256 YES @@ -7581,6 +7806,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {620, 304} + YES NO YES @@ -7589,6 +7815,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {620, 17} + @@ -7596,6 +7823,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{584, 0}, {16, 17}} + YES @@ -7733,6 +7961,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{584, 17}, {15, 102}} + NO _doScroller: @@ -7743,6 +7972,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{1, 325}, {599, 15}} + NO 1 @@ -7773,7 +8003,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - QSAAAEEgAABBmAAAQZgAAA 0.25 4 @@ -7784,6 +8013,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{19, 419}, {72, 14}} + YES 68157504 @@ -7822,6 +8052,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 266 {{20, 396}, {392, 22}} + YES -1804599231 @@ -7840,6 +8071,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 292 {{14, 12}, {236, 32}} + YES 67108864 @@ -7861,6 +8093,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{510, 390}, {96, 32}} + YES 67108864 @@ -7882,6 +8115,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{414, 390}, {96, 32}} + YES 67108864 @@ -7903,6 +8137,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 292 {{250, 12}, {96, 32}} + YES 67108864 @@ -7921,7 +8156,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {620, 442} - + {{0, 0}, {1920, 1178}} {620, 202} @@ -13791,7 +14026,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + 256 YES @@ -14408,7 +14643,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {640, 329} - {{0, 0}, {1920, 1178}} {10000000000000, 10000000000000} @@ -15731,7 +15965,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + 256 YES @@ -15964,7 +16198,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {194, 241} - {{0, 0}, {1920, 1178}} {10000000000000, 10000000000000} @@ -15975,7 +16208,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2 {{1651, 276}, {204, 521}} -461896704 - Display Video Settings + Set Video Output NSPanel @@ -16020,6 +16253,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {129, 378}} + YES NO 19 @@ -16518,10 +16752,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {168, 402}} + {{17, 41}, {170, 418}} + {0, 0} 67108864 @@ -16545,6 +16781,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 485}, {169, 18}} + YES -2080374784 @@ -16568,6 +16805,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 465}, {135, 18}} + YES 67108864 @@ -16589,6 +16827,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {204, 521} + {{0, 0}, {1920, 1178}} {10000000000000, 10000000000000} @@ -19793,7 +20032,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + 256 YES @@ -19802,7 +20041,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{30, 43}, {411, 26}} - YES @@ -19826,7 +20064,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{20, 70}, {38, 17}} - YES @@ -19845,7 +20082,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{412, 70}, {38, 17}} - YES @@ -19864,7 +20100,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{98, 70}, {38, 17}} - YES @@ -19883,7 +20118,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{177, 70}, {38, 17}} - YES @@ -19902,7 +20136,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{255, 70}, {38, 17}} - YES @@ -19921,7 +20154,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{335, 70}, {38, 17}} - YES @@ -19940,7 +20172,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{32, 18}, {133, 19}} - 100 YES @@ -19964,7 +20195,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{203, 21}, {156, 17}} - YES @@ -19983,8 +20213,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{361, 21}, {81, 17}} - - YES 68157504 @@ -20066,7 +20294,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{158, 93}, {154, 18}} - YES @@ -20088,8 +20315,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {467, 128} - - {{0, 0}, {1920, 1178}} @@ -20107,7 +20332,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + 256 YES @@ -20346,7 +20571,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {213, 198} - {{0, 0}, {1920, 1178}} {10000000000000, 10000000000000} @@ -20363,7 +20587,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + 256 YES @@ -20635,7 +20859,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {441, 133} - {{0, 0}, {1920, 1178}} {10000000000000, 10000000000000} @@ -23296,6 +23519,182 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 8241 + + + toggleVerticalSync: + + + + 8274 + + + + toggleBilinearFilteredOutput: + + + + 8275 + + + + changeVideoFilter: + + + + 8276 + + + + changeVideoFilter: + + + + 8277 + + + + changeVideoFilter: + + + + 8278 + + + + changeVideoFilter: + + + + 8279 + + + + changeVideoFilter: + + + + 8280 + + + + changeVideoFilter: + + + + 8281 + + + + changeVideoFilter: + + + + 8282 + + + + changeVideoFilter: + + + + 8283 + + + + changeVideoFilter: + + + + 8284 + + + + changeVideoFilter: + + + + 8285 + + + + changeVideoFilter: + + + + 8286 + + + + changeVideoFilter: + + + + 8287 + + + + changeVideoFilter: + + + + 8288 + + + + changeVideoFilter: + + + + 8289 + + + + changeVideoFilter: + + + + 8290 + + + + changeVideoFilter: + + + + 8291 + + + + changeVideoFilter: + + + + 8292 + + + + changeVideoFilter: + + + + 8293 + + + + changeVideoFilter: + + + + 8294 + + + + toggleFullScreenDisplay: + + + + 8297 + launchWebsite: @@ -23540,9 +23939,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA makeKeyAndOrderFront: - + - 860 + 8250 @@ -32724,10 +33123,11 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + + @@ -33151,11 +33551,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - 854 - - - 855 @@ -44202,6 +44597,172 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + 8245 + + + YES + + + + + + 8246 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8247 + + + + + 8248 + + + + + 8249 + + + + + 8251 + + + + + 8252 + + + + + 8253 + + + + + 8254 + + + + + 8255 + + + + + 8256 + + + + + 8257 + + + + + 8258 + + + + + 8259 + + + + + 8260 + + + + + 8261 + + + + + 8262 + + + + + 8263 + + + + + 8264 + + + + + 8265 + + + + + 8266 + + + + + 8267 + + + + + 8268 + + + + + 8269 + + + + + 8270 + + + + + 8271 + + + + + 8295 + + + @@ -45907,11 +46468,38 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 8195.IBPluginDependency 823.IBPluginDependency 824.IBPluginDependency + 8245.IBPluginDependency + 8246.IBPluginDependency + 8247.IBPluginDependency + 8248.IBPluginDependency + 8249.IBPluginDependency 825.IBPluginDependency + 8251.IBPluginDependency + 8252.IBPluginDependency + 8253.IBPluginDependency + 8254.IBPluginDependency + 8255.IBPluginDependency + 8256.IBPluginDependency + 8257.IBPluginDependency + 8258.IBPluginDependency + 8259.IBPluginDependency 826.IBPluginDependency + 8260.IBPluginDependency + 8261.IBPluginDependency + 8262.IBPluginDependency + 8263.IBPluginDependency + 8264.IBPluginDependency + 8265.IBPluginDependency + 8266.IBPluginDependency + 8267.IBPluginDependency + 8268.IBPluginDependency + 8269.IBPluginDependency 827.IBPluginDependency + 8270.IBPluginDependency + 8271.IBPluginDependency 828.IBPluginDependency 829.IBPluginDependency + 8295.IBPluginDependency 83.IBPluginDependency 830.IBPluginDependency 831.IBPluginDependency @@ -45925,7 +46513,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 845.IBPluginDependency 846.IBPluginDependency 850.IBPluginDependency - 854.IBPluginDependency 855.IBPluginDependency 861.IBPluginDependency 861.IBWindowTemplateEditedContentRect @@ -48668,6 +49255,32 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin {{668, 434}, {580, 588}} com.apple.InterfaceBuilder.CocoaPlugin @@ -48784,1965 +49397,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - 8242 - - - - YES - - AppDelegate - NSObject - - YES - - YES - bugReport: - launchForums: - launchWebsite: - supportRequest: - - - YES - id - id - id - id - - - - YES - - YES - bugReport: - launchForums: - launchWebsite: - supportRequest: - - - YES - - bugReport: - id - - - launchForums: - id - - - launchWebsite: - id - - - supportRequest: - id - - - - - YES - - YES - aboutWindowController - boxARMBinaries - boxFileSystem - boxGeneralInfo - boxMisc - boxTitles - cdsCoreController - cdsSoundController - cheatListWindow - cheatWindowController - emuControlController - inputManager - inputPrefsView - mLoadStateSlot - mSaveStateSlot - migrationDelegate - prefGeneralView - prefWindow - prefWindowController - romInfoPanelController - troubleshootingWindow - - - YES - NSObjectController - NSBox - NSBox - NSBox - NSBox - NSBox - NSObjectController - NSObjectController - NSWindow - NSObjectController - NSObjectController - InputManager - InputPrefsView - NSMenu - NSMenu - FileMigrationDelegate - NSView - NSWindow - NSObjectController - NSObjectController - NSWindow - - - - YES - - YES - aboutWindowController - boxARMBinaries - boxFileSystem - boxGeneralInfo - boxMisc - boxTitles - cdsCoreController - cdsSoundController - cheatListWindow - cheatWindowController - emuControlController - inputManager - inputPrefsView - mLoadStateSlot - mSaveStateSlot - migrationDelegate - prefGeneralView - prefWindow - prefWindowController - romInfoPanelController - troubleshootingWindow - - - YES - - aboutWindowController - NSObjectController - - - boxARMBinaries - NSBox - - - boxFileSystem - NSBox - - - boxGeneralInfo - NSBox - - - boxMisc - NSBox - - - boxTitles - NSBox - - - cdsCoreController - NSObjectController - - - cdsSoundController - NSObjectController - - - cheatListWindow - NSWindow - - - cheatWindowController - NSObjectController - - - emuControlController - NSObjectController - - - inputManager - InputManager - - - inputPrefsView - InputPrefsView - - - mLoadStateSlot - NSMenu - - - mSaveStateSlot - NSMenu - - - migrationDelegate - FileMigrationDelegate - - - prefGeneralView - NSView - - - prefWindow - NSWindow - - - prefWindowController - NSObjectController - - - romInfoPanelController - NSObjectController - - - troubleshootingWindow - NSWindow - - - - - IBProjectSource - ./Classes/AppDelegate.h - - - - CheatWindowDelegate - NSObject - - YES - - YES - addToList: - applyConfiguration: - closeCheatDatabaseSheet: - removeFromList: - resetSearch: - runComparativeSearch: - runExactValueSearch: - selectAllCheatsInDatabase: - selectCheatSearchStyle: - selectCheatType: - selectNoneCheatsInDatabase: - setInternalCheatValue: - viewDatabase: - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - addToList: - applyConfiguration: - closeCheatDatabaseSheet: - removeFromList: - resetSearch: - runComparativeSearch: - runExactValueSearch: - selectAllCheatsInDatabase: - selectCheatSearchStyle: - selectCheatType: - selectNoneCheatsInDatabase: - setInternalCheatValue: - viewDatabase: - - - YES - - addToList: - id - - - applyConfiguration: - id - - - closeCheatDatabaseSheet: - id - - - removeFromList: - id - - - resetSearch: - id - - - runComparativeSearch: - id - - - runExactValueSearch: - id - - - selectAllCheatsInDatabase: - id - - - selectCheatSearchStyle: - id - - - selectCheatType: - id - - - selectNoneCheatsInDatabase: - id - - - setInternalCheatValue: - id - - - viewDatabase: - id - - - - - YES - - YES - cheatConfigBox - cheatDatabaseController - cheatDatabaseSheet - cheatListController - cheatListTable - cheatSearchListController - cheatSearchListTable - cheatSearchView - cheatSelectedItemController - cheatWindowController - searchField - viewConfigureActionReplayCheat - viewConfigureCodeBreakerCheat - viewConfigureInternalCheat - viewConfigureNoSelection - viewSearchComparativeContinue - viewSearchComparativeStart - viewSearchExactValue - viewSearchNoSelection - window - - - YES - NSBox - NSArrayController - NSWindow - NSArrayController - NSTableView - NSArrayController - NSTableView - NSView - NSObjectController - NSObjectController - NSSearchField - NSView - NSView - NSView - NSView - NSView - NSView - NSView - NSView - NSWindow - - - - YES - - YES - cheatConfigBox - cheatDatabaseController - cheatDatabaseSheet - cheatListController - cheatListTable - cheatSearchListController - cheatSearchListTable - cheatSearchView - cheatSelectedItemController - cheatWindowController - searchField - viewConfigureActionReplayCheat - viewConfigureCodeBreakerCheat - viewConfigureInternalCheat - viewConfigureNoSelection - viewSearchComparativeContinue - viewSearchComparativeStart - viewSearchExactValue - viewSearchNoSelection - window - - - YES - - cheatConfigBox - NSBox - - - cheatDatabaseController - NSArrayController - - - cheatDatabaseSheet - NSWindow - - - cheatListController - NSArrayController - - - cheatListTable - NSTableView - - - cheatSearchListController - NSArrayController - - - cheatSearchListTable - NSTableView - - - cheatSearchView - NSView - - - cheatSelectedItemController - NSObjectController - - - cheatWindowController - NSObjectController - - - searchField - NSSearchField - - - viewConfigureActionReplayCheat - NSView - - - viewConfigureCodeBreakerCheat - NSView - - - viewConfigureInternalCheat - NSView - - - viewConfigureNoSelection - NSView - - - viewSearchComparativeContinue - NSView - - - viewSearchComparativeStart - NSView - - - viewSearchExactValue - NSView - - - viewSearchNoSelection - NSView - - - window - NSWindow - - - - - IBProjectSource - ./Classes/CheatWindowDelegate.h - - - - DisplayView - NSView - - IBProjectSource - ./Classes/DisplayView.h - - - - DisplayWindowController - NSWindowController - - YES - - YES - changeCoreSpeed: - changeDisplayGap: - changeDisplayMode: - changeDisplayOrder: - changeDisplayOrientation: - changeRotation: - changeRotationRelative: - changeScale: - changeVolume: - copy: - openRom: - reset: - saveScreenshotAs: - toggleExecutePause: - toggleKeepMinDisplaySizeAtNormal: - toggleStatusBar: - writeDefaultsDisplayGap: - writeDefaultsDisplayRotation: - writeDefaultsDisplayVideoSettings: - writeDefaultsHUDSettings: - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - changeCoreSpeed: - changeDisplayGap: - changeDisplayMode: - changeDisplayOrder: - changeDisplayOrientation: - changeRotation: - changeRotationRelative: - changeScale: - changeVolume: - copy: - openRom: - reset: - saveScreenshotAs: - toggleExecutePause: - toggleKeepMinDisplaySizeAtNormal: - toggleStatusBar: - writeDefaultsDisplayGap: - writeDefaultsDisplayRotation: - writeDefaultsDisplayVideoSettings: - writeDefaultsHUDSettings: - - - YES - - changeCoreSpeed: - id - - - changeDisplayGap: - id - - - changeDisplayMode: - id - - - changeDisplayOrder: - id - - - changeDisplayOrientation: - id - - - changeRotation: - id - - - changeRotationRelative: - id - - - changeScale: - id - - - changeVolume: - id - - - copy: - id - - - openRom: - id - - - reset: - id - - - saveScreenshotAs: - id - - - toggleExecutePause: - id - - - toggleKeepMinDisplaySizeAtNormal: - id - - - toggleStatusBar: - id - - - writeDefaultsDisplayGap: - id - - - writeDefaultsDisplayRotation: - id - - - writeDefaultsDisplayVideoSettings: - id - - - writeDefaultsHUDSettings: - id - - - - - YES - - YES - saveScreenshotPanelAccessoryView - view - - - YES - NSView - DisplayView - - - - YES - - YES - saveScreenshotPanelAccessoryView - view - - - YES - - saveScreenshotPanelAccessoryView - NSView - - - view - DisplayView - - - - - IBProjectSource - ./Classes/DisplayWindowController.h - - - - EmuControllerDelegate - NSObject - - YES - - YES - changeAudioEngine: - changeCoreEmuFlags: - changeCoreSpeed: - changeFirmwareSettings: - changeRomSaveType: - changeSpuAdvancedLogic: - changeSpuInterpolationMode: - changeSpuSyncMethod: - changeSpuSyncMode: - changeVolume: - chooseSlot1R4Directory: - closeRom: - closeSheet: - exportRomSave: - importRomSave: - loadEmuSaveStateSlot: - loadRecentRom: - newDisplayWindow: - openEmuSaveState: - openRom: - reset: - revealGameDataFolderInFinder: - revealRomInFinder: - revertEmuSaveState: - saveEmuSaveState: - saveEmuSaveStateAs: - saveEmuSaveStateSlot: - slot1Eject: - toggleAutoFrameSkip: - toggleCheats: - toggleExecutePause: - toggleGPUState: - toggleSpeedLimiter: - writeDefaults3DRenderingSettings: - writeDefaultsEmulationSettings: - writeDefaultsSlot1Settings: - writeDefaultsSoundSettings: - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - changeAudioEngine: - changeCoreEmuFlags: - changeCoreSpeed: - changeFirmwareSettings: - changeRomSaveType: - changeSpuAdvancedLogic: - changeSpuInterpolationMode: - changeSpuSyncMethod: - changeSpuSyncMode: - changeVolume: - chooseSlot1R4Directory: - closeRom: - closeSheet: - exportRomSave: - importRomSave: - loadEmuSaveStateSlot: - loadRecentRom: - newDisplayWindow: - openEmuSaveState: - openRom: - reset: - revealGameDataFolderInFinder: - revealRomInFinder: - revertEmuSaveState: - saveEmuSaveState: - saveEmuSaveStateAs: - saveEmuSaveStateSlot: - slot1Eject: - toggleAutoFrameSkip: - toggleCheats: - toggleExecutePause: - toggleGPUState: - toggleSpeedLimiter: - writeDefaults3DRenderingSettings: - writeDefaultsEmulationSettings: - writeDefaultsSlot1Settings: - writeDefaultsSoundSettings: - - - YES - - changeAudioEngine: - id - - - changeCoreEmuFlags: - id - - - changeCoreSpeed: - id - - - changeFirmwareSettings: - id - - - changeRomSaveType: - id - - - changeSpuAdvancedLogic: - id - - - changeSpuInterpolationMode: - id - - - changeSpuSyncMethod: - id - - - changeSpuSyncMode: - id - - - changeVolume: - id - - - chooseSlot1R4Directory: - id - - - closeRom: - id - - - closeSheet: - id - - - exportRomSave: - id - - - importRomSave: - id - - - loadEmuSaveStateSlot: - id - - - loadRecentRom: - id - - - newDisplayWindow: - id - - - openEmuSaveState: - id - - - openRom: - id - - - reset: - id - - - revealGameDataFolderInFinder: - id - - - revealRomInFinder: - id - - - revertEmuSaveState: - id - - - saveEmuSaveState: - id - - - saveEmuSaveStateAs: - id - - - saveEmuSaveStateSlot: - id - - - slot1Eject: - id - - - toggleAutoFrameSkip: - id - - - toggleCheats: - id - - - toggleExecutePause: - id - - - toggleGPUState: - id - - - toggleSpeedLimiter: - id - - - writeDefaults3DRenderingSettings: - id - - - writeDefaultsEmulationSettings: - id - - - writeDefaultsSlot1Settings: - id - - - writeDefaultsSoundSettings: - id - - - - - YES - - YES - cdsCoreController - cdsSoundController - cheatDatabaseController - cheatListController - cheatWindowController - cheatWindowDelegate - exportRomSavePanelAccessoryView - firmwarePanelController - inputManager - romInfoPanelController - saveFileMigrationSheet - saveStatePrecloseSheet - slot1ManagerWindow - - - YES - NSObjectController - NSObjectController - NSArrayController - NSArrayController - NSObjectController - CheatWindowDelegate - NSView - NSObjectController - InputManager - NSObjectController - NSWindow - NSWindow - NSWindow - - - - YES - - YES - cdsCoreController - cdsSoundController - cheatDatabaseController - cheatListController - cheatWindowController - cheatWindowDelegate - exportRomSavePanelAccessoryView - firmwarePanelController - inputManager - romInfoPanelController - saveFileMigrationSheet - saveStatePrecloseSheet - slot1ManagerWindow - - - YES - - cdsCoreController - NSObjectController - - - cdsSoundController - NSObjectController - - - cheatDatabaseController - NSArrayController - - - cheatListController - NSArrayController - - - cheatWindowController - NSObjectController - - - cheatWindowDelegate - CheatWindowDelegate - - - exportRomSavePanelAccessoryView - NSView - - - firmwarePanelController - NSObjectController - - - inputManager - InputManager - - - romInfoPanelController - NSObjectController - - - saveFileMigrationSheet - NSWindow - - - saveStatePrecloseSheet - NSWindow - - - slot1ManagerWindow - NSWindow - - - - - IBProjectSource - ./Classes/EmuControllerDelegate.h - - - - FileMigrationDelegate - NSObject - - YES - - YES - handleChoice: - selectAll: - selectNone: - updateAndShowWindow: - - - YES - id - id - id - id - - - - YES - - YES - handleChoice: - selectAll: - selectNone: - updateAndShowWindow: - - - YES - - handleChoice: - id - - - selectAll: - id - - - selectNone: - id - - - updateAndShowWindow: - id - - - - - YES - - YES - dummyObject - fileListController - window - - - YES - NSObject - NSArrayController - NSWindow - - - - YES - - YES - dummyObject - fileListController - window - - - YES - - dummyObject - NSObject - - - fileListController - NSArrayController - - - window - NSWindow - - - - - IBProjectSource - ./Classes/FileMigrationDelegate.h - - - - InputManager - NSObject - - emuControl - EmuControllerDelegate - - - emuControl - - emuControl - EmuControllerDelegate - - - - IBProjectSource - ./Classes/InputManager.h - - - - InputPrefsView - NSView - - YES - - YES - audioFileChoose: - audioFileChooseNone: - changeSpeed: - closeProfileRenameSheet: - closeProfileSheet: - closeSettingsSheet: - profileApply: - profileDelete: - profileNew: - profileRename: - profileSave: - profileSelect: - profileView: - removeInput: - setInputAdd: - showSettingsSheet: - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - audioFileChoose: - audioFileChooseNone: - changeSpeed: - closeProfileRenameSheet: - closeProfileSheet: - closeSettingsSheet: - profileApply: - profileDelete: - profileNew: - profileRename: - profileSave: - profileSelect: - profileView: - removeInput: - setInputAdd: - showSettingsSheet: - - - YES - - audioFileChoose: - id - - - audioFileChooseNone: - id - - - changeSpeed: - id - - - closeProfileRenameSheet: - id - - - closeProfileSheet: - id - - - closeSettingsSheet: - id - - - profileApply: - id - - - profileDelete: - id - - - profileNew: - id - - - profileRename: - id - - - profileSave: - id - - - profileSelect: - id - - - profileView: - id - - - removeInput: - id - - - setInputAdd: - id - - - showSettingsSheet: - id - - - - - YES - - YES - inputManager - inputPrefOutlineView - inputProfileController - inputProfileMenu - inputProfileNextButton - inputProfilePreviousButton - inputProfileRenameSheet - inputProfileSheet - inputSettingsController - inputSettingsGPUState - inputSettingsLoadStateSlot - inputSettingsMicrophone - inputSettingsSaveStateSlot - inputSettingsSetSpeedLimit - inputSettingsTouch - prefWindow - - - YES - InputManager - NSOutlineView - InputProfileController - NSPopUpButton - NSButton - NSButton - NSWindow - NSWindow - NSObjectController - NSWindow - NSWindow - NSWindow - NSWindow - NSWindow - NSWindow - NSWindow - - - - YES - - YES - inputManager - inputPrefOutlineView - inputProfileController - inputProfileMenu - inputProfileNextButton - inputProfilePreviousButton - inputProfileRenameSheet - inputProfileSheet - inputSettingsController - inputSettingsGPUState - inputSettingsLoadStateSlot - inputSettingsMicrophone - inputSettingsSaveStateSlot - inputSettingsSetSpeedLimit - inputSettingsTouch - prefWindow - - - YES - - inputManager - InputManager - - - inputPrefOutlineView - NSOutlineView - - - inputProfileController - InputProfileController - - - inputProfileMenu - NSPopUpButton - - - inputProfileNextButton - NSButton - - - inputProfilePreviousButton - NSButton - - - inputProfileRenameSheet - NSWindow - - - inputProfileSheet - NSWindow - - - inputSettingsController - NSObjectController - - - inputSettingsGPUState - NSWindow - - - inputSettingsLoadStateSlot - NSWindow - - - inputSettingsMicrophone - NSWindow - - - inputSettingsSaveStateSlot - NSWindow - - - inputSettingsSetSpeedLimit - NSWindow - - - inputSettingsTouch - NSWindow - - - prefWindow - NSWindow - - - - - IBProjectSource - ./Classes/InputPrefsView.h - - - - InputProfileController - NSObjectController - - YES - - YES - inputManager - profileOutlineView - - - YES - InputManager - NSOutlineView - - - - YES - - YES - inputManager - profileOutlineView - - - YES - - inputManager - InputManager - - - profileOutlineView - NSOutlineView - - - - - IBProjectSource - ./Classes/InputProfileController.h - - - - PreferencesWindowDelegate - NSObject - - YES - - YES - chooseARM7BiosImage: - chooseARM9BiosImage: - chooseAdvansceneDatabase: - chooseCheatDatabase: - chooseFirmwareImage: - chooseRomForAutoload: - closeFirmwareConfigSheet: - configureInternalFirmware: - selectAutoloadRomOption: - selectDisplayMode: - selectDisplayRotation: - selectDisplaySize: - selectSPUSyncMethod: - selectSPUSyncMode: - selectVideoFilterType: - setUseBilinear: - showDisplayView: - showEmulationView: - showGeneralView: - showInputView: - showSoundView: - updateVolumeIcon: - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - chooseARM7BiosImage: - chooseARM9BiosImage: - chooseAdvansceneDatabase: - chooseCheatDatabase: - chooseFirmwareImage: - chooseRomForAutoload: - closeFirmwareConfigSheet: - configureInternalFirmware: - selectAutoloadRomOption: - selectDisplayMode: - selectDisplayRotation: - selectDisplaySize: - selectSPUSyncMethod: - selectSPUSyncMode: - selectVideoFilterType: - setUseBilinear: - showDisplayView: - showEmulationView: - showGeneralView: - showInputView: - showSoundView: - updateVolumeIcon: - - - YES - - chooseARM7BiosImage: - id - - - chooseARM9BiosImage: - id - - - chooseAdvansceneDatabase: - id - - - chooseCheatDatabase: - id - - - chooseFirmwareImage: - id - - - chooseRomForAutoload: - id - - - closeFirmwareConfigSheet: - id - - - configureInternalFirmware: - id - - - selectAutoloadRomOption: - id - - - selectDisplayMode: - id - - - selectDisplayRotation: - id - - - selectDisplaySize: - id - - - selectSPUSyncMethod: - id - - - selectSPUSyncMode: - id - - - selectVideoFilterType: - id - - - setUseBilinear: - id - - - showDisplayView: - id - - - showEmulationView: - id - - - showGeneralView: - id - - - showInputView: - id - - - showSoundView: - id - - - updateVolumeIcon: - id - - - - - YES - - YES - cdsCoreController - cheatDatabaseController - cheatWindowController - displayRotationField - displayRotationMenu - displayRotationMenuCustomItem - emuController - firmwareConfigSheet - prefWindowController - previewImageView - spuSyncMethodMenu - viewDisplay - viewEmulation - viewGeneral - viewInput - viewSound - window - - - YES - NSObjectController - NSArrayController - NSObjectController - NSTextField - NSPopUpButton - NSMenuItem - NSObjectController - NSWindow - NSObjectController - NSImageView - NSPopUpButton - NSView - NSView - NSView - InputPrefsView - NSView - NSWindow - - - - YES - - YES - cdsCoreController - cheatDatabaseController - cheatWindowController - displayRotationField - displayRotationMenu - displayRotationMenuCustomItem - emuController - firmwareConfigSheet - prefWindowController - previewImageView - spuSyncMethodMenu - viewDisplay - viewEmulation - viewGeneral - viewInput - viewSound - window - - - YES - - cdsCoreController - NSObjectController - - - cheatDatabaseController - NSArrayController - - - cheatWindowController - NSObjectController - - - displayRotationField - NSTextField - - - displayRotationMenu - NSPopUpButton - - - displayRotationMenuCustomItem - NSMenuItem - - - emuController - NSObjectController - - - firmwareConfigSheet - NSWindow - - - prefWindowController - NSObjectController - - - previewImageView - NSImageView - - - spuSyncMethodMenu - NSPopUpButton - - - viewDisplay - NSView - - - viewEmulation - NSView - - - viewGeneral - NSView - - - viewInput - InputPrefsView - - - viewSound - NSView - - - window - NSWindow - - - - - IBProjectSource - ./Classes/PreferencesWindowDelegate.h - - - - TroubleshootingWindowDelegate - NSObject - - YES - - YES - backForm: - continueToFinalForm: - copyInfoToPasteboard: - copyRomInfoToTextFields: - goToWebpage: - - - YES - id - id - id - id - id - - - - YES - - YES - backForm: - continueToFinalForm: - copyInfoToPasteboard: - copyRomInfoToTextFields: - goToWebpage: - - - YES - - backForm: - id - - - continueToFinalForm: - id - - - copyInfoToPasteboard: - id - - - copyRomInfoToTextFields: - id - - - goToWebpage: - id - - - - - YES - - YES - romInfoController - troubleshootingWindowController - viewBugReport - viewFinishedForm - viewSupportRequest - window - - - YES - NSObjectController - NSObjectController - NSView - NSView - NSView - NSWindow - - - - YES - - YES - romInfoController - troubleshootingWindowController - viewBugReport - viewFinishedForm - viewSupportRequest - window - - - YES - - romInfoController - NSObjectController - - - troubleshootingWindowController - NSObjectController - - - viewBugReport - NSView - - - viewFinishedForm - NSView - - - viewSupportRequest - NSView - - - window - NSWindow - - - - - IBProjectSource - ./Classes/TroubleshootingWindowDelegate.h - - - + 8297 + 0 IBCocoaFramework diff --git a/desmume/src/cocoa/userinterface/DisplayWindowController.h b/desmume/src/cocoa/userinterface/DisplayWindowController.h index 3be12eb00..ba2c2960c 100644 --- a/desmume/src/cocoa/userinterface/DisplayWindowController.h +++ b/desmume/src/cocoa/userinterface/DisplayWindowController.h @@ -26,6 +26,11 @@ @class EmuControllerDelegate; +// Subclass NSWindow for full screen windows so that we can override some methods. +@interface DisplayFullScreenWindow : NSWindow +{ } +@end + @interface DisplayView : NSView { InputManager *inputManager; @@ -38,9 +43,11 @@ NSOpenGLContext *context; CGLContextObj cglDisplayContext; - NSInteger lastDisplayMode; - NSInteger currentDisplayOrientation; - GLfloat currentGapScalar; + NSSize _currentNormalSize; + NSInteger _currentDisplayMode; + NSInteger _currentDisplayOrientation; + GLfloat _currentGapScalar; + GLfloat _currentRotation; GLenum glTexPixelFormat; GLvoid *glTexBack; NSSize glTexBackSize; @@ -90,13 +97,19 @@ @end +#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 +@interface DisplayWindowController : NSWindowController +#else @interface DisplayWindowController : NSWindowController +#endif { DisplayView *view; NSView *saveScreenshotPanelAccessoryView; EmuControllerDelegate *emuControl; CocoaDSDisplayVideo *cdsVideoOutput; + NSScreen *assignedScreen; + NSWindow *masterWindow; NSSize _normalSize; double _displayScale; @@ -113,6 +126,7 @@ NSSize _minDisplayViewSize; BOOL _isMinSizeNormal; NSUInteger _statusBarHeight; + BOOL _isWindowResizing; OSSpinLock spinlockNormalSize; OSSpinLock spinlockScale; @@ -131,6 +145,8 @@ @property (retain) EmuControllerDelegate *emuControl; @property (assign) CocoaDSDisplayVideo *cdsVideoOutput; +@property (assign) NSScreen *assignedScreen; +@property (retain) NSWindow *masterWindow; @property (readonly) NSSize normalSize; @property (assign) double displayScale; @@ -151,11 +167,14 @@ - (void) setupUserDefaults; - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees; - (double) maxScalarForContentBoundsWidth:(double)contentBoundsWidth height:(double)contentBoundsHeight; +- (void) enterFullScreen; +- (void) exitFullScreen; - (IBAction) copy:(id)sender; - (IBAction) changeVolume:(id)sender; - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender; - (IBAction) toggleStatusBar:(id)sender; +- (IBAction) toggleFullScreenDisplay:(id)sender; - (IBAction) toggleExecutePause:(id)sender; - (IBAction) reset:(id)sender; @@ -171,6 +190,9 @@ - (IBAction) changeDisplayOrientation:(id)sender; - (IBAction) changeDisplayOrder:(id)sender; - (IBAction) changeDisplayGap:(id)sender; +- (IBAction) toggleBilinearFilteredOutput:(id)sender; +- (IBAction) toggleVerticalSync:(id)sender; +- (IBAction) changeVideoFilter:(id)sender; - (IBAction) writeDefaultsDisplayRotation:(id)sender; - (IBAction) writeDefaultsDisplayGap:(id)sender; diff --git a/desmume/src/cocoa/userinterface/DisplayWindowController.mm b/desmume/src/cocoa/userinterface/DisplayWindowController.mm index 8878ed7e8..f6ba4d7f4 100644 --- a/desmume/src/cocoa/userinterface/DisplayWindowController.mm +++ b/desmume/src/cocoa/userinterface/DisplayWindowController.mm @@ -25,10 +25,17 @@ #import "cocoa_videofilter.h" #import "cocoa_util.h" +#include #include #include #include +#if defined(__ppc__) || defined(__ppc64__) +#include +#else +#include +#endif + // VERTEX SHADER FOR DISPLAY OUTPUT static const char *vertexProgram_100 = {"\ attribute vec2 inPosition; \n\ @@ -80,6 +87,8 @@ enum OGLVertexAttributeID @synthesize emuControl; @synthesize cdsVideoOutput; +@synthesize assignedScreen; +@synthesize masterWindow; @synthesize view; @synthesize saveScreenshotPanelAccessoryView; @@ -97,6 +106,11 @@ enum OGLVertexAttributeID @dynamic isMinSizeNormal; @dynamic isShowingStatusBar; +#if defined(__ppc__) || defined(__ppc64__) +static std::map _screenMap; // Key = NSScreen object pointer, Value = DisplayWindowController object pointer +#else +static std::tr1::unordered_map _screenMap; // Key = NSScreen object pointer, Value = DisplayWindowController object pointer +#endif - (id)initWithWindowNibName:(NSString *)windowNibName emuControlDelegate:(EmuControllerDelegate *)theEmuController { @@ -108,6 +122,8 @@ enum OGLVertexAttributeID emuControl = [theEmuController retain]; cdsVideoOutput = nil; + assignedScreen = nil; + masterWindow = nil; spinlockNormalSize = OS_SPINLOCK_INIT; spinlockScale = OS_SPINLOCK_INIT; @@ -130,14 +146,18 @@ enum OGLVertexAttributeID _minDisplayViewSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*_displayGap)); _isMinSizeNormal = YES; _statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; - - [[self window] setTitle:(NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]]; + _isWindowResizing = NO; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveScreenshotAsFinish:) name:@"org.desmume.DeSmuME.requestScreenshotDidFinish" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(respondToScreenChange:) + name:@"NSApplicationDidChangeScreenParametersNotification" + object:NSApp]; + return self; } @@ -145,6 +165,8 @@ enum OGLVertexAttributeID { [[NSNotificationCenter defaultCenter] removeObserver:self]; [self setEmuControl:nil]; + [self setAssignedScreen:nil]; + [self setMasterWindow:nil]; [super dealloc]; } @@ -162,23 +184,21 @@ enum OGLVertexAttributeID - (void) setDisplayScale:(double)s { - // Resize the window when displayScale changes. - // No need to set the view's scale here since window resizing will implicitly change it. - const double constrainedScale = [self resizeWithTransform:[self normalSize] scalar:s rotation:[self displayRotation]]; - - OSSpinLockLock(&spinlockScale); - _displayScale = constrainedScale; - OSSpinLockUnlock(&spinlockScale); - - DisplayOutputTransformData transformData = { constrainedScale, - [self displayRotation], - 0.0, - 0.0, - 0.0 }; - - [CocoaDSUtil messageSendOneWayWithData:[[self cdsVideoOutput] receivePort] - msgID:MESSAGE_TRANSFORM_VIEW - data:[NSData dataWithBytes:&transformData length:sizeof(DisplayOutputTransformData)]]; + if (_isWindowResizing) + { + // Resize the window when displayScale changes. + // No need to set the view's scale here since window resizing will implicitly change it. + OSSpinLockLock(&spinlockScale); + _displayScale = s; + OSSpinLockUnlock(&spinlockScale); + } + else + { + const double constrainedScale = [self resizeWithTransform:[self normalSize] scalar:s rotation:[self displayRotation]]; + OSSpinLockLock(&spinlockScale); + _displayScale = constrainedScale; + OSSpinLockUnlock(&spinlockScale); + } } - (double) displayScale @@ -324,7 +344,6 @@ enum OGLVertexAttributeID } OSSpinLockLock(&spinlockDisplayMode); - const NSInteger oldMode = _displayMode; _displayMode = displayModeID; OSSpinLockUnlock(&spinlockDisplayMode); @@ -336,14 +355,6 @@ enum OGLVertexAttributeID [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_TYPE integerValue:displayModeID]; - - // If the display mode swaps between Main Only and Touch Only, the view will not resize to implicitly - // redraw the view. So when swapping between these two display modes, explicitly tell the view to redraw. - if ( (oldMode == DS_DISPLAY_TYPE_MAIN && displayModeID == DS_DISPLAY_TYPE_TOUCH) || - (oldMode == DS_DISPLAY_TYPE_TOUCH && displayModeID == DS_DISPLAY_TYPE_MAIN) ) - { - [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REDRAW_VIEW]; - } } - (NSInteger) displayMode @@ -516,17 +527,17 @@ enum OGLVertexAttributeID - (void) setIsShowingStatusBar:(BOOL)showStatusBar { - NSRect frameRect = [[self window] frame]; + NSRect frameRect = [masterWindow frame]; if (showStatusBar) { _statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; frameRect.size.height += WINDOW_STATUS_BAR_HEIGHT; - NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; + NSRect screenFrame = [[masterWindow screen] visibleFrame]; if (frameRect.size.height > screenFrame.size.height) { - NSRect windowContentRect = [[[self window] contentView] bounds]; + NSRect windowContentRect = [[masterWindow contentView] bounds]; double widthToHeightRatio = windowContentRect.size.width / windowContentRect.size.height; windowContentRect.size.height -= frameRect.size.height - screenFrame.size.height; windowContentRect.size.width = windowContentRect.size.height * widthToHeightRatio; @@ -547,7 +558,7 @@ enum OGLVertexAttributeID } [[NSUserDefaults standardUserDefaults] setBool:showStatusBar forKey:@"DisplayView_ShowStatusBar"]; - [[self window] setFrame:frameRect display:YES animate:NO]; + [masterWindow setFrame:frameRect display:YES animate:NO]; } - (BOOL) isShowingStatusBar @@ -576,8 +587,11 @@ enum OGLVertexAttributeID - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees { - NSWindow *theWindow = [self window]; - + if ([self assignedScreen] != nil) + { + return scalar; + } + // Convert angle to clockwise-direction degrees. angleDegrees = CLOCKWISE_DEGREES(angleDegrees); @@ -593,14 +607,14 @@ enum OGLVertexAttributeID const CGSize transformedBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, scalar, angleDegrees); // Get the center of the content view in screen coordinates. - const NSRect windowContentRect = [[theWindow contentView] bounds]; + const NSRect windowContentRect = [[masterWindow contentView] bounds]; const double translationX = (windowContentRect.size.width - transformedBounds.width) / 2.0; const double translationY = ((windowContentRect.size.height - _statusBarHeight) - transformedBounds.height) / 2.0; // Resize the window. - const NSRect windowFrame = [theWindow frame]; - const NSRect newFrame = [theWindow frameRectForContentRect:NSMakeRect(windowFrame.origin.x + translationX, windowFrame.origin.y + translationY, transformedBounds.width, transformedBounds.height + _statusBarHeight)]; - [theWindow setFrame:newFrame display:YES animate:NO]; + const NSRect windowFrame = [masterWindow frame]; + const NSRect newFrame = [masterWindow frameRectForContentRect:NSMakeRect(windowFrame.origin.x + translationX, windowFrame.origin.y + translationY, transformedBounds.width, transformedBounds.height + _statusBarHeight)]; + [masterWindow setFrame:newFrame display:YES animate:NO]; // Return the actual scale used for the view (may be constrained). return scalar; @@ -632,6 +646,108 @@ enum OGLVertexAttributeID [emuControl restoreCoreState]; } +- (void) enterFullScreen +{ + NSScreen *targetScreen = [masterWindow screen]; + + // If there is a window that is already assigned to the target screen, then force the + // current window to exit full screen first. + if (_screenMap.find(targetScreen) != _screenMap.end()) + { + DisplayWindowController *currentFullScreenWindow = _screenMap[targetScreen]; + [currentFullScreenWindow exitFullScreen]; + } + + [[self window] orderOut:nil]; + + // Since we'll be using the screen rect to position the window, we need to set the origin + // to (0,0) since creating the new full screen window requires the screen rect to be in + // screen coordinates. + NSRect screenRect = [targetScreen frame]; + screenRect.origin.x = 0.0; + screenRect.origin.y = 0.0; + + DisplayFullScreenWindow *newFullScreenWindow = [[[DisplayFullScreenWindow alloc] initWithContentRect:screenRect + styleMask:NSBorderlessWindowMask + backing:NSBackingStoreBuffered + defer:NO + screen:targetScreen] autorelease]; + [newFullScreenWindow setHasShadow:NO]; + [newFullScreenWindow setInitialFirstResponder:view]; + [view setFrame:screenRect]; + [[newFullScreenWindow contentView] addSubview:view]; + [newFullScreenWindow setDelegate:self]; + + // If the target screen is the main screen (index 0), then autohide the menu bar and dock. + if (targetScreen == [[NSScreen screens] objectAtIndex:0]) + { + SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar); + } + + // Show the full screen window. + [self setWindow:newFullScreenWindow]; + [newFullScreenWindow makeKeyAndOrderFront:self]; + [newFullScreenWindow display]; + + [self setAssignedScreen:targetScreen]; + _screenMap[targetScreen] = self; +} + +- (void) exitFullScreen +{ + _screenMap.erase([self assignedScreen]); + [self setAssignedScreen:nil]; + [[self window] orderOut:nil]; + + // If the window is using the main screen (index 0), then restore the menu bar and dock. + if ([masterWindow screen] == [[NSScreen screens] objectAtIndex:0]) + { + SetSystemUIMode(kUIModeNormal, 0); + } + + [self setWindow:masterWindow]; + [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; + + NSRect viewFrame = [[masterWindow contentView] frame]; + viewFrame.size.height -= _statusBarHeight; + viewFrame.origin.y = _statusBarHeight; + [view setFrame:viewFrame]; + [[masterWindow contentView] addSubview:view]; + [masterWindow makeKeyAndOrderFront:self]; + [masterWindow display]; +} + +- (void) respondToScreenChange:(NSNotification *)aNotification +{ + // This method only applies for displays in full screen mode. For displays in + // windowed mode, we don't need to do anything. + if ([self assignedScreen] == nil) + { + return; + } + + NSArray *screenList = [NSScreen screens]; + + // If the assigned screen was disconnected, exit full screen mode. Hopefully, the + // window will automatically move onto an available screen. + if (![screenList containsObject:[self assignedScreen]]) + { + [self exitFullScreen]; + } + else + { + // There are many other reasons that a screen change would occur, but the only + // other one we care about is a resolution change. Let's just assume that a + // resolution change occurred and resize the full screen window. + NSRect screenRect = [assignedScreen frame]; + [[self window] setFrame:screenRect display:NO]; + + screenRect.origin.x = 0.0; + screenRect.origin.y = 0.0; + [view setFrame:screenRect]; + } +} + #pragma mark IBActions - (IBAction) copy:(id)sender @@ -645,9 +761,7 @@ enum OGLVertexAttributeID } - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender -{ - NSWindow *theWindow = [self window]; - +{ if ([self isMinSizeNormal]) { [self setIsMinSizeNormal:NO]; @@ -661,20 +775,20 @@ enum OGLVertexAttributeID transformedMinSize.height += _statusBarHeight; // Resize the window if it's smaller than the minimum content size. - NSRect windowContentRect = [theWindow contentRectForFrameRect:[theWindow frame]]; + NSRect windowContentRect = [masterWindow contentRectForFrameRect:[masterWindow frame]]; if (windowContentRect.size.width < transformedMinSize.width || windowContentRect.size.height < transformedMinSize.height) { // Prepare to resize. - NSRect oldFrameRect = [theWindow frame]; + NSRect oldFrameRect = [masterWindow frame]; windowContentRect.size = NSMakeSize(transformedMinSize.width, transformedMinSize.height); - NSRect newFrameRect = [theWindow frameRectForContentRect:windowContentRect]; + NSRect newFrameRect = [masterWindow frameRectForContentRect:windowContentRect]; // Keep the window centered when expanding the size. newFrameRect.origin.x = oldFrameRect.origin.x - ((newFrameRect.size.width - oldFrameRect.size.width) / 2); newFrameRect.origin.y = oldFrameRect.origin.y - ((newFrameRect.size.height - oldFrameRect.size.height) / 2); // Set the window size. - [theWindow setFrame:newFrameRect display:YES animate:NO]; + [masterWindow setFrame:newFrameRect display:YES animate:NO]; } } } @@ -684,6 +798,18 @@ enum OGLVertexAttributeID [self setIsShowingStatusBar:([self isShowingStatusBar]) ? NO : YES]; } +- (IBAction) toggleFullScreenDisplay:(id)sender +{ + if ([self assignedScreen] == nil) + { + [self enterFullScreen]; + } + else + { + [self exitFullScreen]; + } +} + - (IBAction) toggleExecutePause:(id)sender { [emuControl toggleExecutePause:sender]; @@ -782,6 +908,21 @@ enum OGLVertexAttributeID [self setDisplayGap:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; } +- (IBAction) toggleBilinearFilteredOutput:(id)sender +{ + [self setUseBilinearOutput:([self useBilinearOutput]) ? NO : YES]; +} + +- (IBAction) toggleVerticalSync:(id)sender +{ + [self setUseVerticalSync:([self useVerticalSync]) ? NO : YES]; +} + +- (IBAction) changeVideoFilter:(id)sender +{ + [self setVideoFilterType:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + - (IBAction) writeDefaultsDisplayRotation:(id)sender { [[NSUserDefaults standardUserDefaults] setDouble:[self displayRotation] forKey:@"DisplayView_Rotation"]; @@ -817,7 +958,7 @@ enum OGLVertexAttributeID if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setState:(viewScale == [theItem tag]) ? NSOnState : NSOffState]; + [(NSMenuItem *)theItem setState:(viewScale == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeRotation:)) @@ -833,16 +974,16 @@ enum OGLVertexAttributeID viewRotation == 180 || viewRotation == 270) { - [(NSMenuItem*)theItem setState:NSOffState]; + [(NSMenuItem *)theItem setState:NSOffState]; } else { - [(NSMenuItem*)theItem setState:NSOnState]; + [(NSMenuItem *)theItem setState:NSOnState]; } } else { - [(NSMenuItem*)theItem setState:(viewRotation == [theItem tag]) ? NSOnState : NSOffState]; + [(NSMenuItem *)theItem setState:(viewRotation == [theItem tag]) ? NSOnState : NSOffState]; } } } @@ -850,21 +991,21 @@ enum OGLVertexAttributeID { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setState:([self displayMode] == [theItem tag]) ? NSOnState : NSOffState]; + [(NSMenuItem *)theItem setState:([self displayMode] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayOrientation:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setState:([self displayOrientation] == [theItem tag]) ? NSOnState : NSOffState]; + [(NSMenuItem *)theItem setState:([self displayOrientation] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayOrder:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setState:([self displayOrder] == [theItem tag]) ? NSOnState : NSOffState]; + [(NSMenuItem *)theItem setState:([self displayOrder] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayGap:)) @@ -883,46 +1024,84 @@ enum OGLVertexAttributeID gapScalar == 150 || gapScalar == 200) { - [(NSMenuItem*)theItem setState:NSOffState]; + [(NSMenuItem *)theItem setState:NSOffState]; } else { - [(NSMenuItem*)theItem setState:NSOnState]; + [(NSMenuItem *)theItem setState:NSOnState]; } } else { - [(NSMenuItem*)theItem setState:(gapScalar == [theItem tag]) ? NSOnState : NSOffState]; + [(NSMenuItem *)theItem setState:(gapScalar == [theItem tag]) ? NSOnState : NSOffState]; } } } } + else if (theAction == @selector(toggleBilinearFilteredOutput:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + [(NSMenuItem *)theItem setState:([self useBilinearOutput]) ? NSOnState : NSOffState]; + } + } + else if (theAction == @selector(toggleVerticalSync:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + [(NSMenuItem *)theItem setState:([self useVerticalSync]) ? NSOnState : NSOffState]; + } + } + else if (theAction == @selector(changeVideoFilter:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + [(NSMenuItem *)theItem setState:([self videoFilterType] == [theItem tag]) ? NSOnState : NSOffState]; + } + } else if (theAction == @selector(hudDisable:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setTitle:([[self view] isHudEnabled]) ? NSSTRING_TITLE_DISABLE_HUD : NSSTRING_TITLE_ENABLE_HUD]; + [(NSMenuItem *)theItem setTitle:([[self view] isHudEnabled]) ? NSSTRING_TITLE_DISABLE_HUD : NSSTRING_TITLE_ENABLE_HUD]; } } else if (theAction == @selector(toggleStatusBar:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setTitle:([self isShowingStatusBar]) ? NSSTRING_TITLE_HIDE_STATUS_BAR : NSSTRING_TITLE_SHOW_STATUS_BAR]; + [(NSMenuItem *)theItem setTitle:([self isShowingStatusBar]) ? NSSTRING_TITLE_HIDE_STATUS_BAR : NSSTRING_TITLE_SHOW_STATUS_BAR]; + } + + if ([self assignedScreen] != nil) + { + enable = NO; + } + } + else if (theAction == @selector(toggleFullScreenDisplay:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + [(NSMenuItem *)theItem setTitle:([self assignedScreen] != nil) ? NSSTRING_TITLE_EXIT_FULL_SCREEN : NSSTRING_TITLE_ENTER_FULL_SCREEN]; } } else if (theAction == @selector(toggleKeepMinDisplaySizeAtNormal:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setState:([self isMinSizeNormal]) ? NSOnState : NSOffState]; + [(NSMenuItem *)theItem setState:([self isMinSizeNormal]) ? NSOnState : NSOffState]; + } + + if ([self assignedScreen] != nil) + { + enable = NO; } } else if (theAction == @selector(toggleToolbarShown:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - [(NSMenuItem*)theItem setTitle:([[[self window] toolbar] isVisible]) ? NSSTRING_TITLE_HIDE_TOOLBAR : NSSTRING_TITLE_SHOW_TOOLBAR]; + [(NSMenuItem *)theItem setTitle:([[[self window] toolbar] isVisible]) ? NSSTRING_TITLE_HIDE_TOOLBAR : NSSTRING_TITLE_SHOW_TOOLBAR]; } } @@ -933,6 +1112,14 @@ enum OGLVertexAttributeID - (void)windowDidLoad { + // Set up the master window that is associated with this window controller. + [self setMasterWindow:[self window]]; + [masterWindow setTitle:(NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]]; + [masterWindow setInitialFirstResponder:view]; + [view setInputManager:[emuControl inputManager]]; + [[emuControl windowList] addObject:self]; + [emuControl updateAllWindowTitles]; + // Set up the video output thread. cdsVideoOutput = [[CocoaDSDisplayVideo alloc] init]; [cdsVideoOutput setDelegate:view]; @@ -965,6 +1152,13 @@ enum OGLVertexAttributeID - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize { + if ([self assignedScreen] != nil) + { + return frameSize; + } + + _isWindowResizing = YES; + // Get a content Rect so that we can make our comparison. // This will be based on the proposed frameSize. const NSRect frameRect = NSMakeRect(0.0f, 0.0f, frameSize.width, frameSize.height); @@ -987,6 +1181,13 @@ enum OGLVertexAttributeID - (void)windowDidResize:(NSNotification *)notification { + if ([self assignedScreen] != nil) + { + return; + } + + _isWindowResizing = YES; + // Get the max scalar within the window's current content bounds. const NSSize normalBounds = [self normalSize]; const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, [self displayRotation]); @@ -1002,6 +1203,8 @@ enum OGLVertexAttributeID newContentFrame.origin.y = _statusBarHeight; newContentFrame.size.height -= _statusBarHeight; [view setFrame:newContentFrame]; + + _isWindowResizing = NO; } - (BOOL)windowShouldClose:(id)sender @@ -1132,13 +1335,14 @@ enum OGLVertexAttributeID [self startupOpenGL]; CGLSetCurrentContext(prevContext); - lastDisplayMode = DS_DISPLAY_TYPE_COMBO; - currentDisplayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL; - currentGapScalar = 0.0f; + _currentDisplayMode = DS_DISPLAY_TYPE_COMBO; + _currentDisplayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL; + _currentGapScalar = 0.0f; + _currentNormalSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*_currentGapScalar)); glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV; - UInt32 w = GetNearestPositivePOT((UInt32)GPU_DISPLAY_WIDTH); - UInt32 h = GetNearestPositivePOT((UInt32)(GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*currentGapScalar))); + const UInt32 w = GetNearestPositivePOT((UInt32)_currentNormalSize.width); + const UInt32 h = GetNearestPositivePOT((UInt32)_currentNormalSize.height); glTexBack = (GLvoid *)calloc(w * h, sizeof(UInt16)); glTexBackSize = NSMakeSize(w, h); vtxBufferOffset = 0; @@ -1169,7 +1373,7 @@ enum OGLVertexAttributeID - (void) startupOpenGL { - [self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:currentDisplayOrientation gap:currentGapScalar]; + [self updateDisplayVerticesUsingDisplayMode:_currentDisplayMode orientation:_currentDisplayOrientation gap:_currentGapScalar]; [self updateTexCoordS:1.0f T:2.0f]; // Set up initial vertex elements @@ -1213,7 +1417,7 @@ enum OGLVertexAttributeID glUniform1f(uniformAngleDegrees, 0.0f); glUniform1f(uniformScalar, 1.0f); - glUniform2f(uniformViewSize, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*currentGapScalar)); + glUniform2f(uniformViewSize, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*_currentGapScalar)); } else { @@ -1424,10 +1628,10 @@ enum OGLVertexAttributeID glBindVertexArrayAPPLE(vaoMainStatesID); // Perform the render - if (lastDisplayMode != displayModeID) + if (_currentDisplayMode != displayModeID) { - lastDisplayMode = displayModeID; - [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation gap:currentGapScalar]; + _currentDisplayMode = displayModeID; + [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:_currentDisplayOrientation gap:_currentGapScalar]; [self uploadVertices]; } @@ -1528,11 +1732,14 @@ enum OGLVertexAttributeID } const NSSize normalBounds = [windowController normalSize]; - const NSSize transformBounds = [self bounds].size; + const NSSize viewSize = [self bounds].size; + const CGSize transformBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, _currentRotation); + const double s = GetMaxScalarInBounds(transformBounds.width, transformBounds.height, viewSize.width, viewSize.height); + CGPoint touchLoc = GetNormalPointFromTransformedPoint(clickLoc.x, clickLoc.y, normalBounds.width, normalBounds.height, - transformBounds.width, transformBounds.height, - [windowController displayScale], + viewSize.width, viewSize.height, + s, viewAngle); // Normalize the touch location to the DS. @@ -1865,6 +2072,10 @@ enum OGLVertexAttributeID - (void)doResizeView:(NSRect)rect { + const NSSize viewSize = [self frame].size; + const CGSize checkSize = GetTransformedBounds(_currentNormalSize.width, _currentNormalSize.height, 1.0, _currentRotation); + const double s = GetMaxScalarInBounds(checkSize.width, checkSize.height, viewSize.width, viewSize.height); + CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); @@ -1873,38 +2084,50 @@ enum OGLVertexAttributeID if (isShaderSupported) { glUniform2f(uniformViewSize, rect.size.width, rect.size.height); + glUniform1f(uniformScalar, s); } else { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-rect.size.width/2, -rect.size.width/2 + rect.size.width, -rect.size.height/2, -rect.size.height/2 + rect.size.height, -1.0, 1.0); + glRotatef(CLOCKWISE_DEGREES(_currentRotation), 0.0f, 0.0f, 1.0f); + glScalef(s, s, 1.0f); } + [self renderDisplayUsingDisplayMode:_currentDisplayMode]; + [self drawVideoFrame]; + CGLUnlockContext(cglDisplayContext); } - (void)doTransformView:(const DisplayOutputTransformData *)transformData { - const GLfloat angleDegrees = (GLfloat)transformData->rotation; - const GLfloat s = (GLfloat)transformData->scale; + _currentRotation = (GLfloat)transformData->rotation; + + const NSSize viewSize = [self bounds].size; + const CGSize checkSize = GetTransformedBounds(_currentNormalSize.width, _currentNormalSize.height, 1.0, _currentRotation); + const double s = GetMaxScalarInBounds(checkSize.width, checkSize.height, viewSize.width, viewSize.height); CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); if (isShaderSupported) { - glUniform1f(uniformAngleDegrees, angleDegrees); + glUniform1f(uniformAngleDegrees, _currentRotation); glUniform1f(uniformScalar, s); } else { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glRotatef(CLOCKWISE_DEGREES(angleDegrees), 0.0f, 0.0f, 1.0f); + glRotatef(CLOCKWISE_DEGREES(_currentRotation), 0.0f, 0.0f, 1.0f); glScalef(s, s, 1.0f); } + [self renderDisplayUsingDisplayMode:_currentDisplayMode]; + [self drawVideoFrame]; + CGLUnlockContext(cglDisplayContext); } @@ -1913,7 +2136,7 @@ enum OGLVertexAttributeID CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); - [self renderDisplayUsingDisplayMode:lastDisplayMode]; + [self renderDisplayUsingDisplayMode:_currentDisplayMode]; [self drawVideoFrame]; CGLUnlockContext(cglDisplayContext); @@ -1921,20 +2144,41 @@ enum OGLVertexAttributeID - (void)doDisplayModeChanged:(NSInteger)displayModeID { - lastDisplayMode = displayModeID; - [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation gap:currentGapScalar]; + DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; + _currentNormalSize = [windowController normalSize]; + + const NSSize viewSize = [self bounds].size; + const CGSize checkSize = GetTransformedBounds(_currentNormalSize.width, _currentNormalSize.height, 1.0, _currentRotation); + const double s = GetMaxScalarInBounds(checkSize.width, checkSize.height, viewSize.width, viewSize.height); + + _currentDisplayMode = displayModeID; + [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:_currentDisplayOrientation gap:_currentGapScalar]; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); + if (isShaderSupported) + { + glUniform1f(uniformScalar, s); + } + else + { + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glRotatef(CLOCKWISE_DEGREES(_currentRotation), 0.0f, 0.0f, 1.0f); + glScalef(s, s, 1.0f); + } + [self uploadVertices]; + [self renderDisplayUsingDisplayMode:_currentDisplayMode]; + [self drawVideoFrame]; CGLUnlockContext(cglDisplayContext); } - (void)doBilinearOutputChanged:(BOOL)useBilinear { - const GLint textureFilter = useBilinear ? GL_LINEAR : GL_NEAREST; + const GLint textureFilter = (useBilinear) ? GL_LINEAR : GL_NEAREST; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); @@ -1947,20 +2191,45 @@ enum OGLVertexAttributeID CGLUnlockContext(cglDisplayContext); } -- (void) doDisplayOrientationChanged:(NSInteger)displayOrientationID +- (void)doDisplayOrientationChanged:(NSInteger)displayOrientationID { - currentDisplayOrientation = displayOrientationID; - [self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:displayOrientationID gap:currentGapScalar]; + DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; + _currentNormalSize = [windowController normalSize]; + + _currentDisplayOrientation = displayOrientationID; + [self updateDisplayVerticesUsingDisplayMode:_currentDisplayMode orientation:displayOrientationID gap:_currentGapScalar]; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self uploadVertices]; + if (_currentDisplayMode == DS_DISPLAY_TYPE_COMBO) + { + const NSSize viewSize = [self bounds].size; + const CGSize checkSize = GetTransformedBounds(_currentNormalSize.width, _currentNormalSize.height, 1.0, _currentRotation); + const double s = GetMaxScalarInBounds(checkSize.width, checkSize.height, viewSize.width, viewSize.height); + + if (isShaderSupported) + { + glUniform1f(uniformScalar, s); + } + else + { + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glRotatef(CLOCKWISE_DEGREES(_currentRotation), 0.0f, 0.0f, 1.0f); + glScalef(s, s, 1.0f); + } + + [self renderDisplayUsingDisplayMode:_currentDisplayMode]; + [self drawVideoFrame]; + } + CGLUnlockContext(cglDisplayContext); } -- (void) doDisplayOrderChanged:(NSInteger)displayOrderID +- (void)doDisplayOrderChanged:(NSInteger)displayOrderID { if (displayOrderID == DS_DISPLAY_ORDER_MAIN_FIRST) { @@ -1976,25 +2245,50 @@ enum OGLVertexAttributeID [self uploadVertices]; - if (lastDisplayMode == DS_DISPLAY_TYPE_COMBO) + if (_currentDisplayMode == DS_DISPLAY_TYPE_COMBO) { - [self renderDisplayUsingDisplayMode:lastDisplayMode]; + [self renderDisplayUsingDisplayMode:_currentDisplayMode]; [self drawVideoFrame]; } CGLUnlockContext(cglDisplayContext); } -- (void) doDisplayGapChanged:(float)displayGapScalar +- (void)doDisplayGapChanged:(float)displayGapScalar { - currentGapScalar = (GLfloat)displayGapScalar; - [self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:currentDisplayOrientation gap:(GLfloat)displayGapScalar]; + DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; + _currentNormalSize = [windowController normalSize]; + + _currentGapScalar = (GLfloat)displayGapScalar; + [self updateDisplayVerticesUsingDisplayMode:_currentDisplayMode orientation:_currentDisplayOrientation gap:(GLfloat)displayGapScalar]; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self uploadVertices]; + if (_currentDisplayMode == DS_DISPLAY_TYPE_COMBO) + { + const NSSize viewSize = [self bounds].size; + const CGSize checkSize = GetTransformedBounds(_currentNormalSize.width, _currentNormalSize.height, 1.0, _currentRotation); + const double s = GetMaxScalarInBounds(checkSize.width, checkSize.height, viewSize.width, viewSize.height); + + if (isShaderSupported) + { + glUniform1f(uniformScalar, s); + } + else + { + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glRotatef(CLOCKWISE_DEGREES(_currentRotation), 0.0f, 0.0f, 1.0f); + glScalef(s, s, 1.0f); + } + + [self renderDisplayUsingDisplayMode:_currentDisplayMode]; + [self drawVideoFrame]; + } + CGLUnlockContext(cglDisplayContext); } @@ -2015,7 +2309,7 @@ enum OGLVertexAttributeID glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV; } - if ([(DisplayWindowController *)[[self window] delegate] displayMode] != DS_DISPLAY_TYPE_COMBO) + if (_currentDisplayMode != DS_DISPLAY_TYPE_COMBO) { videoFilterDestSize.height = (uint32_t)videoFilterDestSize.height * 2; } @@ -2055,3 +2349,19 @@ enum OGLVertexAttributeID } @end + +#pragma mark - +@implementation DisplayFullScreenWindow + +#pragma mark NSWindow Methods +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +- (BOOL)canBecomeMainWindow +{ + return YES; +} + +@end diff --git a/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm b/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm index 71feb4218..c8b0e2881 100644 --- a/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm +++ b/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm @@ -430,11 +430,6 @@ - (IBAction) newDisplayWindow:(id)sender { DisplayWindowController *newWindowController = [[DisplayWindowController alloc] initWithWindowNibName:@"DisplayWindow" emuControlDelegate:self]; - [windowList addObject:newWindowController]; - [[newWindowController view] setInputManager:[self inputManager]]; - - [self updateAllWindowTitles]; - [newWindowController showWindow:self]; [[newWindowController window] makeKeyAndOrderFront:self]; [[newWindowController window] makeMainWindow]; @@ -1796,14 +1791,14 @@ { NSString *newWindowTitle = [romName stringByAppendingFormat:@":%ld", (unsigned long)([windowList indexOfObject:windowController] + 1)]; - [[windowController window] setTitle:newWindowTitle]; - [[windowController window] setRepresentedURL:repURL]; - [[[windowController window] standardWindowButton:NSWindowDocumentIconButton] setImage:titleIcon]; + [[windowController masterWindow] setTitle:newWindowTitle]; + [[windowController masterWindow] setRepresentedURL:repURL]; + [[[windowController masterWindow] standardWindowButton:NSWindowDocumentIconButton] setImage:titleIcon]; } } else { - NSWindow *theWindow = [[windowList objectAtIndex:0] window]; + NSWindow *theWindow = [[windowList objectAtIndex:0] masterWindow]; [theWindow setTitle:romName]; [theWindow setRepresentedURL:repURL]; [[theWindow standardWindowButton:NSWindowDocumentIconButton] setImage:titleIcon];