Mercurial > minori
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")); |
