Mercurial > minori
view src/sys/osx/dark_theme.cc @ 258:862d0d8619f6
*: HUUUGE changes
animia has been renamed to animone, so instead of thinking of a
health condition, you think of a beautiful flower :)
I've also edited some of the code for animone, but I have no idea
if it even works or not because I don't have a mac or windows
machine lying around. whoops!
... anyway, all of the changes divergent from Anisthesia are now
licensed under BSD. it's possible that I could even rewrite most
of the code to where I don't even have to keep the MIT license,
but that's thinking too far into the future
I've been slacking off on implementing the anime seasons page,
mostly out of laziness. I think I'd have to create another db file
specifically for the seasons
anyway, this code is being pushed *primarily* because the hard drive
it's on is failing! yay :)
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Mon, 01 Apr 2024 02:43:44 -0400 |
parents | f0ff06a45c42 |
children | f31305b9f60a |
line wrap: on
line source
#include "sys/osx/dark_theme.h" #include <objc/message.h> #include <objc/runtime.h> #include <CoreFoundation/CoreFoundation.h> #include <QOperatingSystemVersion> namespace osx { typedef id (*object_message_send)(id, SEL, ...); typedef id (*class_message_send)(Class, SEL, ...); static const object_message_send obj_send = reinterpret_cast<object_message_send>(objc_msgSend); static const class_message_send cls_send = reinterpret_cast<class_message_send>(objc_msgSend); static CFStringRef NSAppearanceNameAqua = nullptr; static CFStringRef NSAppearanceNameDarkAqua = nullptr; static const CFStringRef kAppKitBundleID = CFSTR("com.apple.AppKit"); bool RetrieveAppearanceNames() { CFBundleRef appkit_bundle = CFBundleGetBundleWithIdentifier(kAppKitBundleID); if (!appkit_bundle) return false; NSAppearanceNameAqua = *reinterpret_cast<CFStringRef*>(CFBundleGetDataPointerForName(appkit_bundle, CFSTR("NSAppearanceNameAqua"))); if (!NSAppearanceNameAqua) return false; NSAppearanceNameDarkAqua = *reinterpret_cast<CFStringRef*>( CFBundleGetDataPointerForName(appkit_bundle, CFSTR("NSAppearanceNameDarkAqua"))); if (!NSAppearanceNameDarkAqua) return false; return true; } bool DarkThemeAvailable() { return (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave); } bool IsInDarkTheme() { if (!DarkThemeAvailable()) return false; if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua) if (!RetrieveAppearanceNames()) return false; // NSArray* array = @[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]; CFArrayRef array = []() -> CFArrayRef { CFStringRef refs[] = {NSAppearanceNameAqua, NSAppearanceNameDarkAqua}; return CFArrayCreate(NULL, reinterpret_cast<const void**>(refs), 2, &kCFTypeArrayCallBacks); }(); // NSApplication* app = [NSApplication sharedApplication]; const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication")); // NSAppearance* effectiveAppearance = [app effectiveAppearance]; const id effectiveAppearance = obj_send(app, sel_getUid("effectiveAppearance")); if (!effectiveAppearance) { CFRelease(array); return false; } // NSAppearance* appearance = [effectiveAppearance bestMatchFromAppearancesWithNames: array]; const id appearance = obj_send(effectiveAppearance, sel_getUid("bestMatchFromAppearancesWithNames:"), array); CFRelease(array); if (!appearance) return false; return CFEqual(appearance, NSAppearanceNameDarkAqua); } bool SetToDarkTheme() { // https://stackoverflow.com/questions/55925862/how-can-i-set-my-os-x-application-theme-in-code if (!DarkThemeAvailable()) return false; if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua) if (!RetrieveAppearanceNames()) return false; // NSApplication* app = [NSApplication sharedApplication]; const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication")); // NSAppearance* appearance = [NSAppearance appearanceNamed: NSAppearanceNameDarkAqua]; const id appearance = cls_send(objc_getClass("NSAppearance"), sel_getUid("appearanceNamed:"), NSAppearanceNameDarkAqua); if (!appearance) return false; // [app setAppearance: appearance]; obj_send(app, sel_getUid("setAppearance:"), appearance); return true; } bool SetToLightTheme() { // https://stackoverflow.com/questions/55925862/how-can-i-set-my-os-x-application-theme-in-code if (!DarkThemeAvailable()) return false; if (!NSAppearanceNameAqua || !NSAppearanceNameDarkAqua) if (!RetrieveAppearanceNames()) return false; // NSApplication* app = [NSApplication sharedApplication]; const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication")); // NSAppearance* appearance = [NSAppearance appearanceNamed: NSAppearanceNameDarkAqua]; const id appearance = cls_send(objc_getClass("NSAppearance"), sel_getUid("appearanceNamed:"), NSAppearanceNameAqua); if (!appearance) return false; // [app setAppearance: appearance]; obj_send(app, sel_getUid("setAppearance:"), appearance); return true; } void SetToAutoTheme() { if (!DarkThemeAvailable()) return; // NSApplication* app = [NSApplication sharedApplication]; const id app = cls_send(objc_getClass("NSApplication"), sel_getUid("sharedApplication")); // [app setAppearance: null]; obj_send(app, sel_getUid("setAppearance:"), nullptr); } } // namespace osx