User:Uroboro

641 editsJoined 4 March 2013
Revision as of 19:29, 26 June 2014 by Uroboro (talk | contribs) (Missed (CFStringRef) casts and added StackOverflow link)

Find me on saurik's IRC server, on Twitter, on Reddit, on Github, StackOverflow.

Made UnlockEvents and FlipNC.

If you are looking for notifications within a process, give NotificationExplorer a look.

How 2 prefs

As opposed to using NSDictionaries and [NSHomeDirectory() stringByAppendingFormat:@"/Library/Preferences/%s.plist", "com.your.tweak"], here's another alternative to handling preferences on tweaks.

Tweak.xm

@interface NSUserDefaults (Tweak_Category)
- (id)objectForKey:(NSString *)key inDomain:(NSString *)domain;
- (void)setObject:(id)value forKey:(NSString *)key inDomain:(NSString *)domain;
@end

static NSString const *nsDomainString = @"com.your.tweak";
static NSString const *nsNotificationString = @"com.your.tweak/preferences.changed";
static BOOL enabled;

static void notificationCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
NSNumber *n = (NSNumber *)[[NSUserDefaults standardUserDefaults] objectForKey:@"enabled" inDomain:nsDomainString];
enabled = (n)? [n boolValue]:YES;
}

%ctor {
// Set variables on start up
notificationCallback(NULL, NULL, NULL, NULL, NULL);

// Register for 'PostNotification' notifications
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, notificationCallback, (CFStringRef)nsNotificationString, NULL, CFNotificationSuspensionBehaviorCoalesce);

// Add any personal initializations
}

/*
 * From here onward, write your tweak.
 * To make your tweak actually do stuff when enabled:
if (!enabled) {
     // Do the original algorithm, either by calling:
     // %orig(); //if using logos for methods
     // _functionName(args); //if using MSHook() for functions
} else {
    ...
    // Optionally, do the original algorithm
}
 */

Preference plist

Choose any of the following:

Reduced style

Provides a switch on the root section of the preferences (like Airplane Mode). Recommended for configuration-less tweaks.

Saved in your tweak's folder as layout/Library/PreferenceLoader/Preferences/com.your.tweak.plist

{
    entry = {
        cell = PSSwitchCell;
        label = "Your Tweak";
        defaults = "com.your.tweak";
        default = 1;
        icon = "/Applications/Preferences.app/[email protected]";
        PostNotification = "com.your.tweak/preferences.changed";
    };
}

Extended Style

Provides a pane where other cells can appear (like Wi-Fi). Recommended for configuration-friendly tweaks.

Saved in your tweak's folder as layout/Library/PreferenceLoader/Preferences/com.your.tweak.plist

{
    title = "Your Tweak";
    entry = {
        cell = PSLinkCell;
        label = "Your Tweak";
        icon = "/Applications/Preferences.app/[email protected]";
    };
    items = (
        {
            cell = PSSwitchCell;
            defaults = "com.your.tweak";
            label = Enabled;
            key = enabled;
            default = 1;
            PostNotification = "com.your.tweak/preferences.changed";
        }
        // add more cells (dictionaries) here
    );
}

PreferenceLoader Style

Provides a static list of cells. Recommended for Preference Bundles of tweaks.

Saved in your tweak's Preference Bundle subproject folder as Resources/com.your.tweak.plist

{
    items = (
        {
            cell = PSSwitchCell;
            defaults = "com.your.tweak";
            label = Enabled;
            key = enabled;
            default = 1;
            PostNotification = "com.your.tweak/preferences.changed";
        }
        // add more cells (dictionaries) here
    );
}

Flipswitches

After using the Flipswitch NIC template, modify accordingly

Switch.x

#import "FSSwitchDataSource.h"
#import "FSSwitchPanel.h"

@interface NSUserDefaults (Tweak_Category)
- (id)objectForKey:(NSString *)key inDomain:(NSString *)domain;
- (void)setObject:(id)value forKey:(NSString *)key inDomain:(NSString *)domain;
@end

static NSString const *nsDomainString = @"com.your.tweak";
static NSString const *nsNotificationString = @"com.your.tweak/preferences.changed";

@interface YourTweakFlipswitchSwitch : NSObject <FSSwitchDataSource>
@end

@implementation YourTweakFlipswitchSwitch

- (NSString *)titleForSwitchIdentifier:(NSString *)switchIdentifier {
    return @"Your Tweak";
}

- (FSSwitchState)stateForSwitchIdentifier:(NSString *)switchIdentifier {
    NSNumber *n = (NSNumber *)[[NSUserDefaults standardUserDefaults] objectForKey:@"enabled" inDomain:nsDomainString];
    BOOL enabled = (n)? [n boolValue]:YES;
    return (enabled) ? FSSwitchStateOn : FSSwitchStateOff;
}

- (void)applyState:(FSSwitchState)newState forSwitchIdentifier:(NSString *)switchIdentifier {
    switch (newState) {
    case FSSwitchStateIndeterminate:
        break;
    case FSSwitchStateOn:
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"enabled" inDomain:nsDomainString];
        CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), (CFStringRef)nsNotificationString, NULL, NULL, YES);
        break;
    case FSSwitchStateOff:
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@"enabled" inDomain:nsDomainString];
        CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), (CFStringRef)nsNotificationString, NULL, NULL, YES);
        break;
    }
    return;
}

@end

Other Stuff

Similar Wanted Pages:

Inheritance hierarchy‏‎ MIG Subsystems
ApplicationScripting.framework/Inheritance hierarchy‏‎ ApplicationScripting.framework/MIG subsystem‏
AppSupport.framework/MIG subsystem
AudioToolbox.framework/Inheritance hierarchy ‏AudioToolbox.framework/MIG subsystem
AVFoundation.framework/Inheritance hierarchy‏ AVFoundation.framework/MIG subsystem
BackBoardServices.framework/Inheritance hierarchy‏ BackBoardServices.framework/MIG subsystem‏‎
‏BulletinBoard.framework/Inheritance hierarchy‏ ‏BulletinBoard.framework/MIG subsystem
ChatKit.framework/MIG subsystem‏
CoreTelephony.framework/Inheritance hierarchy‏‎ CoreFoundation.framework/MIG subsystem
CoreTelephony.framework/MIG subsystem
‏Foundation.framework/MIG subsystem
GraphicsServices.framework/Inheritance hierarchy‏‎ GraphicsServices.framework/MIG subsystem
IH boilerplate/Inheritance hierarchy‏‎ IH boilerplate/MIG subsystem‏‎
IOKit.framework/Inheritance hierarchy‏‎ IOKit.framework/MIG subsystem
IOSurface.framework/Inheritance hierarchy ‏IOSurface.framework/MIG subsystem
MapKit.framework/Inheritance hierarchy MapKit.framework/MIG subsystem
‏Message.framework/MIG subsystem
Preferences.app/Inheritance hierarchy‏ ‏Preferences.app/MIG subsystem
Preferences.framework/MIG subsystem
SpringBoardServices.framework/Inheritance hierarchy‏
TelephonyUI.framework/Inheritance hierarchy TelephonyUI.framework/MIG subsystem
WiFiPicker.servicebundle/Inheritance hierarchy ‏WiFiPicker.servicebundle/MIG subsystem‏