X-Git-Url: https://git.saurik.com/winterboard.git/blobdiff_plain/e05a7e78f4a110a59902f09abfbaa148d31b8909..797e41643364390e7e0a6848f9a60dbf7a7d49d0:/Library.mm diff --git a/Library.mm b/Library.mm index e4a9df1..65de6d8 100644 --- a/Library.mm +++ b/Library.mm @@ -121,6 +121,8 @@ MSClassHook(UIImage) MSMetaClassHook(UIImage) MSClassHook(UINavigationBar) MSClassHook(UIToolbar) +MSClassHook(UIStatusBarTimeItemView) +MSClassHook(UIWebDocumentView) MSClassHook(CKBalloonView) MSClassHook(CKMessageCell) @@ -141,6 +143,7 @@ MSClassHook(SBDockIconListView) MSClassHook(SBIcon) MSClassHook(SBIconBadge) MSClassHook(SBIconBadgeFactory) +MSClassHook(SBIconContentView) MSClassHook(SBIconController) MSClassHook(SBIconLabel) MSClassHook(SBIconList) @@ -159,13 +162,15 @@ 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); @@ -200,7 +205,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); @@ -276,9 +281,10 @@ static NSArray *$useScale$(NSArray *files, bool use = true) { [scaled addObject:[NSString stringWithFormat:@"%@~iphone.%@", base, extension]]; [scaled addObject:file]; - NSString *rest([base substringWithRange:NSMakeRange(0, [base length] - 3)]); + // 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:[rest stringByAppendingPathExtension:extension]]; + [scaled addObject:[rest stringByAppendingPathExtension:extension]];*/ } else { // XXX: this code isn't really complete @@ -293,8 +299,13 @@ static NSArray *$useScale$(NSArray *files, bool use = true) { } static NSString *$getTheme$(NSArray *files, NSArray *themes = Themes_) { - if (NSString *path = [Themed_ objectForKey:files]) - return reinterpret_cast(path) == [NSNull null] ? nil : path; + // XXX: this is not reasonable; OMG + id key(files); + + @synchronized (Themed_) { + if (NSString *path = [Themed_ objectForKey:key]) + return reinterpret_cast(path) == [NSNull null] ? nil : path; + } if (Debug_) NSLog(@"WB:Debug: %@", [files description]); @@ -311,7 +322,10 @@ static NSString *$getTheme$(NSArray *files, NSArray *themes = Themes_) { path = nil; set: - [Themed_ setObject:(path == nil ? [NSNull null] : reinterpret_cast(path)) forKey:files]; + @synchronized (Themed_) { + [Themed_ setObject:(path == nil ? [NSNull null] : reinterpret_cast(path)) forKey:key]; + } + return path; } // }}} @@ -322,8 +336,12 @@ static NSString *$pathForFile$inBundle$(NSString *file, NSBundle *bundle, bool u if (identifier != nil) [names addObject:[NSString stringWithFormat:@"Bundles/%@/%@", identifier, file]]; - if (NSString *folder = [[bundle bundlePath] lastPathComponent]) + if (NSString *folder = [[bundle bundlePath] lastPathComponent]) { [names addObject:[NSString stringWithFormat:@"Folders/%@/%@", folder, file]]; + NSString *base([folder stringByDeletingPathExtension]); + if ([base hasSuffix:@"~iphone"]) + [names addObject:[NSString stringWithFormat:@"Folders/%@.%@/%@", [base substringWithRange:NSMakeRange(0, [base length] - 7)], [folder pathExtension], file]]; + } if (ui) [names addObject:[NSString stringWithFormat:@"UIImages/%@", file]]; @@ -343,6 +361,8 @@ static NSString *$pathForFile$inBundle$(NSString *file, NSBundle *bundle, bool u remapResourceName(Four_ ? @"SBDockBG-old.png" : @"SBDockBG.png", @"Dock") remapResourceName(@"SBWeatherCelsius.png", @"Icons/Weather") + [names addObject:[NSString stringWithFormat:@"Fallback/%@", file]]; + if (NSString *path = $getTheme$($useScale$(names, ui))) return path; @@ -661,6 +681,35 @@ MSInstanceMessageHook2(NSString *, NSBundle, pathForResource,ofType, NSString *, } // }}} +static void $drawLabel$(NSString *label, CGRect rect, NSString *style, NSString *custom) { + bool ellipsis(false); + float max = rect.size.width - 11, width; + width: + width = [(ellipsis ? [label stringByAppendingString:@"..."] : label) sizeWithStyle:style forWidth:320].width; + + if (width > max) { + size_t length([label length]); + float spacing((width - max) / (length - 1)); + + if (spacing > 1.25) { + ellipsis = true; + label = [label substringToIndex:(length - 1)]; + goto width; + } + + style = [style stringByAppendingString:[NSString stringWithFormat:@"letter-spacing: -%f; ", spacing]]; + } + + if (ellipsis) + label = [label stringByAppendingString:@"..."]; + + if (custom != nil) + style = [style stringByAppendingString:custom]; + + CGSize size = [label sizeWithStyle:style forWidth:rect.size.width]; + [label drawAtPoint:CGPointMake((rect.size.width - size.width) / 2 + rect.origin.x, rect.origin.y) withStyle:style]; +} + static struct WBStringDrawingState { WBStringDrawingState *next_; unsigned count_; @@ -668,45 +717,141 @@ static struct WBStringDrawingState { NSString *info_; } *stringDrawingState_; -MSInstanceMessageHook4(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode, CGPoint, point, float, width, UIFont *, font, int, mode) { +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); + WBStringDrawingState *state(stringDrawingState_); if (state == NULL) - return MSOldCall(point, width, font, mode); + return MSOldCall(point, width, font, mode, spacing, emoji); if (--state->count_ == 0) stringDrawingState_ = state->next_; if (state->info_ == nil) - return MSOldCall(point, width, font, mode); + return MSOldCall(point, width, font, mode, spacing, emoji); NSString *info([Info_ objectForKey:state->info_]); if (info == nil) - return MSOldCall(point, width, font, mode); + return MSOldCall(point, width, font, mode, spacing, emoji); NSString *base(state->base_ ?: @""); - [self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info]]; + NSString *extra([NSString stringWithFormat:@"letter-spacing: %gpx", spacing]); + [self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@;%@", [font markupDescription], WBColorMarkup(), extra, base, info]]; return CGSizeZero; } -MSInstanceMessageHook2(CGSize, NSString, drawAtPoint,withFont, CGPoint, point, UIFont *, font) { +extern "C" NSString *NSStringFromCGRect(CGRect rect); + +MSInstanceMessageHook7(CGSize, NSString, _drawInRect,withFont,lineBreakMode,alignment,lineSpacing,includeEmoji,truncationRect, CGRect, rect, UIFont *, font, UILineBreakMode, mode, UITextAlignment, alignment, float, spacing, BOOL, emoji, CGRect, truncation) { + //NSLog(@"XXX: &\"%@\" %@ \"%@\" %u %u %g %u %@", self, NSStringFromCGRect(rect), font, mode, alignment, spacing, emoji, NSStringFromCGRect(truncation)); + WBStringDrawingState *state(stringDrawingState_); if (state == NULL) - return MSOldCall(point, font); + return MSOldCall(rect, font, mode, alignment, spacing, emoji, truncation); if (--state->count_ == 0) stringDrawingState_ = state->next_; if (state->info_ == nil) - return MSOldCall(point, font); + return MSOldCall(rect, font, mode, alignment, spacing, emoji, truncation); NSString *info([Info_ objectForKey:state->info_]); if (info == nil) - return MSOldCall(point, font); + return MSOldCall(rect, font, mode, alignment, spacing, emoji, truncation); + + NSString *textAlign; + switch (alignment) { + default: + case UITextAlignmentLeft: + textAlign = @"left"; + break; + case UITextAlignmentCenter: + textAlign = @"center"; + break; + case UITextAlignmentRight: + textAlign = @"right"; + break; + } NSString *base(state->base_ ?: @""); - [self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info]]; + NSString *extra([NSString stringWithFormat:@"text-align: %@", textAlign]); + + if (true) + $drawLabel$(self, rect, [NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], WBColorMarkup(), base], info); + else + [self drawInRect:rect withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@;%@", [font markupDescription], WBColorMarkup(), extra, base, info]]; + return CGSizeZero; } +MSInstanceMessageHook4(CGSize, NSString, sizeWithFont,forWidth,lineBreakMode,letterSpacing, UIFont *, font, float, width, UILineBreakMode, mode, float, spacing) { + //NSLog(@"XXX: #\"%@\" \"%@\" %g %u %g", self, font, width, mode, spacing); + + WBStringDrawingState *state(stringDrawingState_); + if (state == NULL) + return MSOldCall(font, width, mode, spacing); + + if (--state->count_ == 0) + stringDrawingState_ = state->next_; + if (state->info_ == nil) + return MSOldCall(font, width, mode, spacing); + + NSString *info([Info_ objectForKey:state->info_]); + if (info == nil) + return MSOldCall(font, width, mode, spacing); + + NSString *base(state->base_ ?: @""); + NSString *extra([NSString stringWithFormat:@"letter-spacing: %gpx", spacing]); + return [self sizeWithStyle:[NSString stringWithFormat:@"%@;%@;%@;%@;%@", [font markupDescription], WBColorMarkup(), extra, base, info] forWidth:width]; +} + MSInstanceMessageHook1(CGSize, NSString, sizeWithFont, UIFont *, font) { + //NSLog(@"XXX: ?\"%@\"", self); + WBStringDrawingState *state(stringDrawingState_); if (state == NULL) return MSOldCall(font); @@ -721,12 +866,11 @@ 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]; } MSInstanceMessageHook1(UIImage *, SBIconBadgeFactory, checkoutBadgeImageForText, NSString *, text) { WBStringDrawingState badgeState = {NULL, 1, @"" - "color: white;" , @"BadgeStyle"}; stringDrawingState_ = &badgeState; @@ -739,7 +883,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"}; @@ -747,7 +890,6 @@ MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage, WBStringDrawingState sizeState = {&dayState, 7, nil, nil}; WBStringDrawingState dateState = {&sizeState, 2, @"" - "color: #333333;" , @"CalendarIconDateStyle"}; stringDrawingState_ = &dateState; @@ -758,6 +900,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]); @@ -1050,7 +1204,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]; @@ -1073,7 +1227,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]; @@ -1104,7 +1258,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) @@ -1158,7 +1312,7 @@ extern "C" NSString *UIStyleStringFromColor(CGColorRef);*/ WBDelegate(time_) -- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(int)mode { +- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)mode { if (NSString *custom = [Info_ objectForKey:@"TimeStyle"]) { BOOL &_mode(MSHookIvar(view_, "_mode"));; @@ -1205,7 +1359,7 @@ WBDelegate(time_) WBDelegate(badge_) -- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(int)mode { +- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)mode { if (NSString *custom = [Info_ objectForKey:@"BadgeStyle"]) { [badge_ drawAtPoint:point withStyle:[NSString stringWithFormat:@"" "font-family: Helvetica; " @@ -1241,8 +1395,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; } @@ -1380,31 +1538,53 @@ MSHook(void, SBIconList$setFrame$, SBIconList *self, SEL sel, CGRect frame) { _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); } @@ -1488,9 +1668,7 @@ MSInstanceMessageHook2(CGSize, WebCoreFrameBridge, renderedSizeOfNode,constraine } // }}} -MSInstanceMessageHook1(void, SBIconLabel, drawRect, CGRect, rect) { - CGRect bounds = [self bounds]; - +MSInstanceMessage1(void, SBIconLabel, drawRect, CGRect, rect) { static Ivar drawMoreLegibly = object_getInstanceVariable(self, "_drawMoreLegibly", NULL); int docked; @@ -1513,32 +1691,25 @@ MSInstanceMessageHook1(void, SBIconLabel, drawRect, CGRect, rect) { else if (docked) style = [style stringByAppendingString:@"text-shadow: rgba(0, 0, 0, 0.5) 0px -1px 0px; "]; - bool ellipsis(false); - float max = [self frame].size.width - 11, width; - width: - width = [(ellipsis ? [label stringByAppendingString:@"..."] : label) sizeWithStyle:style forWidth:320].width; + NSString *custom([Info_ objectForKey:(docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle")]); - if (width > max) { - size_t length([label length]); - float spacing((width - max) / (length - 1)); + $drawLabel$(label, [self bounds], style, custom); +} - if (spacing > 1.25) { - ellipsis = true; - label = [label substringToIndex:(length - 1)]; - goto width; - } +MSInstanceMessage0(CGImageRef, SBIconLabel, buildLabelImage) { + bool docked((MSHookIvar(self, "_inDock") & 0x2) != 0); - style = [style stringByAppendingString:[NSString stringWithFormat:@"letter-spacing: -%f; ", spacing]]; - } + WBStringDrawingState labelState = {NULL, 0, @"" + , docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"}; - if (ellipsis) - label = [label stringByAppendingString:@"..."]; + stringDrawingState_ = &labelState; - if (NSString *custom = [Info_ objectForKey:(docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle")]) - style = [style stringByAppendingString:custom]; + //NSLog(@"XXX: +"); + CGImageRef image(MSOldCall()); + //NSLog(@"XXX: -"); - CGSize size = [label sizeWithStyle:style forWidth:bounds.size.width]; - [label drawAtPoint:CGPointMake((bounds.size.width - size.width) / 2, 0) withStyle:style]; + stringDrawingState_ = NULL; + return image; } // ChatKit {{{ @@ -1725,7 +1896,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; } } } @@ -1794,19 +1965,25 @@ static void NSString$drawAtPoint$withStyle$(NSString *self, SEL _cmd, CGPoint po 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]; } +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"; + 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]; } static void SBInitialize() { - class_addMethod($NSString, @selector(drawAtPoint:withStyle:), (IMP) &NSString$drawAtPoint$withStyle$, "v20@0:4{CGPoint=ff}8@16"); - 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); @@ -1824,6 +2001,11 @@ static void SBInitialize() { WBRename(SBDockIconListView, setFrame:, setFrame$); MSHookMessage(object_getClass($SBDockIconListView), @selector(shouldShowNewDock), &$SBDockIconListView$shouldShowNewDock, &_SBDockIconListView$shouldShowNewDock); + if (kCFCoreFoundationVersionNumber < 600 || SummerBoard_) + WBRename(SBIconLabel, drawRect:, drawRect$); + else + WBRename(SBIconLabel, buildLabelImage, buildLabelImage); + WBRename(SBIconLabel, initWithSize:label:, initWithSize$label$); WBRename(SBIconLabel, setInDock:, setInDock$); @@ -1869,6 +2051,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"]) @@ -1963,6 +2148,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";