From 217e22f0f4f84e74a3649d5e292c283b0c468b7f Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Sat, 4 Mar 2017 20:18:40 -0800 Subject: Move some code of Window/TabBarController to Cyte. --- CyteKit/CyteKit.h | 1 + CyteKit/TabBarController.h | 4 +-- CyteKit/TabBarController.mm | 33 +++++++++++++++++--- CyteKit/ViewController.h | 1 + CyteKit/ViewController.mm | 7 +++++ CyteKit/Window.h | 33 ++++++++++++++++++++ CyteKit/Window.mm | 49 +++++++++++++++++++++++++++++ MobileCydia.mm | 76 ++++++++++++--------------------------------- 8 files changed, 141 insertions(+), 63 deletions(-) create mode 100644 CyteKit/Window.h create mode 100644 CyteKit/Window.mm diff --git a/CyteKit/CyteKit.h b/CyteKit/CyteKit.h index c25bc3f..53cef3c 100644 --- a/CyteKit/CyteKit.h +++ b/CyteKit/CyteKit.h @@ -29,6 +29,7 @@ #include "CyteKit/URLCache.h" #include "CyteKit/WebViewController.h" #include "CyteKit/WebViewTableViewCell.h" +#include "CyteKit/Window.h" #include "CyteKit/countByEnumeratingWithState.h" #include "CyteKit/extern.h" diff --git a/CyteKit/TabBarController.h b/CyteKit/TabBarController.h index 2aa403c..220609c 100644 --- a/CyteKit/TabBarController.h +++ b/CyteKit/TabBarController.h @@ -26,12 +26,10 @@ #include -@interface UITabBarController (Cydia) -@end - @interface CyteTabBarController : UITabBarController - (NSArray *) navigationURLCollection; +- (void) addViewControllers:(id)no, ...; - (UIViewController *) unselectedViewController; - (void) setUnselectedViewController:(UIViewController *)transient; diff --git a/CyteKit/TabBarController.mm b/CyteKit/TabBarController.mm index 35a2bd0..a6cd088 100644 --- a/CyteKit/TabBarController.mm +++ b/CyteKit/TabBarController.mm @@ -26,10 +26,6 @@ #include "iPhonePrivate.h" #include -@implementation UITabBarController (Cydia) - -@end - @implementation CyteTabBarController { _transient UIViewController *transient_; _H remembered_; @@ -48,6 +44,35 @@ return items; } +- (void) addViewControllers:(id)no, ... { + va_list args; + va_start(args, no); + + NSMutableArray *controllers([NSMutableArray array]); + + for (;;) { + auto title(va_arg(args, NSString *)); + if (title == nil) + break; + + UINavigationController *controller([[[UINavigationController alloc] init] autorelease]); + [controllers addObject:controller]; + + auto legacy(va_arg(args, NSString *)); + auto normal(va_arg(args, NSString *)); + auto select(va_arg(args, NSString *)); + + if (kCFCoreFoundationVersionNumber < 800) + [controller setTabBarItem:[[[UITabBarItem alloc] initWithTitle:title image:[UIImage imageNamed:legacy] tag:0] autorelease]]; + else + [controller setTabBarItem:[[[UITabBarItem alloc] initWithTitle:title image:[UIImage imageNamed:normal] selectedImage:[UIImage imageNamed:select]] autorelease]]; + } + + va_end(args); + + [self setViewControllers:controllers]; +} + - (void) didReceiveMemoryWarning { [super didReceiveMemoryWarning]; diff --git a/CyteKit/ViewController.h b/CyteKit/ViewController.h index 156f3cb..da4a33b 100644 --- a/CyteKit/ViewController.h +++ b/CyteKit/ViewController.h @@ -36,6 +36,7 @@ - (void) unloadData; - (UIViewController *) parentOrPresentingViewController; +- (UIViewController *) rootViewController; // This URL is used to save the state of the view controller. Return // nil if you cannot or should not save the URL for this page. diff --git a/CyteKit/ViewController.mm b/CyteKit/ViewController.mm index 28c7c43..41e7ea9 100644 --- a/CyteKit/ViewController.mm +++ b/CyteKit/ViewController.mm @@ -52,6 +52,13 @@ return nil; } +- (UIViewController *) rootViewController { + UIViewController *base(self); + while ([base parentOrPresentingViewController] != nil) + base = [base parentOrPresentingViewController]; + return base; +} + - (NSURL *) navigationURL { return nil; } diff --git a/CyteKit/Window.h b/CyteKit/Window.h new file mode 100644 index 0000000..c7224f7 --- /dev/null +++ b/CyteKit/Window.h @@ -0,0 +1,33 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#ifndef CyteKit_Window_H +#define CyteKit_Window_H + +#include + +@interface CyteWindow : UIWindow + +- (void) unloadData; + +@end + +#endif//CyteKit_Window_H diff --git a/CyteKit/Window.mm b/CyteKit/Window.mm new file mode 100644 index 0000000..4746e7c --- /dev/null +++ b/CyteKit/Window.mm @@ -0,0 +1,49 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#include "CyteKit/UCPlatform.h" + +#include "CyteKit/ViewController.h" +#include "CyteKit/Window.h" + +#include "iPhonePrivate.h" +#include + +@implementation CyteWindow { + _transient UIViewController *root_; +} + +- (void) setRootViewController:(UIViewController *)controller { + if ([super respondsToSelector:@selector(setRootViewController:)]) + [super setRootViewController:controller]; + else { + [self addSubview:[controller view]]; + [[root_ view] removeFromSuperview]; + } + + root_ = controller; +} + +- (void) unloadData { + [root_ unloadData]; +} + +@end diff --git a/MobileCydia.mm b/MobileCydia.mm index 2842f07..99b2b57 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -4593,7 +4593,7 @@ static _H Diversions_; } - (void) unload { - [delegate_ performSelectorOnMainThread:@selector(unloadData) withObject:nil waitUntilDone:NO]; + [[indirect_ rootViewController] performSelectorOnMainThread:@selector(unloadData) withObject:nil waitUntilDone:NO]; } - (void) setScrollAlwaysBounceVertical:(NSNumber *)value { @@ -6526,9 +6526,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [self getKeyboardCurve:&curve duration:&duration forNotification:notification]; CGRect kbframe = CGRectMake(Retina(center.x - bounds.size.width / 2), Retina(center.y - bounds.size.height / 2), bounds.size.width, bounds.size.height); - UIViewController *base = self; - while ([base parentOrPresentingViewController] != nil) - base = [base parentOrPresentingViewController]; + UIViewController *base([self rootViewController]); CGRect viewframe = [[base view] convertRect:[list_ frame] fromView:[list_ superview]]; CGRect intersection = CGRectIntersection(viewframe, kbframe); @@ -8823,7 +8821,7 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi DatabaseDelegate, CydiaDelegate > { - _H window_; + _H window_; _H tabbar_; _H emulated_; _H appcache_; @@ -8958,13 +8956,9 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi return [controllers objectAtIndex:3]; } -- (void) unloadData { - [tabbar_ unloadData]; -} - - (void) _updateData { [self _saveConfig]; - [self unloadData]; + [window_ unloadData]; UINavigationController *navigation = [self queueNavigationController]; @@ -9083,14 +9077,9 @@ _end if (emulated_ == nil) return; - if ([window_ respondsToSelector:@selector(setRootViewController:)]) - [window_ setRootViewController:tabbar_]; - else { - [window_ addSubview:[tabbar_ view]]; - [[emulated_ view] removeFromSuperview]; - } - + [window_ setRootViewController:tabbar_]; emulated_ = nil; + [window_ setUserInteractionEnabled:YES]; } @@ -9684,39 +9673,6 @@ _end [self reloadSpringBoard]; } -- (void) setupViewControllers { - tabbar_ = [[[CydiaTabBarController alloc] initWithDatabase:database_] autorelease]; - - NSMutableArray *items; - if (kCFCoreFoundationVersionNumber < 800) { - items = [NSMutableArray arrayWithObjects: - [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage imageNamed:@"home.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage imageNamed:@"install.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage imageNamed:@"changes.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage imageNamed:@"manage.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage imageNamed:@"search.png"] tag:0] autorelease], - nil]; - } else { - items = [NSMutableArray arrayWithObjects: - [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage imageNamed:@"home7.png"] selectedImage:[UIImage imageNamed:@"home7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage imageNamed:@"install7.png"] selectedImage:[UIImage imageNamed:@"install7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage imageNamed:@"changes7.png"] selectedImage:[UIImage imageNamed:@"changes7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage imageNamed:@"manage7.png"] selectedImage:[UIImage imageNamed:@"manage7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage imageNamed:@"search7.png"] selectedImage:[UIImage imageNamed:@"search7s.png"]] autorelease], - nil]; - } - - NSMutableArray *controllers([NSMutableArray array]); - for (UITabBarItem *item in items) { - UINavigationController *controller([[[UINavigationController alloc] init] autorelease]); - [controller setTabBarItem:item]; - [controllers addObject:controller]; - } - [tabbar_ setViewControllers:controllers]; - - [tabbar_ setUpdateDelegate:self]; -} - - (void) applicationDidFinishLaunching:(id)unused { [super applicationDidFinishLaunching:unused]; _trace(); @@ -9746,7 +9702,7 @@ _trace(); appcache_ = [[[AppCacheController alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/appcache/", UI_]]] autorelease]; [appcache_ reloadData]; - window_ = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; + window_ = [[[CyteWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; [window_ orderFront:self]; [window_ makeKey:self]; [window_ setHidden:NO]; @@ -9793,7 +9749,18 @@ _trace(); [database_ setDelegate:self]; [window_ setUserInteractionEnabled:NO]; - [self setupViewControllers]; + + tabbar_ = [[[CydiaTabBarController alloc] initWithDatabase:database_] autorelease]; + + [tabbar_ addViewControllers:nil, + @"Cydia", @"home.png", @"home7.png", @"home7s.png", + UCLocalize("SOURCES"), @"install.png", @"install7.png", @"install7s.png", + UCLocalize("CHANGES"), @"changes.png", @"changes7.png", @"changes7s.png", + UCLocalize("INSTALLED"), @"manage.png", @"manage7.png", @"manage7s.png", + UCLocalize("SEARCH"), @"search.png", @"search7.png", @"search7s.png", + nil]; + + [tabbar_ setUpdateDelegate:self]; CydiaLoadingViewController *loading([[[CydiaLoadingViewController alloc] init] autorelease]); UINavigationController *navigation([[[UINavigationController alloc] init] autorelease]); @@ -9806,10 +9773,7 @@ _trace(); if ([emulated_ respondsToSelector:@selector(concealTabBarSelection)]) [emulated_ concealTabBarSelection]; - if ([window_ respondsToSelector:@selector(setRootViewController:)]) - [window_ setRootViewController:emulated_]; - else - [window_ addSubview:[emulated_ view]]; + [window_ setRootViewController:emulated_]; [self performSelector:@selector(loadData) withObject:nil afterDelay:0]; _trace(); -- cgit v1.2.3