comparison src/sys/osx/dark_theme.cc @ 379:5eaafed6c10b

*: clang-format
author Paper <paper@tflc.us>
date Wed, 05 Nov 2025 12:59:46 -0500
parents 22f9aacf6ac1
children
comparison
equal deleted inserted replaced
378:5912dafc6e28 379:5eaafed6c10b
16 static CFStringRef NSAppearanceNameAqua = nullptr; 16 static CFStringRef NSAppearanceNameAqua = nullptr;
17 static CFStringRef NSAppearanceNameDarkAqua = nullptr; 17 static CFStringRef NSAppearanceNameDarkAqua = nullptr;
18 18
19 static const CFStringRef kAppKitBundleID = CFSTR("com.apple.AppKit"); 19 static const CFStringRef kAppKitBundleID = CFSTR("com.apple.AppKit");
20 20
21 bool RetrieveAppearanceNames() { 21 bool RetrieveAppearanceNames()
22 {
22 CFBundleRef appkit_bundle = CFBundleGetBundleWithIdentifier(kAppKitBundleID); 23 CFBundleRef appkit_bundle = CFBundleGetBundleWithIdentifier(kAppKitBundleID);
23 if (!appkit_bundle) 24 if (!appkit_bundle)
24 return false; 25 return false;
25 26
26 auto aqua_appearance = reinterpret_cast<CFStringRef*>(CFBundleGetDataPointerForName(appkit_bundle, CFSTR("NSAppearanceNameAqua"))); 27 auto aqua_appearance =
28 reinterpret_cast<CFStringRef *>(CFBundleGetDataPointerForName(appkit_bundle, CFSTR("NSAppearanceNameAqua")));
27 if (!aqua_appearance) 29 if (!aqua_appearance)
28 return false; 30 return false;
29 NSAppearanceNameAqua = *aqua_appearance; 31 NSAppearanceNameAqua = *aqua_appearance;
30 32
31 auto dark_aqua_appearance = reinterpret_cast<CFStringRef*>( 33 auto dark_aqua_appearance = reinterpret_cast<CFStringRef *>(
32 CFBundleGetDataPointerForName(appkit_bundle, CFSTR("NSAppearanceNameDarkAqua"))); 34 CFBundleGetDataPointerForName(appkit_bundle, CFSTR("NSAppearanceNameDarkAqua")));
33 if (!dark_aqua_appearance) 35 if (!dark_aqua_appearance)
34 return false; 36 return false;
35 NSAppearanceNameDarkAqua = *dark_aqua_appearance; 37 NSAppearanceNameDarkAqua = *dark_aqua_appearance;
36 38
37 return true; 39 return true;
38 } 40 }
39 41
40 bool DarkThemeAvailable() { 42 bool DarkThemeAvailable()
43 {
41 if (__builtin_available(macOS 10.14, *)) { 44 if (__builtin_available(macOS 10.14, *)) {
42 return true; 45 return true;
43 } else { 46 } else {
44 return false; 47 return false;
45 } 48 }
46 } 49 }
47 50
48 bool IsInDarkTheme() { 51 bool IsInDarkTheme()
52 {
49 if (!DarkThemeAvailable()) 53 if (!DarkThemeAvailable())
50 return false; 54 return false;
51 55
52 if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua) 56 if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua)
53 if (!RetrieveAppearanceNames()) 57 if (!RetrieveAppearanceNames())
54 return false; 58 return false;
55 59
56 // NSArray* array = @[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]; 60 // NSArray* array = @[NSAppearanceNameAqua, NSAppearanceNameDarkAqua];
57 CFArrayRef array = []() -> CFArrayRef { 61 CFArrayRef array = []() -> CFArrayRef {
58 CFStringRef refs[] = {NSAppearanceNameAqua, NSAppearanceNameDarkAqua}; 62 CFStringRef refs[] = {NSAppearanceNameAqua, NSAppearanceNameDarkAqua};
59 return CFArrayCreate(NULL, reinterpret_cast<const void**>(refs), 2, &kCFTypeArrayCallBacks); 63 return CFArrayCreate(NULL, reinterpret_cast<const void **>(refs), 2, &kCFTypeArrayCallBacks);
60 }(); 64 }();
61 65
62 // NSApplication* app = [NSApplication sharedApplication]; 66 // NSApplication* app = [NSApplication sharedApplication];
63 const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication")); 67 const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication"));
64 if (!app) 68 if (!app)
80 return false; 84 return false;
81 85
82 return CFEqual(appearance, NSAppearanceNameDarkAqua); 86 return CFEqual(appearance, NSAppearanceNameDarkAqua);
83 } 87 }
84 88
85 bool SetToDarkTheme() { 89 bool SetToDarkTheme()
90 {
86 // https://stackoverflow.com/questions/55925862/how-can-i-set-my-os-x-application-theme-in-code 91 // https://stackoverflow.com/questions/55925862/how-can-i-set-my-os-x-application-theme-in-code
87 if (!DarkThemeAvailable()) 92 if (!DarkThemeAvailable())
88 return false; 93 return false;
89 94
90 if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua) 95 if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua)
105 // [app setAppearance: appearance]; 110 // [app setAppearance: appearance];
106 obj_send(app, sel_getUid("setAppearance:"), appearance); 111 obj_send(app, sel_getUid("setAppearance:"), appearance);
107 return true; 112 return true;
108 } 113 }
109 114
110 bool SetToLightTheme() { 115 bool SetToLightTheme()
116 {
111 // https://stackoverflow.com/questions/55925862/how-can-i-set-my-os-x-application-theme-in-code 117 // https://stackoverflow.com/questions/55925862/how-can-i-set-my-os-x-application-theme-in-code
112 if (!DarkThemeAvailable()) 118 if (!DarkThemeAvailable())
113 return false; 119 return false;
114 120
115 if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua) 121 if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua)
129 // [app setAppearance: appearance]; 135 // [app setAppearance: appearance];
130 obj_send(app, sel_getUid("setAppearance:"), appearance); 136 obj_send(app, sel_getUid("setAppearance:"), appearance);
131 return true; 137 return true;
132 } 138 }
133 139
134 void SetToAutoTheme() { 140 void SetToAutoTheme()
141 {
135 if (!DarkThemeAvailable()) 142 if (!DarkThemeAvailable())
136 return; 143 return;
137 144
138 // NSApplication* app = [NSApplication sharedApplication]; 145 // NSApplication* app = [NSApplication sharedApplication];
139 const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication")); 146 const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication"));