X-Git-Url: https://git.saurik.com/winterboard.git/blobdiff_plain/cc11d828788cfea2fb2f63c52695af3252b5cc1d..7cee32a17a5ead84325a89f4c04a83c0e43914d8:/Library.mm diff --git a/Library.mm b/Library.mm index c0b7284..7b5a2b0 100644 --- a/Library.mm +++ b/Library.mm @@ -107,6 +107,10 @@ bool _itv; extern "C" void __clear_cache (char *beg, char *end); +static void (*$objc_setAssociatedObject)(id object, void *key, id value, objc_AssociationPolicy policy); +static id (*$objc_getAssociatedObject)(id object, void *key); +static void (*$objc_removeAssociatedObjects)(id object); + @protocol WinterBoard - (void *) _node; @end @@ -121,6 +125,8 @@ MSClassHook(UIImage) MSMetaClassHook(UIImage) MSClassHook(UINavigationBar) MSClassHook(UIToolbar) +MSClassHook(UIStatusBarTimeItemView) +MSClassHook(UIWebDocumentView) MSClassHook(CKBalloonView) MSClassHook(CKMessageCell) @@ -139,12 +145,21 @@ MSClassHook(SBCalendarApplicationIcon) MSClassHook(SBCalendarIconContentsView) MSClassHook(SBDockIconListView) MSClassHook(SBIcon) +MSClassHook(SBIconAccessoryImage) +MSMetaClassHook(SBIconAccessoryImage) MSClassHook(SBIconBadge) MSClassHook(SBIconBadgeFactory) +MSClassHook(SBIconBadgeImage) +MSClassHook(SBIconContentView) MSClassHook(SBIconController) MSClassHook(SBIconLabel) +MSClassHook(SBIconLabelImage) +MSMetaClassHook(SBIconLabelImage) +MSClassHook(SBIconLabelImageParameters) MSClassHook(SBIconList) MSClassHook(SBIconModel) +MSClassHook(SBIconView) +MSMetaClassHook(SBIconView) //MSClassHook(SBImageCache) MSClassHook(SBSearchView) MSClassHook(SBSearchTableViewCell) @@ -159,17 +174,23 @@ MSClassHook(SBWidgetApplicationIcon) extern "C" void WKSetCurrentGraphicsContext(CGContextRef); -__attribute__((__constructor__)) -static void MSFixClass() { - if ($SBIcon == nil) - $SBIcon = objc_getClass("SBIconView"); +static struct MSFixClass { MSFixClass() { + $UIWebDocumentView = objc_getClass("UIWebBrowserView") ?: $UIWebDocumentView; + $SBIcon = objc_getClass("SBIconView") ?: $SBIcon; + + if ($SBIconList == nil) + $SBIconList = objc_getClass("SBIconListView"); if ($CKTranscriptController == nil) $CKTranscriptController = objc_getClass("mSMSMessageTranscriptController"); -} +} } MSFixClass; static bool IsWild_; static bool Four_($SBDockIconListView != nil); +@interface NSObject (wb$SBIconAccessoryImage) ++ (Class) _imageClassForIcon:(SBIcon *)icon location:(int)location; +@end + @interface NSDictionary (WinterBoard) - (UIColor *) wb$colorForKey:(NSString *)key; - (BOOL) wb$boolForKey:(NSString *)key; @@ -200,7 +221,7 @@ static BOOL (*_GSFontGetUseLegacyFontMetrics)(); static bool Debug_ = false; static bool UIDebug_ = false; static bool Engineer_ = false; -static bool SummerBoard_ = true; +static bool SummerBoard_ = false; static bool SpringBoard_; static UIImage *(*_UIApplicationImageWithName)(NSString *name); @@ -264,8 +285,7 @@ static NSArray *$useScale$(NSArray *files, bool use = true) { if (use) { if (Scale_ == 2) { [scaled addObject:[NSString stringWithFormat:@"%@@2x~%@.%@", base, idiom, extension]]; - if (!IsWild_) - [scaled addObject:[NSString stringWithFormat:@"%@@2x.%@", base, extension]]; + [scaled addObject:[NSString stringWithFormat:@"%@@2x.%@", base, extension]]; } [scaled addObject:[NSString stringWithFormat:@"%@~%@.%@", base, idiom, extension]]; @@ -273,20 +293,20 @@ static NSArray *$useScale$(NSArray *files, bool use = true) { // if (!IsWild_) <- support old themes [scaled addObject:file]; } else if ([base hasSuffix: @"@2x"]) { - [scaled addObject:[NSString stringWithFormat:@"%@~iphone.%@", base, extension]]; + [scaled addObject:[NSString stringWithFormat:@"%@~%@.%@", base, idiom, extension]]; [scaled addObject:file]; // XXX: this actually can't be used, as the person loading the file doesn't realize that the @2x changed /*NSString *rest([base substringWithRange:NSMakeRange(0, [base length] - 3)]); - [scaled addObject:[NSString stringWithFormat:@"%@~iphone.%@", rest, extension]]; + [scaled addObject:[NSString stringWithFormat:@"%@~%@.%@", rest, idiom, extension]]; [scaled addObject:[rest stringByAppendingPathExtension:extension]];*/ } else { // XXX: this code isn't really complete [scaled addObject:file]; - if ([base hasSuffix:@"~iphone"]) - [scaled addObject:[[base substringWithRange:NSMakeRange(0, [base length] - 7)] stringByAppendingPathExtension:extension]]; + if ([base hasSuffix:[NSString stringWithFormat:@"~%@", idiom]]) + [scaled addObject:[[base substringWithRange:NSMakeRange(0, [base length] - 1 - [idiom length])] stringByAppendingPathExtension:extension]]; } } @@ -310,8 +330,11 @@ static NSString *$getTheme$(NSArray *files, NSArray *themes = Themes_) { for (NSString *theme in Themes_) for (NSString *file in files) { path = [NSString stringWithFormat:@"%@/%@", theme, file]; - if ([Manager_ fileExistsAtPath:path]) + if ([Manager_ fileExistsAtPath:path]) { + if ([[Manager_ pathContentOfSymbolicLinkAtPath:path] isEqualToString:@"/"]) + path = nil; goto set; + } } path = nil; @@ -336,6 +359,8 @@ static NSString *$pathForFile$inBundle$(NSString *file, NSBundle *bundle, bool u NSString *base([folder stringByDeletingPathExtension]); if ([base hasSuffix:@"~iphone"]) [names addObject:[NSString stringWithFormat:@"Folders/%@.%@/%@", [base substringWithRange:NSMakeRange(0, [base length] - 7)], [folder pathExtension], file]]; + if ([base hasSuffix:@"~ipad"]) + [names addObject:[NSString stringWithFormat:@"Folders/%@.%@/%@", [base substringWithRange:NSMakeRange(0, [base length] - 5)], [folder pathExtension], file]]; } if (ui) [names addObject:[NSString stringWithFormat:@"UIImages/%@", file]]; @@ -351,6 +376,8 @@ static NSString *$pathForFile$inBundle$(NSString *file, NSBundle *bundle, bool u [names addObject:[NSString stringWithFormat:@"Bundles/com.apple.MobileSMS/%@", file]]; else if ([identifier isEqualToString:@"com.apple.calculator"]) [names addObject:[NSString stringWithFormat:@"Files/Applications/Calculator.app/%@", file]]; + else if ([identifier isEqualToString:@"com.apple.Maps"] && [file isEqualToString:@"Icon-57@2x.png"]) + [names addObject:[NSString stringWithFormat:@"Bundles/com.apple.Maps/icon.png"]]; else if (!summer); remapResourceName(@"FSO_BG.png", @"StatusBar") remapResourceName(Four_ ? @"SBDockBG-old.png" : @"SBDockBG.png", @"Dock") @@ -712,6 +739,52 @@ static struct WBStringDrawingState { NSString *info_; } *stringDrawingState_; +extern "C" CGColorSpaceRef CGContextGetFillColorSpace(CGContextRef); +extern "C" void CGContextGetFillColor(CGContextRef, CGFloat[]); + +static NSString *WBColorMarkup() { + CGContextRef context(UIGraphicsGetCurrentContext()); + //NSLog(@"XXX:1:%p", context); + if (context == NULL) + return @""; + + CGColorSpaceRef space(CGContextGetFillColorSpace(context)); + //NSLog(@"XXX:2:%p", space); + if (space == NULL) + return @""; + + size_t number(CGColorSpaceGetNumberOfComponents(space)); + //NSLog(@"XXX:3:%u", number); + if (number == 0) + return @""; + + CGFloat components[number + 1]; + CGContextGetFillColor(context, components); + + CGFloat r, g, b, a; + + switch (number) { + case 1: + r = components[0]; + g = components[0]; + b = components[0]; + a = components[1]; + break; + + case 3: + r = components[0]; + g = components[1]; + b = components[2]; + a = components[3]; + break; + + default: + return @""; + } + + return [NSString stringWithFormat:@"color: rgba(%g, %g, %g, %g)", r * 255, g * 255, b * 255, a]; +} + MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode,letterSpacing,includeEmoji, CGPoint, point, float, width, UIFont *, font, UILineBreakMode, mode, float, spacing, BOOL, emoji) { //NSLog(@"XXX: @\"%@\" %g", self, spacing); @@ -730,7 +803,7 @@ MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreak NSString *base(state->base_ ?: @""); NSString *extra([NSString stringWithFormat:@"letter-spacing: %gpx", spacing]); - [self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], extra, base, info]]; + [self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@;%@", [font markupDescription], WBColorMarkup(), extra, base, info]]; return CGSizeZero; } @@ -770,9 +843,9 @@ MSInstanceMessageHook7(CGSize, NSString, _drawInRect,withFont,lineBreakMode,alig NSString *extra([NSString stringWithFormat:@"text-align: %@", textAlign]); if (true) - $drawLabel$(self, rect, [NSString stringWithFormat:@"%@;%@", [font markupDescription], base], info); + $drawLabel$(self, rect, [NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], WBColorMarkup(), base], info); else - [self drawInRect:rect withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], extra, base, info]]; + [self drawInRect:rect withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@;%@", [font markupDescription], WBColorMarkup(), extra, base, info]]; return CGSizeZero; } @@ -795,7 +868,7 @@ MSInstanceMessageHook4(CGSize, NSString, sizeWithFont,forWidth,lineBreakMode,let NSString *base(state->base_ ?: @""); NSString *extra([NSString stringWithFormat:@"letter-spacing: %gpx", spacing]); - return [self sizeWithStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], extra, base, info] forWidth:width]; + return [self sizeWithStyle:[NSString stringWithFormat:@"%@;%@;%@;%@;%@", [font markupDescription], WBColorMarkup(), extra, base, info] forWidth:width]; } MSInstanceMessageHook1(CGSize, NSString, sizeWithFont, UIFont *, font) { @@ -815,12 +888,26 @@ MSInstanceMessageHook1(CGSize, NSString, sizeWithFont, UIFont *, font) { return MSOldCall(font); NSString *base(state->base_ ?: @""); - return [self sizeWithStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info] forWidth:65535]; + return [self sizeWithStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], WBColorMarkup(), base, info] forWidth:65535]; +} + +MSClassMessageHook2(UIImage *, SBIconAccessoryImage, checkoutAccessoryImageForIcon,location, id, icon, int, location) { + if ([self _imageClassForIcon:icon location:location] != $SBIconBadgeImage) + return MSOldCall(icon, location); + + WBStringDrawingState badgeState = {NULL, -1, @"" + , @"BadgeStyle"}; + + stringDrawingState_ = &badgeState; + + UIImage *image(MSOldCall(icon, location)); + + stringDrawingState_ = NULL; + return image; } MSInstanceMessageHook1(UIImage *, SBIconBadgeFactory, checkoutBadgeImageForText, NSString *, text) { - WBStringDrawingState badgeState = {NULL, 1, @"" - "color: white;" + WBStringDrawingState badgeState = {NULL, -1, @"" , @"BadgeStyle"}; stringDrawingState_ = &badgeState; @@ -833,7 +920,6 @@ MSInstanceMessageHook1(UIImage *, SBIconBadgeFactory, checkoutBadgeImageForText, MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage, int, type) { WBStringDrawingState dayState = {NULL, 2, @"" - "color: white;" // XXX: this is only correct on an iPod dock "text-shadow: rgba(0, 0, 0, 0.2) -1px -1px 2px;" , @"CalendarIconDayStyle"}; @@ -841,7 +927,6 @@ MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage, WBStringDrawingState sizeState = {&dayState, 7, nil, nil}; WBStringDrawingState dateState = {&sizeState, 2, @"" - "color: #333333;" , @"CalendarIconDateStyle"}; stringDrawingState_ = &dateState; @@ -852,6 +937,18 @@ MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage, return image; } +MSInstanceMessageHook1(UIImage *, UIStatusBarTimeItemView, contentsImageForStyle, int, style) { + WBStringDrawingState timeState = {NULL, 0, @"" + , @"TimeStyle"}; + + stringDrawingState_ = &timeState; + + UIImage *image(MSOldCall(style)); + + stringDrawingState_ = NULL; + return image; +} + MSHook(void, SBCalendarIconContentsView$drawRect$, SBCalendarIconContentsView *self, SEL sel, CGRect rect) { NSBundle *bundle([NSBundle mainBundle]); @@ -1144,7 +1241,7 @@ MSInstanceMessageHook0(id, SBUIController, init) { if (NSString *path = $getTheme$([NSArray arrayWithObject:@"Wallpaper.html"], themes)) { CGRect bounds = [indirect bounds]; - UIWebDocumentView *view([[[UIWebDocumentView alloc] initWithFrame:bounds] autorelease]); + UIWebDocumentView *view([[[$UIWebDocumentView alloc] initWithFrame:bounds] autorelease]); [view setAutoresizes:true]; WallpaperPage_ = [view retain]; @@ -1167,7 +1264,7 @@ MSInstanceMessageHook0(id, SBUIController, init) { if ([Manager_ fileExistsAtPath:html]) { CGRect bounds = [indirect bounds]; - UIWebDocumentView *view([[[UIWebDocumentView alloc] initWithFrame:bounds] autorelease]); + UIWebDocumentView *view([[[$UIWebDocumentView alloc] initWithFrame:bounds] autorelease]); [view setAutoresizes:true]; NSURL *url = [NSURL fileURLWithPath:html]; @@ -1198,7 +1295,7 @@ MSHook(void, SBAwayView$updateDesktopImage$, SBAwayView *self, SEL sel, UIImage if (path != nil) { CGRect bounds = [self bounds]; - UIWebDocumentView *view([[[UIWebDocumentView alloc] initWithFrame:bounds] autorelease]); + UIWebDocumentView *view([[[$UIWebDocumentView alloc] initWithFrame:bounds] autorelease]); [view setAutoresizes:true]; if (WallpaperPage_ != nil) @@ -1335,8 +1432,12 @@ MSInstanceMessageHook0(id, SBIcon, initWithDefaultSize) { if (NSNumber *number = [Info_ objectForKey:@"IconAlpha"]) { // XXX: note: this is overridden above, which is silly float alpha([number floatValue]); - [self setIconImageAlpha:alpha]; - [self setIconLabelAlpha:alpha]; + if ([self respondsToSelector:@selector(setIconImageAlpha:)]) + [self setIconImageAlpha:alpha]; + if ([self respondsToSelector:@selector(setIconLabelAlpha:)]) + [self setIconLabelAlpha:alpha]; + if ([self respondsToSelector:@selector(setAlpha:)]) + [self setAlpha:alpha]; } } return self; } @@ -1466,39 +1567,70 @@ MSHook(void, SBStatusBarTimeView$drawRect$, SBStatusBarTimeView *self, SEL sel, @end -MSHook(void, SBIconList$setFrame$, SBIconList *self, SEL sel, CGRect frame) { +static void SBIconList$updateFrames$(SBIconList *self) { NSArray *subviews([self subviews]); WBImageView *view([subviews count] == 0 ? nil : [subviews objectAtIndex:0]); if (view != nil && [view wb$isWBImageView]) [view wb$updateFrame]; +} + +MSHook(void, SBIconList$didMoveToSuperview, SBIconList *self, SEL sel) { + SBIconList$updateFrames$(self); + _SBIconList$didMoveToSuperview(self, sel); +} + +MSHook(void, SBIconList$setFrame$, SBIconList *self, SEL sel, CGRect frame) { + SBIconList$updateFrames$(self); _SBIconList$setFrame$(self, sel, frame); } -MSHook(void, SBIconController$noteNumberOfIconListsChanged, SBIconController *self, SEL sel) { - SBIconModel *&_iconModel(MSHookIvar(self, "_iconModel")); - NSArray *lists([_iconModel iconLists]); +static void $addPerPageView$(unsigned i, UIView *list) { + NSString *path($getTheme$([NSArray arrayWithObject:[NSString stringWithFormat:@"Page%u.png", i]])); + if (path == nil) + return; + NSArray *subviews([list subviews]); + + WBImageView *view([subviews count] == 0 ? nil : [subviews objectAtIndex:0]); + if (view == nil || ![view wb$isWBImageView]) { + view = [[[WBImageView alloc] init] autorelease]; + [list insertSubview:view atIndex:0]; + } + + UIImage *image([UIImage imageWithContentsOfFile:path]); + + CGRect frame([view frame]); + frame.size = [image size]; + [view setFrame:frame]; + + [view setImage:image]; + [view wb$updateFrame]; +} + +static void $addPerPageViews$(NSArray *lists) { for (unsigned i(0), e([lists count]); i != e; ++i) - if (NSString *path = $getTheme$([NSArray arrayWithObject:[NSString stringWithFormat:@"Page%u.png", i]])) { - SBIconList *list([lists objectAtIndex:i]); - NSArray *subviews([list subviews]); - - WBImageView *view([subviews count] == 0 ? nil : [subviews objectAtIndex:0]); - if (view == nil || ![view wb$isWBImageView]) { - view = [[[WBImageView alloc] init] autorelease]; - [list insertSubview:view atIndex:0]; - } + $addPerPageView$(i, [lists objectAtIndex:i]); +} - UIImage *image([UIImage imageWithContentsOfFile:path]); +MSInstanceMessageHook0(void, SBIconController, updateNumberOfRootIconLists) { + NSArray *&_rootIconLists(MSHookIvar(self, "_rootIconLists")); + $addPerPageViews$(_rootIconLists); + return MSOldCall(); +} - CGRect frame([view frame]); - frame.size = [image size]; - [view setFrame:frame]; +MSInstanceMessageHook0(void, SBIconContentView, layoutSubviews) { + MSOldCall(); - [view setImage:image]; - [view wb$updateFrame]; - } + if (SBIconController *controller = [$SBIconController sharedInstance]) { + UIView *&_dockContainerView(MSHookIvar(controller, "_dockContainerView")); + if (&_dockContainerView != NULL) + [[_dockContainerView superview] bringSubviewToFront:_dockContainerView]; + } +} +MSHook(void, SBIconController$noteNumberOfIconListsChanged, SBIconController *self, SEL sel) { + SBIconModel *&_iconModel(MSHookIvar(self, "_iconModel")); + $addPerPageViews$([_iconModel iconLists]); return _SBIconController$noteNumberOfIconListsChanged(self, sel); } @@ -1613,11 +1745,8 @@ MSInstanceMessage1(void, SBIconLabel, drawRect, CGRect, rect) { MSInstanceMessage0(CGImageRef, SBIconLabel, buildLabelImage) { bool docked((MSHookIvar(self, "_inDock") & 0x2) != 0); - WBStringDrawingState labelState = {NULL, 0, [NSString stringWithFormat:@"" - "color: %@;" - , - (docked || !SummerBoard_ ? @"white" : @"#b3b3b3") - ], docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"}; + WBStringDrawingState labelState = {NULL, 0, @"" + , docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"}; stringDrawingState_ = &labelState; @@ -1629,6 +1758,37 @@ MSInstanceMessage0(CGImageRef, SBIconLabel, buildLabelImage) { return image; } +static bool wb$inDock(id parameters) { + return [$objc_getAssociatedObject(parameters, @selector(wb$inDock)) boolValue]; +} + +MSInstanceMessage0(NSUInteger, SBIconLabelImageParameters, hash) { + return MSOldCall() + (wb$inDock(self) ? 0xdeadbeef : 0xd15ea5e); +} + +MSClassMessage2(id, SBIconView, _labelImageParametersForIcon,location, id, icon, int, location) { + if (id parameters = MSOldCall(icon, location)) { + $objc_setAssociatedObject(parameters, @selector(wb$inDock), [NSNumber numberWithBool:(location == 1)], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return parameters; + } return nil; +} + +MSClassMessage1(UIImage *, SBIconLabelImage, _drawLabelImageForParameters, id, parameters) { + bool docked(wb$inDock(parameters)); + + WBStringDrawingState labelState = {NULL, 0, @"" + , docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"}; + + stringDrawingState_ = &labelState; + + //NSLog(@"XXX: +"); + UIImage *image(MSOldCall(parameters)); + //NSLog(@"XXX: -"); + + stringDrawingState_ = NULL; + return image; +} + // ChatKit {{{ MSInstanceMessageHook2(id, CKBalloonView, initWithFrame,delegate, CGRect, frame, id, delegate) { if ((self = MSOldCall(frame, delegate)) != nil) { @@ -1813,7 +1973,7 @@ MSHook(bool, _Z24GetFileNameForThisActionmPcRb, unsigned long a0, char *a1, bool NSString *path([NSString stringWithFormat:@"%@/UISounds/%@", theme, file]); if ([Manager_ fileExistsAtPath:path]) { strcpy(a1, [path UTF8String]); - continue; + break; } } } @@ -1846,7 +2006,7 @@ static void ChangeWallpaper( } #define WBRename(name, sel, imp) \ - _ ## name ## $ ## imp = MSHookMessage($ ## name, @selector(sel), &$ ## name ## $ ## imp) + MSHookMessage($ ## name, @selector(sel), &$ ## name ## $ ## imp, &_ ## name ## $ ## imp) template static void msset(Type_ &function, MSImageRef image, const char *name) { @@ -1876,35 +2036,53 @@ MSHook(void *, CGImageReadCreateWithFile, NSString *path, int flag) { [pool release]; return value; } + +MSHook(void *, CGImageSourceCreateWithFile, NSString *path, NSDictionary *options) { + if (Debug_) + NSLog(@"WB:Debug: CGImageSourceCreateWithFile(%@, %@)", path, options); + NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]); + void *value(_CGImageSourceCreateWithFile([path wb$themedPath], options)); + [pool release]; + return value; +} + +MSHook(void *, CGImageSourceCreateWithURL, NSURL *url, NSDictionary *options) { + if (Debug_) + NSLog(@"WB:Debug: CGImageSourceCreateWithURL(%@, %@)", url, options); + NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]); + if ([url isFileURL]) + url = [NSURL fileURLWithPath:[[url path] wb$themedPath]]; + void *value(_CGImageSourceCreateWithURL(url, options)); + [pool release]; + return value; +} // }}} static void NSString$drawAtPoint$withStyle$(NSString *self, SEL _cmd, CGPoint point, NSString *style) { WKSetCurrentGraphicsContext(UIGraphicsGetCurrentContext()); if (style == nil || [style length] == 0) style = @"font-family: Helvetica; font-size: 12px"; - //NSLog(@"XXX:draw(%@)", [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]); - return [[WBMarkup sharedMarkup] drawString:self atPoint:point withStyle:style]; + //NSLog(@"XXX:drawP(%@ | %@)", self, [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]); + [[WBMarkup sharedMarkup] drawString:self atPoint:point withStyle:style]; } static void NSString$drawInRect$withStyle$(NSString *self, SEL _cmd, CGRect rect, NSString *style) { WKSetCurrentGraphicsContext(UIGraphicsGetCurrentContext()); if (style == nil || [style length] == 0) style = @"font-family: Helvetica; font-size: 12px"; + //NSLog(@"XXX:drawR(%@ | %@)", self, [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]); return [[WBMarkup sharedMarkup] drawString:self inRect:rect withStyle:style]; } static CGSize NSString$sizeWithStyle$forWidth$(NSString *self, SEL _cmd, NSString *style, float width) { if (style == nil || [style length] == 0) style = @"font-family: Helvetica; font-size: 12px"; - //NSLog(@"XXX:size(%@)", [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]); - return [[WBMarkup sharedMarkup] sizeOfString:self withStyle:style forWidth:width]; + CGSize size([[WBMarkup sharedMarkup] sizeOfString:self withStyle:style forWidth:width]); + //NSLog(@"XXX:size(%@ | %@) = [%g %g]", self, [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "], size.width, size.height); + return size; } static void SBInitialize() { - class_addMethod($NSString, @selector(drawAtPoint:withStyle:), (IMP) &NSString$drawAtPoint$withStyle$, "v20@0:4{CGPoint=ff}8@16"); - class_addMethod($NSString, @selector(drawInRect:withStyle:), (IMP) &NSString$drawInRect$withStyle$, "v28@0:4{CGRect={CGSize=ff}{CGSize=ff}}8@24"); - class_addMethod($NSString, @selector(sizeWithStyle:forWidth:), (IMP) &NSString$sizeWithStyle$forWidth$, "{CGSize=ff}16@0:4@8f12"); - if (SummerBoard_) { WBRename(SBApplication, pathForIcon, pathForIcon); WBRename(SBApplicationIcon, icon, icon); @@ -1922,14 +2100,20 @@ static void SBInitialize() { WBRename(SBDockIconListView, setFrame:, setFrame$); MSHookMessage(object_getClass($SBDockIconListView), @selector(shouldShowNewDock), &$SBDockIconListView$shouldShowNewDock, &_SBDockIconListView$shouldShowNewDock); - if (kCFCoreFoundationVersionNumber < 600) + if (kCFCoreFoundationVersionNumber < 600 || SummerBoard_) WBRename(SBIconLabel, drawRect:, drawRect$); - else + else if (kCFCoreFoundationVersionNumber < 700) { WBRename(SBIconLabel, buildLabelImage, buildLabelImage); + } else { + WBRename(SBIconLabelImageParameters, hash, hash); + WBRename($SBIconView, _labelImageParametersForIcon:location:, _labelImageParametersForIcon$location$); + WBRename($SBIconLabelImage, _drawLabelImageForParameters:, _drawLabelImageForParameters$); + } WBRename(SBIconLabel, initWithSize:label:, initWithSize$label$); WBRename(SBIconLabel, setInDock:, setInDock$); + WBRename(SBIconList, didMoveToSuperview, didMoveToSuperview); WBRename(SBIconList, setFrame:, setFrame$); WBRename(SBIconModel, cacheImageForIcon:, cacheImageForIcon$); @@ -1958,6 +2142,10 @@ static void SBInitialize() { } MSInitialize { + $objc_setAssociatedObject = reinterpret_cast(dlsym(RTLD_DEFAULT, "objc_setAssociatedObject")); + $objc_getAssociatedObject = reinterpret_cast(dlsym(RTLD_DEFAULT, "objc_getAssociatedObject")); + $objc_removeAssociatedObjects = reinterpret_cast(dlsym(RTLD_DEFAULT, "objc_removeAssociatedObjects")); + NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]); NSString *identifier([[NSBundle mainBundle] bundleIdentifier]); @@ -1972,6 +2160,9 @@ MSInitialize { if (NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"/User/Library/Preferences/com.saurik.WinterBoard.plist"]]) { if (NSNumber *value = [settings objectForKey:@"SummerBoard"]) SummerBoard_ = [value boolValue]; + else + SummerBoard_ = true; + if (NSNumber *value = [settings objectForKey:@"Debug"]) Debug_ = [value boolValue]; if (NSNumber *value = [settings objectForKey:@"RecordUI"]) @@ -2039,6 +2230,16 @@ MSInitialize { void *(*CGImageReadCreateWithFile)(NSString *, int); msset(CGImageReadCreateWithFile, image, "_CGImageReadCreateWithFile"); MSHookFunction(CGImageReadCreateWithFile, MSHake(CGImageReadCreateWithFile)); + + if (CGImageReadCreateWithFile == NULL) { + void *(*CGImageSourceCreateWithFile)(NSString *, NSDictionary *); + msset(CGImageSourceCreateWithFile, image, "_CGImageSourceCreateWithFile"); + MSHookFunction(CGImageSourceCreateWithFile, MSHake(CGImageSourceCreateWithFile)); + + void *(*CGImageSourceCreateWithURL)(NSURL *, NSDictionary *); + msset(CGImageSourceCreateWithURL, image, "_CGImageSourceCreateWithURL"); + MSHookFunction(CGImageSourceCreateWithURL, MSHake(CGImageSourceCreateWithURL)); + } } // }}} // SpringBoard {{{ @@ -2066,6 +2267,10 @@ MSInitialize { // }}} // UIKit {{{ if ([NSBundle bundleWithIdentifier:@"com.apple.UIKit"] != nil) { + class_addMethod($NSString, @selector(drawAtPoint:withStyle:), (IMP) &NSString$drawAtPoint$withStyle$, "v20@0:4{CGPoint=ff}8@16"); + class_addMethod($NSString, @selector(drawInRect:withStyle:), (IMP) &NSString$drawInRect$withStyle$, "v28@0:4{CGRect={CGSize=ff}{CGSize=ff}}8@24"); + class_addMethod($NSString, @selector(sizeWithStyle:forWidth:), (IMP) &NSString$sizeWithStyle$forWidth$, "{CGSize=ff}16@0:4@8f12"); + struct nlist nl[6]; memset(nl, 0, sizeof(nl)); nl[0].n_un.n_name = (char *) "__UIApplicationImageWithName";