This repository has been archived on 2025-03-19. You can view files and clone it, but cannot push or open issues or pull requests.
FlashBackPro/FlashBack/FlashBack/InternalSetWallpaper.m
Micah Gomez 1a0674c74e There's a lot going on here
I'm just pushing this because I have bits and pieces working and I don't want to lose it like i inevitably will if I don't do this now
2019-12-31 14:43:39 -07:00

58 lines
2.4 KiB
Objective-C

#import "InternalSetWallpaper.h"
#include <dlfcn.h>
static NSString *frameworkPath(NSString *framework) {
NSString *path;
#if TARGET_OS_SIMULATOR
path = @"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks";
#else
path = @"/System/Library/PrivateFrameworks";
#endif
return [path stringByAppendingPathComponent:framework];
}
static void loadPrivateFramework(NSString *framework) {
NSBundle *bundle = [NSBundle bundleWithPath:frameworkPath(framework)];
[bundle load];
}
static void *loadFrameworkLibrary(NSString *framework) {
NSString *libraryPath = [frameworkPath(framework) stringByAppendingPathComponent:[framework stringByDeletingPathExtension]];
return dlopen(libraryPath.UTF8String, RTLD_LAZY);
}
void callIntegerSetMethodOnTarget(SEL selector, id target, NSInteger arg2) {
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:selector]];
[inv setSelector:selector];
[inv setTarget:target];
[inv setArgument:&arg2 atIndex:2];
[inv invoke];
}
void setLightAndDarkWallpaperImages(UIImage *lightImage, UIImage *darkImage, int locations) {
loadPrivateFramework(@"SpringBoardFoundation.framework");
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
id SBFWallpaperOptions = NSClassFromString(@"SBFWallpaperOptions");
SEL initSelector = @selector(init);
id lightOptions = [[SBFWallpaperOptions alloc] performSelector:initSelector];
callIntegerSetMethodOnTarget(@selector(setWallpaperMode:), lightOptions, 1);
id darkOptions = [[SBFWallpaperOptions alloc] performSelector:initSelector];
callIntegerSetMethodOnTarget(@selector(setWallpaperMode:), darkOptions, 2);
void *sbsUILib = loadFrameworkLibrary(@"SpringBoardUIServices.framework");
int (*_SBSUIWallpaperSetImages)(id imageDict, id optionsDict, int locations, int interfaceStyle) = dlsym(sbsUILib, "SBSUIWallpaperSetImages");
_SBSUIWallpaperSetImages(@{@"light": lightImage, @"dark": darkImage},
@{@"light": lightOptions, @"dark": darkOptions},
locations,
UIUserInterfaceStyleDark);
#pragma clang diagnostic pop
}