diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7cd5639
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+build/*
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+*.xcworkspace
+!default.xcworkspace
+xcuserdata
+profile
+*.moved-aside
+.DS_Store
\ No newline at end of file
diff --git a/MagicWallpaper/Info.plist b/MagicWallpaper/Info.plist
new file mode 100644
index 0000000..fe512fa
--- /dev/null
+++ b/MagicWallpaper/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIdentifier
+ se.kiland.${PRODUCT_NAME:rfc1034identifier}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ SBProceduralWallpaperClassNames
+
+ MagicWallpaper
+
+ NSHumanReadableCopyright
+ Copyright © 2014 Anton Kiland. All rights reserved.
+
+
diff --git a/MagicWallpaper/MagicWallpaper.h b/MagicWallpaper/MagicWallpaper.h
new file mode 100644
index 0000000..04431ab
--- /dev/null
+++ b/MagicWallpaper/MagicWallpaper.h
@@ -0,0 +1,6 @@
+#import
+#import
+
+@interface MagicWallpaper : SBFProceduralWallpaper
+
+@end
diff --git a/MagicWallpaper/MagicWallpaper.m b/MagicWallpaper/MagicWallpaper.m
new file mode 100644
index 0000000..b78740f
--- /dev/null
+++ b/MagicWallpaper/MagicWallpaper.m
@@ -0,0 +1,94 @@
+#import "MagicWallpaper.h"
+
+@interface MagicWallpaper ()
+
+@end
+
+@implementation MagicWallpaper
+
+#pragma mark - Wallpaper information
+
+@synthesize delegate = _delegate;
+
++ (NSString *)identifier
+{
+ return @"MagicWallpaper";
+}
+
++ (BOOL)colorChangesSignificantly
+{
+ return YES;
+}
+
++ (NSArray *)presetWallpaperOptions
+{
+ return @[
+ @{ @"kSBUIMagicWallpaperThumbnailNameKey": @"magic-wallpaper1",
+ @"color": @"red" },
+ @{ @"kSBUIMagicWallpaperThumbnailNameKey": @"magic-wallpaper2",
+ @"color": @"green" }
+ ];
+}
+
+- (void)setWallpaperOptions:(NSDictionary *)options
+{
+ UILabel *label = (UILabel *)[self viewWithTag:2];
+ if ([options[@"color"] isEqualToString:@"red"]) {
+ label.textColor = [UIColor redColor];
+ } else {
+ label.textColor = [UIColor greenColor];
+ }
+}
+
+- (void)setWallpaperVariant:(int)variant
+{
+}
+
+
+#pragma mark - Wallpaper implementation
+
+- (id)initWithFrame:(CGRect)frame
+{
+ if (!(self = [super initWithFrame:frame]))
+ return nil;
+
+ UILabel *label = [[UILabel alloc] initWithFrame:self.bounds];
+ label.tag = 1;
+ label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ label.text = @"BBQ";
+ label.textColor = [UIColor whiteColor];
+ label.font = [UIFont boldSystemFontOfSize:50];
+ label.textAlignment = NSTextAlignmentCenter;
+ [self addSubview:label];
+
+ label = [[UILabel alloc] initWithFrame:self.bounds];
+ label.tag = 2;
+ label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ label.text = @"BBQ";
+ label.textColor = [UIColor redColor];
+ label.font = [UIFont boldSystemFontOfSize:50];
+ label.textAlignment = NSTextAlignmentCenter;
+
+ UIMotionEffectGroup *group = [[UIMotionEffectGroup alloc] init];
+ UIInterpolatingMotionEffect *xAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
+ UIInterpolatingMotionEffect *yAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
+
+ NSArray *motionEffects = @[ xAxis, yAxis ];
+ for (UIInterpolatingMotionEffect *effect in motionEffects) {
+ effect.maximumRelativeValue = @(100);
+ effect.minimumRelativeValue = @(-100);
+ }
+
+ group.motionEffects = motionEffects;
+ [label addMotionEffect:group];
+
+ [self addSubview:label];
+
+ return self;
+}
+
+- (void)setAnimating:(BOOL)animating
+{
+}
+
+@end
diff --git a/MagicWallpaper/Prefix.pch b/MagicWallpaper/Prefix.pch
new file mode 100644
index 0000000..3fdee9d
--- /dev/null
+++ b/MagicWallpaper/Prefix.pch
@@ -0,0 +1,10 @@
+//
+// Prefix header
+//
+// The contents of this file are implicitly included at the beginning of every source file.
+//
+
+#ifdef __OBJC__
+ #import
+ #import
+#endif
diff --git a/MagicWallpaper/magic-wallpaper1@2x.png b/MagicWallpaper/magic-wallpaper1@2x.png
new file mode 100644
index 0000000..9488c43
Binary files /dev/null and b/MagicWallpaper/magic-wallpaper1@2x.png differ
diff --git a/MagicWallpaper/magic-wallpaper2@2x.png b/MagicWallpaper/magic-wallpaper2@2x.png
new file mode 100644
index 0000000..f353a04
Binary files /dev/null and b/MagicWallpaper/magic-wallpaper2@2x.png differ
diff --git a/ProceduralWallpaper.xcodeproj/project.pbxproj b/ProceduralWallpaper.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..123acf8
--- /dev/null
+++ b/ProceduralWallpaper.xcodeproj/project.pbxproj
@@ -0,0 +1,311 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 3A171A0E1874D7D400CF8D08 /* MagicWallpaper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A171A0D1874D7D400CF8D08 /* MagicWallpaper.m */; };
+ 3A171A101874D95000CF8D08 /* SpringBoardFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A171A0F1874D95000CF8D08 /* SpringBoardFoundation.framework */; };
+ 3A171A111874D95700CF8D08 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A1719D51874D75800CF8D08 /* Foundation.framework */; };
+ 3A171A131874D95A00CF8D08 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A171A121874D95A00CF8D08 /* UIKit.framework */; };
+ 3A171A1F18758E8600CF8D08 /* magic-wallpaper1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3A171A1D18758E8600CF8D08 /* magic-wallpaper1@2x.png */; };
+ 3A171A2018758E8600CF8D08 /* magic-wallpaper2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3A171A1E18758E8600CF8D08 /* magic-wallpaper2@2x.png */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 3A1719D51874D75800CF8D08 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 3A1719E31874D75800CF8D08 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
+ 3A1719E61874D75800CF8D08 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+ 3A1719FF1874D77800CF8D08 /* MagicWallpaper.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MagicWallpaper.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3A171A001874D77800CF8D08 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
+ 3A171A041874D77800CF8D08 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 3A171A081874D77800CF8D08 /* Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; };
+ 3A171A0C1874D7D400CF8D08 /* MagicWallpaper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MagicWallpaper.h; sourceTree = ""; };
+ 3A171A0D1874D7D400CF8D08 /* MagicWallpaper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MagicWallpaper.m; sourceTree = ""; };
+ 3A171A0F1874D95000CF8D08 /* SpringBoardFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SpringBoardFoundation.framework; path = System/Library/PrivateFrameworks/SpringBoardFoundation.framework; sourceTree = SDKROOT; };
+ 3A171A121874D95A00CF8D08 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 3A171A161874DC1D00CF8D08 /* SpriteKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SpriteKit.framework; path = System/Library/Frameworks/SpriteKit.framework; sourceTree = SDKROOT; };
+ 3A171A1B1874DE9900CF8D08 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
+ 3A171A1D18758E8600CF8D08 /* magic-wallpaper1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "magic-wallpaper1@2x.png"; sourceTree = ""; };
+ 3A171A1E18758E8600CF8D08 /* magic-wallpaper2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "magic-wallpaper2@2x.png"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 3A1719FC1874D77800CF8D08 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3A171A131874D95A00CF8D08 /* UIKit.framework in Frameworks */,
+ 3A171A111874D95700CF8D08 /* Foundation.framework in Frameworks */,
+ 3A171A101874D95000CF8D08 /* SpringBoardFoundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 3A1719C91874D75800CF8D08 = {
+ isa = PBXGroup;
+ children = (
+ 3A171A021874D77800CF8D08 /* MagicWallpaper */,
+ 3A1719D41874D75800CF8D08 /* Frameworks */,
+ 3A1719D31874D75800CF8D08 /* Products */,
+ );
+ sourceTree = "";
+ };
+ 3A1719D31874D75800CF8D08 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 3A1719FF1874D77800CF8D08 /* MagicWallpaper.bundle */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 3A1719D41874D75800CF8D08 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 3A171A1B1874DE9900CF8D08 /* CoreMotion.framework */,
+ 3A171A161874DC1D00CF8D08 /* SpriteKit.framework */,
+ 3A171A121874D95A00CF8D08 /* UIKit.framework */,
+ 3A171A0F1874D95000CF8D08 /* SpringBoardFoundation.framework */,
+ 3A1719D51874D75800CF8D08 /* Foundation.framework */,
+ 3A1719E31874D75800CF8D08 /* XCTest.framework */,
+ 3A1719E61874D75800CF8D08 /* UIKit.framework */,
+ 3A171A001874D77800CF8D08 /* CoreFoundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 3A171A021874D77800CF8D08 /* MagicWallpaper */ = {
+ isa = PBXGroup;
+ children = (
+ 3A171A0C1874D7D400CF8D08 /* MagicWallpaper.h */,
+ 3A171A0D1874D7D400CF8D08 /* MagicWallpaper.m */,
+ 3A171A031874D77800CF8D08 /* Supporting Files */,
+ );
+ path = MagicWallpaper;
+ sourceTree = "";
+ };
+ 3A171A031874D77800CF8D08 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 3A171A041874D77800CF8D08 /* Info.plist */,
+ 3A171A081874D77800CF8D08 /* Prefix.pch */,
+ 3A171A1D18758E8600CF8D08 /* magic-wallpaper1@2x.png */,
+ 3A171A1E18758E8600CF8D08 /* magic-wallpaper2@2x.png */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 3A1719FE1874D77800CF8D08 /* MagicWallpaper */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 3A171A091874D77800CF8D08 /* Build configuration list for PBXNativeTarget "MagicWallpaper" */;
+ buildPhases = (
+ 3A1719FB1874D77800CF8D08 /* Sources */,
+ 3A1719FC1874D77800CF8D08 /* Frameworks */,
+ 3A1719FD1874D77800CF8D08 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = MagicWallpaper;
+ productName = MagicWallpaper;
+ productReference = 3A1719FF1874D77800CF8D08 /* MagicWallpaper.bundle */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 3A1719CA1874D75800CF8D08 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0500;
+ ORGANIZATIONNAME = Anton;
+ };
+ buildConfigurationList = 3A1719CD1874D75800CF8D08 /* Build configuration list for PBXProject "ProceduralWallpaper" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 3A1719C91874D75800CF8D08;
+ productRefGroup = 3A1719D31874D75800CF8D08 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 3A1719FE1874D77800CF8D08 /* MagicWallpaper */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 3A1719FD1874D77800CF8D08 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3A171A2018758E8600CF8D08 /* magic-wallpaper2@2x.png in Resources */,
+ 3A171A1F18758E8600CF8D08 /* magic-wallpaper1@2x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 3A1719FB1874D77800CF8D08 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3A171A0E1874D7D400CF8D08 /* MagicWallpaper.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 3A1719F31874D75800CF8D08 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 3A1719F41874D75800CF8D08 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 3A171A0A1874D77800CF8D08 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks";
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = MagicWallpaper/Prefix.pch;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ );
+ INFOPLIST_FILE = MagicWallpaper/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
+ MACOSX_DEPLOYMENT_TARGET = 10.9;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = bundle;
+ };
+ name = Debug;
+ };
+ 3A171A0B1874D77800CF8D08 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks";
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = MagicWallpaper/Prefix.pch;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ );
+ INFOPLIST_FILE = MagicWallpaper/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
+ MACOSX_DEPLOYMENT_TARGET = 10.9;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = bundle;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 3A1719CD1874D75800CF8D08 /* Build configuration list for PBXProject "ProceduralWallpaper" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3A1719F31874D75800CF8D08 /* Debug */,
+ 3A1719F41874D75800CF8D08 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 3A171A091874D77800CF8D08 /* Build configuration list for PBXNativeTarget "MagicWallpaper" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3A171A0A1874D77800CF8D08 /* Debug */,
+ 3A171A0B1874D77800CF8D08 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 3A1719CA1874D75800CF8D08 /* Project object */;
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2d421ba
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+ProceduralWallpaper
+===================
+
+A procedural wallpaper on iOS 7 consists of an instance conforming to the SBFProceduralWallpaper protocol, and a UIView to be presented on screen (they can be the same).
+
+The required methods are:
+
++ `+identifier`
++ `+colorChangesSignificantly`
++ `+presetWallpaperOptions`
++ `-setWallpaperOptions:`
++ `-setWallpaperVariant:`
++ `-view` (if you subclass SBFProceduralWallpaper, it returns itself for you)
++ `-delegate` and `-setDelegate:`
+
+All classes available in a bundle are specified in an array with the key `SBProceduralWallpaperClassNames` in the bundle's Info.plist file.
+
+
++presetWallpaperOptions and -setWallpaperOptions:
+--------------------------------------------------
+
+`+presetWallpaperOptions` should return an array of dictionaries, each representing one variant of the wallpaper. Each dictionary must, at least, contain an image name for the key `kSBUIMagicWallpaperThumbnailNameKey`.
+
+`-setWallpaperOptions:` will be called after the procedural wallpaper has been created, and will contain the selected option dictionary from the `+presetWallpaperOptions` array.
+
+
+Compiling and installing
+------------------------
+
+You need to have the header files for SpringBoardFoundation.framework and a jailbroken iPhone to build and install this wallpaper. The bundle should be copied to /System/Library/ProceduralWallpapers.
+
+
\ No newline at end of file
diff --git a/screenshot.png b/screenshot.png
new file mode 100644
index 0000000..5dcea41
Binary files /dev/null and b/screenshot.png differ