X-Git-Url: https://git.saurik.com/winterboard.git/blobdiff_plain/26c43b47c1020faa78c7ce6559c9d1f8319b7007..2d788a8c0ec6ab9e3392e772f61a66f8d6ff689c:/Application.mm diff --git a/Application.mm b/Application.mm index a7c72ad..4bfef61 100644 --- a/Application.mm +++ b/Application.mm @@ -1,5 +1,5 @@ /* WinterBoard - Theme Manager for the iPhone - * Copyright (C) 2008 Jay Freeman (saurik) + * Copyright (C) 2008-2009 Jay Freeman (saurik) */ /* @@ -39,76 +39,150 @@ #import #import -#define _trace() NSLog(@"_trace(%u)", __LINE__); +#include -@interface WBApplication : UIApplication < - UITableViewDataSource, - UITableViewDelegate -> { - UIWindow *window_; - UITableView *themesTable_; - NSMutableArray *themesArray_; -} +#import +#import +#import +#import + +static NSBundle *wbSettingsBundle; +static Class $WBSettingsController; +@interface UIApplication (Private) +- (void) terminateWithSuccess; @end -@implementation WBApplication +@interface UIDevice (Private) +- (BOOL) isWildcat; +@end -- (void) dealloc { - [window_ release]; - [themesTable_ release]; - [themesArray_ release]; - [super dealloc]; +@interface PSRootController (Compatibility) +- (id) _popController; // < 3.2 +- (id) contentView; // < 3.2 +- (id) lastController; // < 3.2 +- (id) topViewController; // >= 3.2 +@end + +@interface PSListController (Compatibility) +- (void) viewWillBecomeVisible:(void *)specifier; // < 3.2 +- (void) viewWillAppear:(BOOL)a; // >= 3.2 +- (void) setSpecifier:(PSSpecifier *)spec; // >= 3.2 +@end + +@interface WBRootController : PSRootController { + PSListController *_rootListController; } -- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero] autorelease]; - cell.text = [themesArray_ objectAtIndex:[indexPath row]]; - return cell; +@property (readonly) PSListController *rootListController; + +- (void) setupRootListForSize:(CGSize)size; +- (id) topViewController; +@end + +@implementation WBRootController + +@synthesize rootListController = _rootListController; + +// < 3.2 +- (void) setupRootListForSize:(CGSize)size { + PSSpecifier *spec([[PSSpecifier alloc] init]); + [spec setTarget:self]; + spec.name = @"WinterBoard"; + + _rootListController = [[$WBSettingsController alloc] initForContentSize:size]; + _rootListController.rootController = self; + _rootListController.parentController = self; + [_rootListController viewWillBecomeVisible:spec]; + + [spec release]; + + [self pushController:_rootListController]; } -- (NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section { - return [themesArray_ count]; +// >= 3.2 +- (void) loadView { + [super loadView]; + [self pushViewController:[self rootListController] animated:NO]; } -- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *theme = [themesArray_ objectAtIndex:[indexPath row]]; +- (PSListController *) rootListController { + if(!_rootListController) { + PSSpecifier *spec([[PSSpecifier alloc] init]); + [spec setTarget:self]; + spec.name = @"WinterBoard"; + _rootListController = [[$WBSettingsController alloc] initForContentSize:CGSizeZero]; + _rootListController.rootController = self; + _rootListController.parentController = self; + [_rootListController setSpecifier:spec]; + [spec release]; + } + return _rootListController; +} - [[NSDictionary dictionaryWithObjectsAndKeys: - theme, @"Theme", - nil] writeToFile:[NSString stringWithFormat:@"%@/Library/Preferences/com.saurik.WinterBoard.plist", - NSHomeDirectory() - ] atomically:YES]; +- (id) contentView { + if ([[PSRootController class] instancesRespondToSelector:@selector(contentView)]) { + return [super contentView]; + } else { + return [super view]; + } +} - if (fork() == 0) { - execlp("killall", "killall", "SpringBoard", NULL); - exit(0); +- (id) topViewController { + if ([[PSRootController class] instancesRespondToSelector:@selector(topViewController)]) { + return [super topViewController]; + } else { + return [super lastController]; } } -- (void) applicationDidFinishLaunching:(id)unused { - window_ = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; - [window_ makeKeyAndVisible]; +- (void) _popController { + // Pop the last controller = exit the application. + // The only time the last controller should pop is when the user taps Respring/Cancel. + // Which only gets displayed if the user has made changes. + if ([self topViewController] == _rootListController) + [[UIApplication sharedApplication] terminateWithSuccess]; + [super _popController]; +} - themesArray_ = [[NSMutableArray arrayWithCapacity:32] retain]; - NSFileManager *manager = [NSFileManager defaultManager]; +@end - [themesArray_ addObjectsFromArray:[manager contentsOfDirectoryAtPath:@"/Library/Themes" error:NULL]]; - [themesArray_ addObjectsFromArray:[manager contentsOfDirectoryAtPath:[NSString stringWithFormat:@"%@/Library/SummerBoard/Themes", NSHomeDirectory()] error:NULL]]; +@interface WBApplication : UIApplication { + WBRootController *_rootController; +} - themesTable_ = [[UITableView alloc] initWithFrame:window_.bounds]; - [window_ addSubview:themesTable_]; +@end - [themesTable_ setDataSource:self]; - [themesTable_ setDelegate:self]; +@implementation WBApplication + +- (void) dealloc { + [_rootController release]; + [super dealloc]; +} + +- (void) applicationWillTerminate:(UIApplication *)application { + [_rootController.rootListController suspend]; +} - [themesTable_ setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine]; +- (void) applicationDidFinishLaunching:(id)unused { + wbSettingsBundle = [NSBundle bundleWithPath:@"/System/Library/PreferenceBundles/WinterBoardSettings.bundle"]; + [wbSettingsBundle load]; + $WBSettingsController = [wbSettingsBundle principalClass]; + + CGRect applicationFrame(([UIDevice instancesRespondToSelector:@selector(isWildcat)] + && [[UIDevice currentDevice] isWildcat]) || objc_getClass("UIStatusBar") != nil + ? [UIScreen mainScreen].bounds + : [UIScreen mainScreen].applicationFrame); + UIWindow *window([[UIWindow alloc] initWithFrame:applicationFrame]); + _rootController = [[WBRootController alloc] initWithTitle:@"WinterBoard" identifier:[[NSBundle mainBundle] bundleIdentifier]]; + [window addSubview:[_rootController contentView]]; + [window makeKeyAndVisible]; } @end int main(int argc, char *argv[]) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSAutoreleasePool *pool( [[NSAutoreleasePool alloc] init]); int value = UIApplicationMain(argc, argv, @"WBApplication", @"WBApplication");