├── .gitignore ├── CPViewController.h ├── CPViewController.m ├── CPWindow.h ├── CPWindow.m ├── ConfirmPasteboard.plist ├── Makefile ├── README.md ├── Tweak.x ├── confirmpasteboard ├── CPPRootListController.h ├── CPPRootListController.m ├── Makefile ├── Resources │ ├── Info.plist │ ├── Root.plist │ ├── icon.png │ └── icon@2x.png └── layout │ └── Library │ └── PreferenceLoader │ └── Preferences │ └── ConfirmPasteboard.plist └── control /.gitignore: -------------------------------------------------------------------------------- 1 | .theos 2 | obj 3 | .DS_Store 4 | /*.xcodeproj 5 | /packages 6 | /TODO -------------------------------------------------------------------------------- /CPViewController.h: -------------------------------------------------------------------------------- 1 | @import UIKit; 2 | 3 | @interface CPViewController : UIViewController 4 | @property (nonatomic, strong) UIAlertController *alert; 5 | 6 | + (instancetype)sharedInstance; 7 | 8 | @end -------------------------------------------------------------------------------- /CPViewController.m: -------------------------------------------------------------------------------- 1 | #import "CPViewController.h" 2 | 3 | @implementation CPViewController 4 | + (instancetype)sharedInstance { 5 | static dispatch_once_t p = 0; 6 | __strong static id _sharedSelf = nil; 7 | dispatch_once(&p, ^{ 8 | _sharedSelf = [[self alloc] init]; 9 | }); 10 | return _sharedSelf; 11 | } 12 | 13 | - (BOOL)shouldAutorotate { 14 | return FALSE; 15 | } 16 | 17 | 18 | @end -------------------------------------------------------------------------------- /CPWindow.h: -------------------------------------------------------------------------------- 1 | @import UIKit; 2 | 3 | @interface CPWindow : UIWindow 4 | @property (nonatomic) BOOL touchInjection; 5 | + (instancetype)sharedInstance; 6 | - (id)init; 7 | @end -------------------------------------------------------------------------------- /CPWindow.m: -------------------------------------------------------------------------------- 1 | #include "CPWindow.h" 2 | #include "CPViewController.h" 3 | 4 | @interface UIWindowScene 5 | @end 6 | @interface UIWindow (iOS13) 7 | @property (nonatomic, assign) UIWindowScene *windowScene; 8 | @end 9 | @interface UIApplication (iOS13) 10 | -(NSSet *)connectedScenes; 11 | @end 12 | 13 | @implementation CPWindow 14 | 15 | - (instancetype)init { 16 | self = [super initWithFrame:[[UIScreen mainScreen] bounds]]; 17 | float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 18 | if(version >= 13) [self setWindowScene:[[[[UIApplication sharedApplication] connectedScenes] allObjects] firstObject]]; 19 | if (self != nil){ 20 | [self setHidden:NO]; 21 | [self setWindowLevel:UIWindowLevelAlert]; 22 | [self setBackgroundColor:[UIColor clearColor]]; 23 | [self setUserInteractionEnabled:YES]; 24 | [self setRootViewController:[CPViewController sharedInstance]]; 25 | } 26 | return self; 27 | } 28 | 29 | -(void)makeKeyAndVisible { 30 | [super makeKeyAndVisible]; 31 | return; 32 | } 33 | 34 | - (BOOL)shouldAutorotate { 35 | return FALSE; 36 | } 37 | 38 | -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 39 | UIView *hitTestResult = [super hitTest:point withEvent:event]; 40 | if (self.touchInjection == false) return nil; 41 | return hitTestResult; 42 | } 43 | 44 | + (instancetype)sharedInstance { 45 | static dispatch_once_t p = 0; 46 | __strong static id _sharedSelf = nil; 47 | dispatch_once(&p, ^{ 48 | _sharedSelf = [[self alloc] init]; 49 | }); 50 | return _sharedSelf; 51 | } 52 | 53 | @end -------------------------------------------------------------------------------- /ConfirmPasteboard.plist: -------------------------------------------------------------------------------- 1 | { Filter = { Bundles = ( "com.apple.UIKit" ); }; } 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TARGET = iphone:clang:12.2:12.2 2 | ARCHS = arm64 arm64e 3 | 4 | # INSTALL_TARGET_PROCESSES = SpringBoard 5 | 6 | 7 | include $(THEOS)/makefiles/common.mk 8 | 9 | TWEAK_NAME = ConfirmPasteboard 10 | 11 | ConfirmPasteboard_FILES = Tweak.x $(wildcard *.m) 12 | ConfirmPasteboard_CFLAGS = -fobjc-arc 13 | ConfirmPasteboard_LIBRARIES = mryipc 14 | 15 | include $(THEOS_MAKE_PATH)/tweak.mk 16 | SUBPROJECTS += confirmpasteboard 17 | include $(THEOS_MAKE_PATH)/aggregate.mk 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ConfirmPasteboard 2 | Hide your clipboard contents. 3 | 4 | ## Credit 5 | Idea from [NoPasteboard](https://github.com/pookjw/NoPasteboard) -------------------------------------------------------------------------------- /Tweak.x: -------------------------------------------------------------------------------- 1 | #import 2 | #import "CPWindow.h" 3 | #import "CPViewController.h" 4 | 5 | 6 | %group hooker 7 | 8 | BOOL isAllowed; 9 | BOOL isRequested; 10 | 11 | dispatch_semaphore_t sema; 12 | 13 | extern CFNotificationCenterRef CFNotificationCenterGetDistributedCenter(void); 14 | 15 | void updateStatus() { 16 | if(isRequested) return; 17 | isRequested = true; 18 | 19 | sema = dispatch_semaphore_create(0); 20 | 21 | NSDictionary *info = @{ 22 | @"bundleID": [NSBundle mainBundle].bundleIdentifier 23 | }; 24 | CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(), (__bridge CFStringRef)@"com.rpgfarm.confirmpasteboard.accessRequest", NULL, (__bridge CFDictionaryRef)info, YES); 25 | 26 | [[%c(NSDistributedNotificationCenter) defaultCenter] addObserverForName:[NSString stringWithFormat:@"com.rpgfarm.confirmpasteboard.%@.accessResult", [NSBundle mainBundle].bundleIdentifier] object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { 27 | NSDictionary *result = notification.userInfo; 28 | isAllowed = [result[@"allowed"] isEqual:@1]; 29 | dispatch_semaphore_signal(sema); 30 | }]; 31 | 32 | if (![NSThread isMainThread]) { 33 | dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 34 | } else { 35 | while (dispatch_semaphore_wait(sema, DISPATCH_TIME_NOW)) { 36 | [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]]; 37 | } 38 | } 39 | 40 | } 41 | 42 | %hook UIPasteboard 43 | - (NSArray *)itemProviders { 44 | updateStatus(); 45 | if (!isAllowed) { 46 | return nil; 47 | } else { 48 | return %orig; 49 | } 50 | } 51 | - (_Bool)hasColors { 52 | updateStatus(); 53 | if (!isAllowed) { 54 | return NO; 55 | } else { 56 | return %orig; 57 | } 58 | } 59 | - (_Bool)hasImages{ 60 | updateStatus(); 61 | if (!isAllowed) { 62 | return NO; 63 | } else { 64 | return %orig; 65 | } 66 | } 67 | - (_Bool)hasURLs{ 68 | updateStatus(); 69 | if (!isAllowed) { 70 | return NO; 71 | } else { 72 | return %orig; 73 | } 74 | } 75 | - (_Bool)hasStrings{ 76 | updateStatus(); 77 | if (!isAllowed) { 78 | return NO; 79 | } else { 80 | return %orig; 81 | } 82 | } 83 | - (NSArray *)colors { 84 | updateStatus(); 85 | if (!isAllowed) { 86 | return nil; 87 | } else { 88 | return %orig; 89 | } 90 | } 91 | - (NSArray *)images { 92 | updateStatus(); 93 | if (!isAllowed) { 94 | return nil; 95 | } else { 96 | return %orig; 97 | } 98 | } 99 | - (NSArray *)URLs { 100 | updateStatus(); 101 | if (!isAllowed) { 102 | return nil; 103 | } else { 104 | return %orig; 105 | } 106 | } 107 | - (NSArray *)strings { 108 | updateStatus(); 109 | if (!isAllowed) { 110 | return nil; 111 | } else { 112 | return %orig; 113 | } 114 | } 115 | - (UIColor *)color { 116 | updateStatus(); 117 | if (!isAllowed) { 118 | return nil; 119 | } else { 120 | return %orig; 121 | } 122 | } 123 | - (UIImage *)image { 124 | updateStatus(); 125 | if (!isAllowed) { 126 | return nil; 127 | } else { 128 | return %orig; 129 | } 130 | } 131 | - (NSURL *)URL { 132 | updateStatus(); 133 | if (!isAllowed) { 134 | return nil; 135 | } else { 136 | return %orig; 137 | } 138 | } 139 | - (NSString *)string { 140 | updateStatus(); 141 | if (!isAllowed) { 142 | return nil; 143 | } else { 144 | return %orig; 145 | } 146 | } 147 | 148 | - (id)dataForPasteboardType:(id)arg1 inItemSet:(id)arg2 { 149 | updateStatus(); 150 | if (!isAllowed) { 151 | return nil; 152 | } else { 153 | return %orig(arg1, arg2); 154 | } 155 | } 156 | - (id)dataForPasteboardType:(id)arg1 { 157 | updateStatus(); 158 | if (!isAllowed) { 159 | return nil; 160 | } else { 161 | return %orig(arg1); 162 | } 163 | } 164 | %end 165 | 166 | %hook _UIConcretePasteboard 167 | - (id)itemProviders { 168 | updateStatus(); 169 | if (!isAllowed) { 170 | return nil; 171 | } else { 172 | return %orig; 173 | } 174 | } 175 | - (_Bool)hasColors { 176 | updateStatus(); 177 | if (!isAllowed) { 178 | return NO; 179 | } else { 180 | return %orig; 181 | } 182 | } 183 | - (_Bool)hasImages{ 184 | updateStatus(); 185 | if (!isAllowed) { 186 | return NO; 187 | } else { 188 | return %orig; 189 | } 190 | } 191 | - (_Bool)hasURLs{ 192 | updateStatus(); 193 | if (!isAllowed) { 194 | return NO; 195 | } else { 196 | return %orig; 197 | } 198 | } 199 | - (_Bool)hasStrings{ 200 | updateStatus(); 201 | if (!isAllowed) { 202 | return NO; 203 | } else { 204 | return %orig; 205 | } 206 | } 207 | - (id)colors { 208 | updateStatus(); 209 | if (!isAllowed) { 210 | return nil; 211 | } else { 212 | return %orig; 213 | } 214 | } 215 | - (id)images { 216 | updateStatus(); 217 | if (!isAllowed) { 218 | return nil; 219 | } else { 220 | return %orig; 221 | } 222 | } 223 | - (id)URLs { 224 | updateStatus(); 225 | if (!isAllowed) { 226 | return nil; 227 | } else { 228 | return %orig; 229 | } 230 | } 231 | - (id)strings { 232 | updateStatus(); 233 | if (!isAllowed) { 234 | return nil; 235 | } else { 236 | return %orig; 237 | } 238 | } 239 | - (id)color { 240 | updateStatus(); 241 | if (!isAllowed) { 242 | return nil; 243 | } else { 244 | return %orig; 245 | } 246 | } 247 | - (id)image { 248 | updateStatus(); 249 | if (!isAllowed) { 250 | return nil; 251 | } else { 252 | return %orig; 253 | } 254 | } 255 | - (id)URL { 256 | updateStatus(); 257 | if (!isAllowed) { 258 | return nil; 259 | } else { 260 | return %orig; 261 | } 262 | } 263 | - (id)string { 264 | updateStatus(); 265 | if (!isAllowed) { 266 | return nil; 267 | } else { 268 | return %orig; 269 | } 270 | } 271 | - (id)items { 272 | updateStatus(); 273 | if (!isAllowed) { 274 | return nil; 275 | } else { 276 | return %orig; 277 | } 278 | } 279 | 280 | - (id)dataForPasteboardType:(id)arg1 inItemSet:(id)arg2 { 281 | updateStatus(); 282 | if (!isAllowed) { 283 | return nil; 284 | } else { 285 | return %orig(arg1, arg2); 286 | } 287 | } 288 | - (id)dataForPasteboardType:(id)arg1 { 289 | updateStatus(); 290 | if (!isAllowed) { 291 | return nil; 292 | } else { 293 | return %orig(arg1); 294 | } 295 | } 296 | %end 297 | 298 | 299 | %end 300 | 301 | NSMutableDictionary *prefs; 302 | 303 | @interface SBApplicationController 304 | +(id)sharedInstance; 305 | -(id)applicationWithBundleIdentifier:(id)arg1 ; 306 | @end 307 | 308 | %group SpringBoard 309 | void handleAccessRequest(CFNotificationCenterRef center, void * observer, CFStringRef name, const void * object, CFDictionaryRef userInfo); 310 | %hook SpringBoard 311 | -(void)applicationDidFinishLaunching:(id)application { 312 | %orig; 313 | CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(), NULL, handleAccessRequest, (__bridge CFStringRef)@"com.rpgfarm.confirmpasteboard.accessRequest", NULL, CFNotificationSuspensionBehaviorDeliverImmediately); 314 | } 315 | 316 | void response(BOOL allowed, NSString *bundleID) { 317 | [[objc_getClass("NSDistributedNotificationCenter") defaultCenter] postNotificationName:[NSString stringWithFormat:@"com.rpgfarm.confirmpasteboard.%@.accessResult", bundleID] object:nil userInfo:@{ 318 | @"allowed": @(allowed) 319 | }]; 320 | } 321 | 322 | #define PREF_PATH @"/var/mobile/Library/Preferences/com.rpgfarm.confirmpasteboardprefs.plist" 323 | 324 | void handleAccessRequest(CFNotificationCenterRef center, void * observer, CFStringRef name, const void * object, CFDictionaryRef userInfo) { 325 | NSDictionary* info = (__bridge NSDictionary*)userInfo; 326 | 327 | CPWindow *window = [CPWindow sharedInstance]; 328 | CPViewController *controller = [CPViewController sharedInstance]; 329 | 330 | UIAlertController *alert = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"%@ wants to access the clipboard.", [[[NSClassFromString(@"SBApplicationController") sharedInstance] applicationWithBundleIdentifier:info[@"bundleID"]] displayName]] message:@"Do you want to allow access to the clipboard?" preferredStyle:UIAlertControllerStyleAlert]; 331 | controller.alert = alert; 332 | 333 | [controller.alert addAction:[UIAlertAction actionWithTitle:@"Allow" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 334 | window.touchInjection = false; 335 | prefs[info[@"bundleID"]] = @1; 336 | [[prefs copy] writeToFile:PREF_PATH atomically:FALSE]; 337 | response(true, info[@"bundleID"]); 338 | }]]; 339 | 340 | [controller.alert addAction:[UIAlertAction actionWithTitle:@"Allow only this time" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 341 | window.touchInjection = false; 342 | response(true, info[@"bundleID"]); 343 | }]]; 344 | 345 | [controller.alert addAction:[UIAlertAction actionWithTitle:@"Deny" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 346 | window.touchInjection = false; 347 | response(false, info[@"bundleID"]); 348 | }]]; 349 | 350 | window.touchInjection = true; 351 | [controller presentViewController:controller.alert animated:YES completion:nil]; 352 | } 353 | %end 354 | 355 | %end 356 | 357 | void loadPrefs() { 358 | prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:PREF_PATH]; 359 | if(!prefs) prefs = [@{} mutableCopy]; 360 | } 361 | 362 | %ctor { 363 | NSString *identifier = [NSBundle mainBundle].bundleIdentifier; 364 | if([identifier isEqualToString:@"com.apple.springboard"]) { 365 | %init(SpringBoard); 366 | CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)loadPrefs, CFSTR("com.rpgfarm.confirmpasteboard/settingsupdate"), NULL, CFNotificationSuspensionBehaviorCoalesce); 367 | loadPrefs(); 368 | return; 369 | } 370 | if([identifier hasPrefix:@"com.apple."]) return; 371 | 372 | CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)loadPrefs, CFSTR("com.rpgfarm.confirmpasteboard/settingsupdate"), NULL, CFNotificationSuspensionBehaviorCoalesce); 373 | loadPrefs(); 374 | 375 | if(prefs[@"enable"] && [prefs[@"enable"] isEqual:@0]) return; 376 | if(prefs[identifier] && [prefs[identifier] isEqual:@1]) return; 377 | %init(hooker); 378 | isAllowed = false; 379 | } -------------------------------------------------------------------------------- /confirmpasteboard/CPPRootListController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface CPPRootListController : PSListController 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /confirmpasteboard/CPPRootListController.m: -------------------------------------------------------------------------------- 1 | #include "CPPRootListController.h" 2 | #import 3 | 4 | #define PREFERENCE_IDENTIFIER @"/var/mobile/Library/Preferences/com.rpgfarm.confirmpasteboardprefs.plist" 5 | 6 | static NSInteger DictionaryTextComparator(id a, id b, void *context) { 7 | return [[(__bridge NSDictionary *)context objectForKey:a] localizedCaseInsensitiveCompare:[(__bridge NSDictionary *)context objectForKey:b]]; 8 | } 9 | 10 | NSMutableDictionary *prefs; 11 | 12 | @implementation CPPRootListController 13 | 14 | - (NSArray *)specifiers { 15 | if (!_specifiers) { 16 | [self getPreference]; 17 | 18 | NSMutableArray *specifiers = [[NSMutableArray alloc] init]; 19 | [specifiers addObject:({ 20 | PSSpecifier *specifier = [PSSpecifier preferenceSpecifierNamed:@"Credits" target:self set:nil get:nil detail:nil cell:PSGroupCell edit:nil]; 21 | specifier; 22 | })]; 23 | [specifiers addObject:({ 24 | PSSpecifier *specifier = [PSSpecifier preferenceSpecifierNamed:@"@BawAppie (Developer)" target:self set:nil get:nil detail:nil cell:PSButtonCell edit:nil]; 25 | [specifier setIdentifier:@"BawAppie"]; 26 | specifier->action = @selector(openCredits:); 27 | specifier; 28 | })]; 29 | 30 | [specifiers addObject:[PSSpecifier preferenceSpecifierNamed:@"ConfirmPasteboard" target:self set:nil get:nil detail:nil cell:PSGroupCell edit:nil]]; 31 | 32 | [specifiers addObject:({ 33 | PSSpecifier *specifier = [PSSpecifier preferenceSpecifierNamed:@"Enable" target:self set:@selector(setSwitch:forSpecifier:) get:@selector(getSwitch:) detail:nil cell:PSSwitchCell edit:nil]; 34 | [specifier.properties setValue:@"enable" forKey:@"displayIdentifier"]; 35 | specifier; 36 | })]; 37 | 38 | [specifiers addObject:[PSSpecifier preferenceSpecifierNamed:@"Installed Applications" target:self set:nil get:nil detail:nil cell:PSGroupCell edit:nil]]; 39 | 40 | ALApplicationList *applicationList = [ALApplicationList sharedApplicationList]; 41 | NSDictionary *applications = [applicationList applicationsFilteredUsingPredicate:[NSPredicate predicateWithFormat:@"!(bundleIdentifier BEGINSWITH[c] %@)", @"com.apple."]]; 42 | NSMutableArray *displayIdentifiers = [[applications allKeys] mutableCopy]; 43 | 44 | [displayIdentifiers sortUsingFunction:DictionaryTextComparator context:(__bridge void *)applications]; 45 | 46 | for (NSString *displayIdentifier in displayIdentifiers) { 47 | PSSpecifier *specifier = [PSSpecifier preferenceSpecifierNamed:applications[displayIdentifier] target:self set:@selector(setSwitch:forSpecifier:) get:@selector(getSwitch:) detail:nil cell:PSSwitchCell edit:nil]; 48 | [specifier.properties setValue:displayIdentifier forKey:@"displayIdentifier"]; 49 | 50 | UIImage *icon = [applicationList iconOfSize:ALApplicationIconSizeSmall forDisplayIdentifier:displayIdentifier]; 51 | if (icon) [specifier setProperty:icon forKey:@"iconImage"]; 52 | 53 | [specifiers addObject:specifier]; 54 | } 55 | 56 | 57 | _specifiers = [specifiers copy]; 58 | 59 | } 60 | 61 | 62 | return _specifiers; 63 | } 64 | 65 | -(void)setSwitch:(NSNumber *)value forSpecifier:(PSSpecifier *)specifier { 66 | prefs[[specifier propertyForKey:@"displayIdentifier"]] = [NSNumber numberWithBool:[value boolValue]]; 67 | [[prefs copy] writeToFile:PREFERENCE_IDENTIFIER atomically:FALSE]; 68 | CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.rpgfarm.confirmpasteboard/settingsupdate"), NULL, NULL, true); 69 | // HBLogDebug(@"setSwitch %@, %@, %@", value, [specifier propertyForKey:@"displayIdentifier"], prefs); 70 | } 71 | -(NSNumber *)getSwitch:(PSSpecifier *)specifier { 72 | // HBLogDebug(@"getSwitch %@", prefs); 73 | if(!prefs[[specifier propertyForKey:@"displayIdentifier"]] && [[specifier propertyForKey:@"displayIdentifier"] isEqualToString:@"enable"]) return @1; 74 | return [prefs[[specifier propertyForKey:@"displayIdentifier"]] isEqual:@1] ? @1 : @0; 75 | } 76 | 77 | -(void)getPreference { 78 | if(![[NSFileManager defaultManager] fileExistsAtPath:PREFERENCE_IDENTIFIER]) prefs = [[NSMutableDictionary alloc] init]; 79 | else prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:PREFERENCE_IDENTIFIER]; 80 | } 81 | 82 | 83 | @end 84 | -------------------------------------------------------------------------------- /confirmpasteboard/Makefile: -------------------------------------------------------------------------------- 1 | TARGET = iphone:clang:12.2:12.2 2 | ARCHS = arm64 arm64e 3 | 4 | include $(THEOS)/makefiles/common.mk 5 | 6 | BUNDLE_NAME = ConfirmPasteboard 7 | 8 | ConfirmPasteboard_FILES = CPPRootListController.m 9 | ConfirmPasteboard_FRAMEWORKS = UIKit 10 | ConfirmPasteboard_PRIVATE_FRAMEWORKS = Preferences 11 | ConfirmPasteboard_INSTALL_PATH = /Library/PreferenceBundles 12 | ConfirmPasteboard_CFLAGS = -fobjc-arc 13 | ConfirmPasteboard_LIBRARIES = applist 14 | 15 | include $(THEOS_MAKE_PATH)/bundle.mk 16 | -------------------------------------------------------------------------------- /confirmpasteboard/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ConfirmPasteboard 9 | CFBundleIdentifier 10 | comr.rpgfarm.confirmpasteboard 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1.0 21 | NSPrincipalClass 22 | CPPRootListController 23 | 24 | 25 | -------------------------------------------------------------------------------- /confirmpasteboard/Resources/Root.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | items 6 | 7 | 8 | cell 9 | PSGroupCell 10 | label 11 | ConfirmPasteboard First Page 12 | 13 | 14 | cell 15 | PSSwitchCell 16 | default 17 | 18 | defaults 19 | comr.rpgfarm.confirmpasteboard 20 | key 21 | AwesomeSwitch1 22 | label 23 | Awesome Switch 1 24 | 25 | 26 | title 27 | ConfirmPasteboard 28 | 29 | 30 | -------------------------------------------------------------------------------- /confirmpasteboard/Resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baw-Appie/ConfirmPasteboard/ee30df80ddaa9c629b42b2b55d096592b2b4ff35/confirmpasteboard/Resources/icon.png -------------------------------------------------------------------------------- /confirmpasteboard/Resources/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baw-Appie/ConfirmPasteboard/ee30df80ddaa9c629b42b2b55d096592b2b4ff35/confirmpasteboard/Resources/icon@2x.png -------------------------------------------------------------------------------- /confirmpasteboard/layout/Library/PreferenceLoader/Preferences/ConfirmPasteboard.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | entry 6 | 7 | bundle 8 | ConfirmPasteboard 9 | cell 10 | PSLinkCell 11 | detail 12 | CPPRootListController 13 | icon 14 | icon.png 15 | isController 16 | 17 | label 18 | ConfirmPasteboard 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /control: -------------------------------------------------------------------------------- 1 | Package: com.rpgfarm.confirmpasteboard 2 | Name: ConfirmPasteboard 3 | Version: 1.0 4 | Architecture: iphoneos-arm 5 | Description: An awesome MobileSubstrate tweak! 6 | Maintainer: Baw Appie 7 | Author: Baw Appie 8 | Section: Tweaks 9 | Depends: mobilesubstrate (>= 0.9.5000), applist 10 | --------------------------------------------------------------------------------