diff --git a/desmume/src/frontend/cocoa/DefaultUserPrefs.plist b/desmume/src/frontend/cocoa/DefaultUserPrefs.plist index 8c7d5b97e..ca35299bb 100644 --- a/desmume/src/frontend/cocoa/DefaultUserPrefs.plist +++ b/desmume/src/frontend/cocoa/DefaultUserPrefs.plist @@ -14,6 +14,8 @@ CoreControl_SpeedScalar 1 + Debug_AppAppearanceMode + 0 Debug_DisableMetal Debug_GDBStubEnableARM9 diff --git a/desmume/src/frontend/cocoa/cocoa_globals.h b/desmume/src/frontend/cocoa/cocoa_globals.h index f308f9c71..aeb7ed842 100644 --- a/desmume/src/frontend/cocoa/cocoa_globals.h +++ b/desmume/src/frontend/cocoa/cocoa_globals.h @@ -215,6 +215,13 @@ #define RUMBLE_ITERATIONS_ENABLE 1 #define RUMBLE_ITERATIONS_TEST 3 +enum +{ + APP_APPEARANCEMODE_AUTOMATIC = 0, + APP_APPEARANCEMODE_LIGHT = 1, + APP_APPEARANCEMODE_DARK = 2 +}; + enum { ROMAUTOLOADOPTION_LOAD_LAST = 0, diff --git a/desmume/src/frontend/cocoa/cocoa_util.h b/desmume/src/frontend/cocoa/cocoa_util.h index 0dd7eb4fd..1c5db93c3 100644 --- a/desmume/src/frontend/cocoa/cocoa_util.h +++ b/desmume/src/frontend/cocoa/cocoa_util.h @@ -39,6 +39,8 @@ + (NSString *) appInternalNameAndVersionString; + (NSString *) appCompilerDetailString; ++ (BOOL) determineDarkModeAppearance; + + (NSString *) operatingSystemString; + (NSString *) modelIdentifierString; + (uint32_t) hostIP4AddressAsUInt32; diff --git a/desmume/src/frontend/cocoa/cocoa_util.mm b/desmume/src/frontend/cocoa/cocoa_util.mm index 74fe1e813..0dc21336d 100644 --- a/desmume/src/frontend/cocoa/cocoa_util.mm +++ b/desmume/src/frontend/cocoa/cocoa_util.mm @@ -156,6 +156,42 @@ return [NSString stringWithCString:EMU_DESMUME_COMPILER_DETAIL() encoding:NSUTF8StringEncoding]; } ++ (BOOL) determineDarkModeAppearance +{ + const NSInteger appAppearanceMode = [[NSUserDefaults standardUserDefaults] integerForKey:@"Debug_AppAppearanceMode"]; + BOOL darkModeState = NO; // Default to Light Mode appearance + + if ( (appAppearanceMode == APP_APPEARANCEMODE_AUTOMATIC) && IsOSXVersionSupported(10, 10, 0) ) + { + // We're doing a Yosemite-style check for Dark Mode by reading the AppleInterfaceStyle key from NSGlobalDomain. + // + // Apple recommends using [[NSView effectiveAppearance] name] to check for Dark Mode, which requires Mojave. + // While this Mojave method may be the "correct" method according to Apple, we would be forcing the user to + // run Mojave or later, with this method only being useful if DeSmuME's GUI uses a mix of both Light Mode and + // Dark Mode windows. We want to keep DeSmuME's GUI simple by only using a single appearance mode for the + // entire app, and so the Mojave method gives no benefits to DeSmuME over the Yosemite method, and because we + // don't want DeSmuME to be limited to running only on the more advanced versions of macOS. + // + // And so we call this method in response to the "AppleInterfaceThemeChangedNotification" notification from + // NSDistributedNotificationCenter. Doing this causes a serious technical problem to occur for the Mojave + // method, in which macOS Mojave and Cataline experience a race condition if you try to call + // [[NSView effectiveAppearance] name] when the user switches appearance modes in System Preferences. This + // race condition causes an unreliable read of the Dark Mode state on Mojave and Catalina. + // + // With the aforementioned reliability issue being the final straw on top of the previously mentioned reasons, + // this makes the Yosemite method for checking the Dark Mode state the correct choice. + const NSDictionary *globalPersistentDomain = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain]; + const NSString *interfaceStyle = [globalPersistentDomain valueForKey:@"AppleInterfaceStyle"]; + darkModeState = (interfaceStyle != nil) && [interfaceStyle isEqualToString:@"Dark"] && IsOSXVersionSupported(10, 14, 0); + } + else if (appAppearanceMode == APP_APPEARANCEMODE_DARK) + { + darkModeState = YES; // Force Dark Mode appearance + } + + return darkModeState; +} + + (NSString *) operatingSystemString { NSDictionary *systemDict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]; diff --git a/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib b/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib index ac7fc594e..b6ed63465 100644 --- a/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib +++ b/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib @@ -2125,6 +2125,57 @@ + + + App Appearance Mode + + 2147483647 + + + submenuAction: + + + App Appearance Mode + + + + Automatic + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Light + + 2147483647 + + + 1 + + + + Dark + + 2147483647 + + + 2 + + + + YES @@ -3099,9 +3150,11 @@ {1.7976931348623157e+308, 1.7976931348623157e+308} - + 256 {400, 100} + + {{0, 0}, {1920, 1177}} {1.7976931348623157e+308, 1.7976931348623157e+308} @@ -3109,7 +3162,7 @@ YES - + 268 @@ -3125,6 +3178,7 @@ 268 {{175, 50}, {199, 21}} + YES 613417024 @@ -3144,6 +3198,7 @@ 268 {{376, 43}, {96, 32}} + YES 67108864 @@ -3165,6 +3220,7 @@ 268 {{15, 53}, {155, 17}} + YES 68157504 @@ -3183,6 +3239,7 @@ 268 {{15, 14}, {454, 28}} + YES 69206017 @@ -3200,10 +3257,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 81}} + {{17, 16}, {486, 97}} + {0, 0} 67108864 @@ -3242,6 +3301,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{148, 14}, {226, 21}} + YES 613417024 @@ -3261,6 +3321,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{376, 7}, {96, 32}} + YES 67108864 @@ -3282,6 +3343,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{15, 17}, {128, 17}} + YES 68157504 @@ -3298,10 +3360,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 45}} + {{17, 117}, {486, 61}} + {0, 0} 67108864 @@ -3330,6 +3394,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{63, 12}, {371, 18}} + YES 67108864 @@ -3358,6 +3423,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{114, 33}, {270, 32}} + YES 67108864 @@ -3377,10 +3443,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 75}} + {{17, 182}, {486, 91}} + {0, 0} 67108864 @@ -3409,6 +3477,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{16, 40}, {366, 18}} + YES -2080374784 @@ -3432,6 +3501,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{16, 84}, {247, 18}} + YES -2080374784 @@ -3455,6 +3525,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{273, 10}, {196, 26}} + YES -2076180416 @@ -3549,6 +3620,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{15, 16}, {256, 17}} + YES 68157504 @@ -3567,6 +3639,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{16, 62}, {216, 18}} + YES -2080374784 @@ -3588,10 +3661,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 109}} + {{17, 277}, {486, 125}} + {0, 0} 67108864 @@ -3609,10 +3684,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {520, 422} + + NSView - + 268 @@ -3620,6 +3697,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{96, 463}, {97, 17}} + YES 68157504 @@ -3638,6 +3716,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{195, 457}, {265, 26}} + YES -2076180416 @@ -3697,6 +3776,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{462, 457}, {116, 26}} + YES -2076180416 @@ -3837,6 +3917,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA256 {640, 394} + YES NO YES @@ -3845,13 +3926,13 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA256 {640, 17} + - - + + -2147483392 {{584, 0}, {16, 17}} - @@ -4041,6 +4122,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 17}, {640, 394}} + @@ -4054,6 +4136,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 0}, {640, 17}} + @@ -4062,6 +4145,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA-2147483392 {{584, 17}, {15, 102}} + NO _doScroller: @@ -4072,16 +4156,17 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA-2147483392 {{1, 420}, {624, 15}} + NO 1 _doScroller: 0.99843505477308292 - {{-1, 37}, {642, 412}} + 133682 @@ -4097,6 +4182,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{197, 12}, {247, 17}} + YES 605028416 @@ -4116,10 +4202,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {640, 495} + + InputPrefsView - + 268 @@ -4130,6 +4218,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{13, 10}, {463, 396}} + 1 @@ -4150,6 +4239,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{72, 43}, {84, 17}} + YES 68157504 @@ -4168,6 +4258,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{44, 16}, {112, 17}} + YES 68157504 @@ -4186,6 +4277,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{158, 37}, {126, 26}} + YES -2076180416 @@ -4274,6 +4366,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{289, 14}, {72, 22}} + YES -1804599231 @@ -4341,6 +4434,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{63, 69}, {93, 17}} + YES 68157504 @@ -4359,6 +4453,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{158, 63}, {126, 26}} + YES -2076180416 @@ -4426,6 +4521,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{158, 11}, {126, 26}} + YES -2076180416 @@ -4526,10 +4622,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {429, 97}} + {{6, 232}, {431, 113}} + {0, 0} 67108864 @@ -4558,6 +4656,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{15, 16}, {126, 17}} + YES 68157504 @@ -4576,6 +4675,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{339, 14}, {72, 22}} + YES -1804599231 @@ -4638,6 +4738,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{144, 10}, {189, 26}} + YES -2080112384 @@ -4660,6 +4761,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{305, 36}, {38, 11}} + YES 68157504 @@ -4682,6 +4784,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{263, 36}, {38, 11}} + YES 68157504 @@ -4700,6 +4803,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{220, 36}, {38, 11}} + YES 68157504 @@ -4718,6 +4822,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{178, 36}, {38, 11}} + YES 68157504 @@ -4736,6 +4841,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{137, 36}, {38, 11}} + YES 68157504 @@ -4754,6 +4860,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{181, 82}, {175, 26}} + YES -2076180416 @@ -4841,6 +4948,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{181, 56}, {175, 26}} + YES -2076180416 @@ -4895,6 +5003,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{64, 88}, {115, 17}} + YES 68157504 @@ -4913,6 +5022,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{64, 62}, {114, 17}} + YES 68157504 @@ -4929,10 +5039,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {429, 116}} + {{6, 5}, {431, 132}} + {0, 0} 67108864 @@ -4961,6 +5073,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{223, 36}, {175, 26}} + YES -2076180416 @@ -5038,6 +5151,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{31, 42}, {190, 17}} + YES 68157504 @@ -5056,6 +5170,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{223, 10}, {175, 26}} + YES -2076180416 @@ -5133,6 +5248,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{32, 16}, {190, 17}} + YES 68157504 @@ -5149,10 +5265,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {429, 71}} + {{6, 141}, {431, 87}} + {0, 0} 67108864 @@ -5171,6 +5289,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{10, 33}, {443, 350}} + Display Views @@ -6138,10 +6257,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {489, 420} + + NSView - + 268 @@ -6149,6 +6270,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{163, 329}, {220, 26}} + YES @@ -6207,6 +6329,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{17, 335}, {144, 17}} + YES @@ -6234,6 +6357,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{16, 12}, {153, 18}} + YES @@ -6256,11 +6380,13 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {364, 38}} + {{17, 209}, {366, 54}} + {0, 0} @@ -6290,6 +6416,7 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA268 {{18, 15}, {180, 46}} + YES NO @@ -6535,6 +6662,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{145, 10}, {204, 26}} + YES -2076180416 @@ -6601,11 +6729,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {364, 71}} + {{17, 16}, {366, 87}} + {0, 0} @@ -6635,6 +6765,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{18, 14}, {328, 58}} + YES NO @@ -6889,11 +7020,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {364, 82}} + {{17, 107}, {366, 98}} + {0, 0} @@ -6923,6 +7056,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{40, 13}, {246, 21}} + YES @@ -6946,6 +7080,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{287, 17}, {62, 17}} + YES @@ -7025,6 +7160,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{18, 16}, {16, 16}} + YES @@ -7045,11 +7181,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {364, 44}} + {{17, 267}, {366, 60}} + {0, 0} @@ -7068,11 +7206,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {400, 373} + + NSView - + 268 @@ -7083,6 +7223,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{13, 10}, {528, 441}} + 1 @@ -7103,6 +7244,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 52}, {198, 18}} + YES @@ -7127,6 +7269,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 32}, {217, 18}} + YES @@ -7151,6 +7294,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 12}, {183, 18}} + YES -2080374784 @@ -7172,11 +7316,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 78}} + {{6, 301}, {496, 94}} + {0, 0} @@ -7206,6 +7352,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{18, 14}, {165, 38}} + YES NO @@ -7448,6 +7595,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{242, 15}, {73, 17}} + YES @@ -7467,6 +7615,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{320, 13}, {50, 22}} + YES @@ -7527,6 +7676,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{371, 10}, {19, 27}} + YES @@ -7545,11 +7695,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 62}} + {{6, 219}, {496, 78}} + {0, 0} @@ -7579,6 +7731,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{95, 14}, {66, 17}} + YES @@ -7598,6 +7751,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{164, 12}, {176, 26}} + YES @@ -7621,6 +7775,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{343, 14}, {52, 17}} + YES 68157504 @@ -7676,6 +7831,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{161, 36}, {26, 14}} + YES @@ -7695,6 +7851,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{239, 36}, {26, 14}} + YES @@ -7714,6 +7871,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{314, 36}, {31, 14}} + YES @@ -7731,11 +7889,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 60}} + {{6, 139}, {496, 76}} + {0, 0} @@ -7765,6 +7925,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 12}, {462, 18}} + YES @@ -7787,11 +7948,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 38}} + {{6, 81}, {496, 54}} + {0, 0} @@ -7821,6 +7984,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 32}, {146, 18}} + YES @@ -7845,6 +8009,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 12}, {118, 18}} + YES 67108864 @@ -7866,11 +8031,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 58}} + {{6, 3}, {496, 74}} + {0, 0} @@ -7890,6 +8057,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{10, 33}, {508, 395}} + General Settings @@ -9314,6 +9482,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {554, 465} + + NSView @@ -32696,7 +32866,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {1.7976931348623157e+308, 1.7976931348623157e+308} - + 256 @@ -32715,7 +32885,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{11, 105}, {48, 48}} - YES @@ -32738,7 +32907,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{60, 111}, {252, 18}} - YES @@ -32757,7 +32925,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{120, 14}, {150, 19}} - YES 67108864 @@ -32779,7 +32946,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{58, 134}, {150, 14}} - YES @@ -32807,7 +32973,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 92}, {110, 14}} - YES @@ -32827,7 +32992,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 75}, {110, 14}} - YES @@ -32847,7 +33011,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 58}, {110, 14}} - YES @@ -32867,7 +33030,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{130, 92}, {205, 14}} - YES @@ -32888,7 +33050,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{130, 75}, {205, 14}} - YES @@ -32909,7 +33070,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{130, 58}, {205, 14}} - YES @@ -32930,7 +33090,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{65, 23}, {205, 27}} - YES @@ -32954,7 +33113,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{67, 14}, {26, 11}} - YES @@ -32974,7 +33132,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{112, 14}, {33, 11}} - YES @@ -32994,7 +33151,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{156, 14}, {33, 11}} - YES @@ -33014,7 +33170,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{204, 14}, {33, 11}} - YES @@ -33034,7 +33189,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{248, 14}, {41, 11}} - YES @@ -33054,7 +33208,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{25, 33}, {37, 17}} - YES @@ -33074,7 +33227,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{264, 33}, {72, 17}} - YES @@ -33134,13 +33286,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {354, 116}} - {{17, 157}, {356, 132}} - {0, 0} @@ -33162,7 +33312,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{318, 111}, {59, 20}} - YES @@ -33187,7 +33336,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 12 {{11, 94}, {367, 5}} - {0, 0} 67108864 @@ -33207,7 +33355,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 32.425800000000002}, {356, 56}} - YES 67108864 @@ -33223,8 +33370,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {390, 309} - - {{0, 0}, {1920, 1177}} @@ -59164,6 +59309,50 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 12235 + + + changeAppAppearance: + + + + 12242 + + + + changeAppAppearance: + + + + 12243 + + + + changeAppAppearance: + + + + 12244 + + + + hidden: isDeveloperPlusBuild + + + + + + hidden: isDeveloperPlusBuild + hidden + isDeveloperPlusBuild + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 12246 + @@ -60590,6 +60779,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 + @@ -80710,6 +80900,45 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 + + 12236 + + + + + + + + 12237 + + + + + + + + + + + 12238 + + + + + 12239 + + + + + 12240 + + + + + 12241 + + + @@ -83489,6 +83718,13 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{811, 643}, {122, 73}} + 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 @@ -83856,7 +84092,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{505, 763}, {194, 73}} + {{575, 763}, {194, 73}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip @@ -83967,14 +84203,14 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{11, 836}, {512, 20}} + {{195, 836}, {512, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1145, 512}, {302, 473}} + {{469, 363}, {315, 473}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -83986,7 +84222,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{269, 683}, {151, 153}} + {{339, 683}, {151, 153}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -84431,7 +84667,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{863, 773}, {132, 63}} + {{784, 773}, {132, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -84936,7 +85172,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{576, 723}, {261, 113}} + {{646, 723}, {261, 113}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -85100,12 +85336,12 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{590, 653}, {203, 183}} + {{207, 653}, {203, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{766, 383}, {257, 453}} + {{383, 383}, {257, 453}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -85120,7 +85356,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1382, 975}, {281, 153}} + {{519, 663}, {292, 173}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -85198,9 +85434,9 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{892, 700}, {400, 100}} + {{728, 700}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin - {{892, 700}, {400, 100}} + {{728, 700}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin {{534, 800}, {616, 0}} @@ -85868,7 +86104,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{863, 713}, {70, 103}} + {{784, 713}, {70, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -85957,7 +86193,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1166, 665}, {316, 463}} + {{297, 373}, {325, 463}} com.apple.InterfaceBuilder.CocoaPlugin {{655, 347}, {173, 339}} com.apple.InterfaceBuilder.CocoaPlugin @@ -86827,7 +87063,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - 12235 + 12246 @@ -86836,6 +87072,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSObject id + id id id id @@ -86845,6 +87082,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 bugReport: id + + changeAppAppearance: + id + launchForums: id @@ -87371,6 +87612,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 id id id + id id id id @@ -87448,6 +87690,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 changeHardwareMicMute: id + + changeHostMicrophonePermission: + id + changeRomSaveType: id diff --git a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h index c6604dbf0..4a84b0950 100644 --- a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h +++ b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h @@ -301,7 +301,6 @@ class AudioSampleBlockGenerator; - (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL; - (BOOL) loadRomByURL:(NSURL *)romURL asynchronous:(BOOL)willLoadAsync; - (void) loadRomDidFinish:(NSNotification *)aNotification; -- (void) handleSystemThemeChange:(NSNotification *) notification; - (BOOL) unloadRom; - (void) addOutputToCore:(CocoaDSOutput *)theOutput; @@ -330,5 +329,6 @@ class AudioSampleBlockGenerator; - (void) writeUserDefaults; - (void) restoreDisplayWindowStates; - (void) saveDisplayWindowStates; +- (void) handleAppearanceChange; @end diff --git a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm index e9598efed..cd8f6e062 100644 --- a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm @@ -124,25 +124,7 @@ mainWindow = nil; windowList = [[NSMutableArray alloc] initWithCapacity:32]; - isRunningDarkMode = NO; - -#if HAVE_OSAVAILABLE && defined(MAC_OS_X_VERSION_10_14) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) - if (IsOSXVersionSupported(10, 14, 0)) - { - if (@available(macOS 10.14, *)) - { - NSAppearanceName currentAppearanceName = [[NSApp effectiveAppearance] name]; - - if ( (currentAppearanceName == NSAppearanceNameDarkAqua) || - (currentAppearanceName == NSAppearanceNameVibrantDark) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastDarkAqua) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastVibrantDark) ) - { - isRunningDarkMode = YES; - } - } - } -#endif + isRunningDarkMode = [CocoaDSUtil determineDarkModeAppearance]; _displayRotationPanelTitle = nil; _displaySeparationPanelTitle = nil; @@ -216,8 +198,6 @@ name:@"org.desmume.DeSmuME.handleEmulatorExecutionState" object:nil]; - [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSystemThemeChange:) name:@"AppleInterfaceThemeChangedNotification" object:nil]; - return self; } @@ -2217,45 +2197,6 @@ [cdsCore setFrameStatus:frameStatusString]; } -- (void) handleSystemThemeChange:(NSNotification *) notification -{ - BOOL newDarkModeState = NO; - -#if HAVE_OSAVAILABLE && defined(MAC_OS_X_VERSION_10_14) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) - if (IsOSXVersionSupported(10, 14, 0)) - { - if (@available(macOS 10.14, *)) - { - NSAppearanceName currentAppearanceName = nil; - - if (mainWindow != nil) - { - currentAppearanceName = [[[mainWindow view] effectiveAppearance] name]; - } - else - { - currentAppearanceName = [[NSApp effectiveAppearance] name]; - } - - if ( (currentAppearanceName == NSAppearanceNameDarkAqua) || - (currentAppearanceName == NSAppearanceNameVibrantDark) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastDarkAqua) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastVibrantDark) ) - { - newDarkModeState = YES; - } - } - } -#endif - - if (newDarkModeState != [self isRunningDarkMode]) - { - [self setIsRunningDarkMode:newDarkModeState]; - [self setCurrentVolumeValue:[self currentVolumeValue]]; - [self updateMicStatusIcon]; - } -} - - (void) addOutputToCore:(CocoaDSOutput *)theOutput { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; @@ -2940,6 +2881,18 @@ } } +- (void) handleAppearanceChange +{ + const BOOL newDarkModeState = [CocoaDSUtil determineDarkModeAppearance]; + + if (newDarkModeState != [self isRunningDarkMode]) + { + [self setIsRunningDarkMode:newDarkModeState]; + [self setCurrentVolumeValue:[self currentVolumeValue]]; + [self updateMicStatusIcon]; + } +} + #pragma mark NSUserInterfaceValidations Protocol - (BOOL)validateUserInterfaceItem:(id )theItem diff --git a/desmume/src/frontend/cocoa/userinterface/appDelegate.h b/desmume/src/frontend/cocoa/userinterface/appDelegate.h index 9d69f09be..7cde29dfe 100644 --- a/desmume/src/frontend/cocoa/userinterface/appDelegate.h +++ b/desmume/src/frontend/cocoa/userinterface/appDelegate.h @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2011-2018 DeSmuME Team + Copyright (C) 2011-2022 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 @@ -25,9 +25,9 @@ #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 -@interface AppDelegate : NSObject +@interface AppDelegate : NSObject #else -@interface AppDelegate : NSObject +@interface AppDelegate : NSObject #endif { NSObject *dummyObject; @@ -77,9 +77,11 @@ - (IBAction) launchForums:(id)sender; - (IBAction) supportRequest:(id)sender; - (IBAction) bugReport:(id)sender; +- (IBAction) changeAppAppearance:(id)sender; - (void) setupSlotMenuItems; - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber; - (void) setupUserDefaults; +- (void) handleSystemAppearanceThemeChange:(NSNotification *) notification; @end diff --git a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm index 1d9f38c64..1147e5fd6 100644 --- a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm @@ -86,6 +86,8 @@ RGBA8888ToNSColorValueTransformer *nsColorTransformer = [[[RGBA8888ToNSColorValueTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer:nsColorTransformer forName:@"RGBA8888ToNSColorValueTransformer"]; + [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSystemAppearanceThemeChange:) name:@"AppleInterfaceThemeChangedNotification" object:nil]; + return self; } @@ -459,6 +461,15 @@ [troubleshootingWindow makeKeyAndOrderFront:sender]; } +- (IBAction) changeAppAppearance:(id)sender +{ + const NSInteger appAppearanceMode = [CocoaDSUtil getIBActionSenderTag:sender]; + [[NSUserDefaults standardUserDefaults] setInteger:appAppearanceMode forKey:@"Debug_AppAppearanceMode"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + [self handleSystemAppearanceThemeChange:nil]; +} + #pragma mark Class Methods - (void) setupSlotMenuItems { @@ -707,4 +718,33 @@ [prefWindowDelegate setupUserDefaults]; } +- (void) handleSystemAppearanceThemeChange:(NSNotification *) notification +{ + EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; + PreferencesWindowDelegate *prefWindowDelegate = (PreferencesWindowDelegate *)[prefWindow delegate]; + + [emuControl handleAppearanceChange]; + [prefWindowDelegate handleAppearanceChange]; +} + +#pragma mark NSUserInterfaceValidations Protocol + +- (BOOL)validateUserInterfaceItem:(id )theItem +{ + BOOL enable = YES; + const SEL theAction = [theItem action]; + + if (theAction == @selector(changeAppAppearance:)) + { + const NSInteger appAppearanceMode = [[NSUserDefaults standardUserDefaults] integerForKey:@"Debug_AppAppearanceMode"]; + + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + [(NSMenuItem*)theItem setState:([theItem tag] == appAppearanceMode) ? GUI_STATE_ON : GUI_STATE_OFF]; + } + } + + return enable; +} + @end diff --git a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h index fb146e65a..3bb44c09b 100644 --- a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h +++ b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h @@ -173,5 +173,6 @@ class OGLImage; - (void) switchContentView:(NSView *)theView; - (void) markUnsupportedOpenGLMSAAMenuItems; - (void) setupUserDefaults; +- (void) handleAppearanceChange; @end diff --git a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm index e24441b22..c02a06578 100644 --- a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm @@ -344,25 +344,7 @@ subnetMaskString_AP2 = @"0.0.0.0"; subnetMaskString_AP3 = @"0.0.0.0"; - _isRunningDarkMode = NO; - -#if HAVE_OSAVAILABLE && defined(MAC_OS_X_VERSION_10_14) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) - if (IsOSXVersionSupported(10, 14, 0)) - { - if (@available(macOS 10.14, *)) - { - NSAppearanceName currentAppearanceName = [[NSApp effectiveAppearance] name]; - - if ( (currentAppearanceName == NSAppearanceNameDarkAqua) || - (currentAppearanceName == NSAppearanceNameVibrantDark) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastDarkAqua) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastVibrantDark) ) - { - _isRunningDarkMode = YES; - } - } - } -#endif + _isRunningDarkMode = [CocoaDSUtil determineDarkModeAppearance]; // Load the volume icons. iconVolumeFull = [[NSImage imageNamed:@"Icon_VolumeFull_16x16"] retain]; @@ -377,8 +359,6 @@ prefViewDict = nil; - [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSystemThemeChange:) name:@"AppleInterfaceThemeChangedNotification" object:nil]; - return self; } @@ -1161,28 +1141,9 @@ } } -- (void) handleSystemThemeChange:(NSNotification *) notification +- (void) handleAppearanceChange { - BOOL newDarkModeState = NO; - -#if HAVE_OSAVAILABLE && defined(MAC_OS_X_VERSION_10_14) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) - if (IsOSXVersionSupported(10, 14, 0)) - { - if (@available(macOS 10.14, *)) - { - NSAppearanceName currentAppearanceName = [[[self viewSound] effectiveAppearance] name]; - - if ( (currentAppearanceName == NSAppearanceNameDarkAqua) || - (currentAppearanceName == NSAppearanceNameVibrantDark) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastDarkAqua) || - (currentAppearanceName == NSAppearanceNameAccessibilityHighContrastVibrantDark) ) - { - newDarkModeState = YES; - } - } - } -#endif - + const BOOL newDarkModeState = [CocoaDSUtil determineDarkModeAppearance]; if (newDarkModeState != _isRunningDarkMode) { _isRunningDarkMode = newDarkModeState;