+ UIImage *image(MSOldCall(icon, location));
+
+ stringDrawingState_ = NULL;
+ return image;
+}
+
+MSInstanceMessageHook1(UIImage *, SBIconBadgeFactory, checkoutBadgeImageForText, NSString *, text) {
+ WBStringDrawingState badgeState = {NULL, 0, @""
+ , @"BadgeStyle"};
+
+ stringDrawingState_ = &badgeState;
+
+ UIImage *image(MSOldCall(text));
+
+ stringDrawingState_ = NULL;
+ return image;
+}
+
+MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage, int, type) {
+ WBStringDrawingState dayState = {NULL, 2, @""
+ // XXX: this is only correct on an iPod dock
+ "text-shadow: rgba(0, 0, 0, 0.2) -1px -1px 2px;"
+ , @"CalendarIconDayStyle"};
+
+ WBStringDrawingState skipState = {&dayState,
+ unsigned(kCFCoreFoundationVersionNumber > 800 ? 16 : 7)
+ , nil, nil};
+
+ WBStringDrawingState dateState = {&skipState, 2, @""
+ , @"CalendarIconDateStyle"};
+
+ stringDrawingState_ = &dateState;
+
+ UIImage *image(MSOldCall(type));
+
+ stringDrawingState_ = NULL;
+ 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]);
+
+ CFLocaleRef locale(CFLocaleCopyCurrent());
+ CFDateFormatterRef formatter(CFDateFormatterCreate(NULL, locale, kCFDateFormatterNoStyle, kCFDateFormatterNoStyle));
+ CFRelease(locale);
+
+ CFDateRef now(CFDateCreate(NULL, CFAbsoluteTimeGetCurrent()));
+
+ CFDateFormatterSetFormat(formatter, (CFStringRef) [bundle localizedStringForKey:@"CALENDAR_ICON_DAY_NUMBER_FORMAT" value:@"d" table:@"SpringBoard"]);
+ CFStringRef date(CFDateFormatterCreateStringWithDate(NULL, formatter, now));
+ CFDateFormatterSetFormat(formatter, (CFStringRef) [bundle localizedStringForKey:@"CALENDAR_ICON_DAY_NAME_FORMAT" value:@"cccc" table:@"SpringBoard"]);
+ CFStringRef day(CFDateFormatterCreateStringWithDate(NULL, formatter, now));
+
+ CFRelease(now);
+
+ CFRelease(formatter);
+
+ NSString *datestyle([@""
+ "font-family: Helvetica; "
+ "font-weight: bold; "
+ "color: #333333; "
+ "alpha: 1.0; "
+ "" stringByAppendingString:(IsWild_
+ ? @"font-size: 54px; "
+ : @"font-size: 39px; "
+ )]);
+
+ NSString *daystyle([@""
+ "font-family: Helvetica; "
+ "font-weight: bold; "
+ "color: white; "
+ "text-shadow: rgba(0, 0, 0, 0.2) -1px -1px 2px; "
+ "" stringByAppendingString:(IsWild_
+ ? @"font-size: 11px; "
+ : @"font-size: 9px; "
+ )]);
+
+ if (NSString *style = [Info_ objectForKey:@"CalendarIconDateStyle"])
+ datestyle = [datestyle stringByAppendingString:style];
+ if (NSString *style = [Info_ objectForKey:@"CalendarIconDayStyle"])
+ daystyle = [daystyle stringByAppendingString:style];
+
+ CGFloat width([self bounds].size.width);
+ float leeway(10);
+ CGSize datesize = [(NSString *)date sizeWithStyle:datestyle forWidth:(width + leeway)];
+ CGSize daysize = [(NSString *)day sizeWithStyle:daystyle forWidth:(width + leeway)];
+
+ unsigned base0(IsWild_ ? 89 : 70);
+ if ($GSFontGetUseLegacyFontMetrics())
+ base0 = base0 + 1;
+ unsigned base1(IsWild_ ? 18 : 16);
+
+ if (Four_) {
+ ++base0;
+ ++base1;
+ }
+
+ [(NSString *)date drawAtPoint:CGPointMake(
+ (width + 1 - datesize.width) / 2, (base0 - datesize.height) / 2
+ ) withStyle:datestyle];
+
+ [(NSString *)day drawAtPoint:CGPointMake(
+ (width + 1 - daysize.width) / 2, (base1 - daysize.height) / 2
+ ) withStyle:daystyle];
+
+ CFRelease(date);
+ CFRelease(day);
+}
+
+// %hook -[{NavigationBar,Toolbar} setBarStyle:] {{{
+void $setBarStyle$_(NSString *name, int &style) {
+ if (Debug_)
+ NSLog(@"WB:Debug:%@Style:%d", name, style);
+ NSNumber *number = nil;
+ if (number == nil)
+ number = [Info_ objectForKey:[NSString stringWithFormat:@"%@Style-%d", name, style]];
+ if (number == nil)
+ number = [Info_ objectForKey:[NSString stringWithFormat:@"%@Style", name]];
+ if (number != nil) {
+ style = [number intValue];
+ if (Debug_)
+ NSLog(@"WB:Debug:%@Style=%d", name, style);
+ }
+}
+
+MSInstanceMessageHook1(void, UIToolbar, setBarStyle, int, style) {
+ $setBarStyle$_(@"Toolbar", style);
+ return MSOldCall(style);
+}
+
+MSInstanceMessageHook1(void, UINavigationBar, setBarStyle, int, style) {
+ $setBarStyle$_(@"NavigationBar", style);
+ return MSOldCall(style);
+}
+// }}}
+
+MSHook(void, SBButtonBar$didMoveToSuperview, UIView *self, SEL sel) {
+ [[self superview] setBackgroundColor:[UIColor clearColor]];
+ _SBButtonBar$didMoveToSuperview(self, sel);
+}
+
+MSHook(void, SBStatusBarContentsView$didMoveToSuperview, UIView *self, SEL sel) {
+ [[self superview] setBackgroundColor:[UIColor clearColor]];
+ _SBStatusBarContentsView$didMoveToSuperview(self, sel);
+}
+
+static NSArray *Wallpapers_;
+static bool Papered_;
+static bool Docked_;
+static bool SMSBackgrounded_;
+static NSString *WallpaperFile_;
+static UIImageView *WallpaperImage_;
+static UIWebDocumentView *WallpaperPage_;
+static NSURL *WallpaperURL_;
+
+#define _release(object) \
+ do if (object != nil) { \
+ [object release]; \
+ object = nil; \
+ } while (false)
+
+static UIImage *$getImage$(NSString *path) {
+ UIImage *image([UIImage imageWithContentsOfFile:path]);
+
+ unsigned scale($getScale$(path));
+ if (scale != 1 && [image respondsToSelector:@selector(setScale)])
+ [image setScale:scale];
+
+ return image;
+}
+
+template <typename Original_, typename Modified_>
+_finline UIImage *WBCacheImage(const Modified_ &modified, const Original_ &original, NSString *key) {
+ UIImage *image([Images_ objectForKey:key]);
+ if (image != nil)
+ return reinterpret_cast<id>(image) == [NSNull null] ? original() : image;
+ if (NSString *path = modified())
+ image = $getImage$(path);
+ [Images_ setObject:(image == nil ? [NSNull null] : reinterpret_cast<id>(image)) forKey:key];
+ return image == nil ? original() : image;
+}
+
+static UIImage *$getDefaultDesktopImage$() {
+ if (NSString *path = $getTheme$($useScale$([NSArray arrayWithObjects:@"LockBackground.png", @"LockBackground.jpg", nil])))
+ return $getImage$(path);
+ return nil;
+}
+
+MSClassMessageHook0(UIImage *, UIImage, defaultDesktopImage) {
+ return $getDefaultDesktopImage$() ?: MSOldCall();
+}
+
+MSInstanceMessageHook0(UIImage *, SBSlidingAlertDisplay, _defaultDesktopImage) {
+ return $getDefaultDesktopImage$() ?: MSOldCall();
+}
+
+MSInstanceMessageHook0(void, SBWallpaperView, resetCurrentImageToWallpaper) {
+ for (UIView *parent([self superview]); parent != nil; parent = [parent superview])
+ if ([parent isKindOfClass:$SBSlidingAlertDisplay]) {
+ if (UIImage *image = $getDefaultDesktopImage$()) {
+ [self setImage:image];
+ return;
+ }
+
+ break;
+ }
+
+ MSOldCall();
+}
+
+// %hook -[SBUIController init] {{{
+MSInstanceMessageHook0(id, SBUIController, init) {
+ self = MSOldCall();
+ if (self == nil)
+ return nil;
+
+ NSString *paper($getTheme$(Wallpapers_));
+ if (paper != nil)
+ paper = [paper stringByDeletingLastPathComponent];
+
+ if (Debug_)
+ NSLog(@"WB:Debug:Info = %@", [Info_ description]);
+
+ if (paper != nil) {
+ UIImageView *&_wallpaperView(MSHookIvar<UIImageView *>(self, "_wallpaperView"));
+ if (&_wallpaperView != NULL) {
+ [_wallpaperView removeFromSuperview];
+ [_wallpaperView release];
+ _wallpaperView = nil;
+ }
+ }
+
+ UIView *&_contentLayer(MSHookIvar<UIView *>(self, "_contentLayer"));
+ UIView *&_contentView(MSHookIvar<UIView *>(self, "_contentView"));
+
+ UIView **player;
+ if (&_contentLayer != NULL)
+ player = &_contentLayer;
+ else if (&_contentView != NULL)
+ player = &_contentView;
+ else
+ player = NULL;
+ UIView *layer(player == NULL ? nil : *player);
+
+ UIWindow *window([[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]);
+ UIView *content([[[UIView alloc] initWithFrame:[window frame]] autorelease]);
+ [window setContentView:content];
+
+ UIWindow *&_window(MSHookIvar<UIWindow *>(self, "_window"));
+ [window setBackgroundColor:[_window backgroundColor]];
+ [_window setBackgroundColor:[UIColor clearColor]];
+
+ [window setLevel:-1000];
+ [window setHidden:NO];
+
+ /*if (player != NULL)
+ *player = content;*/
+
+ [content setBackgroundColor:[layer backgroundColor]];
+ [layer setBackgroundColor:[UIColor clearColor]];
+
+ UIView *indirect;
+ if (!SummerBoard_ || !IsWild_)
+ indirect = content;
+ else {
+ CGRect bounds([content bounds]);
+ bounds.origin.y = -30;
+ indirect = [[[UIView alloc] initWithFrame:bounds] autorelease];
+ [content addSubview:indirect];
+ [indirect zoomToScale:2.4];
+ }
+
+ _release(WallpaperFile_);
+ _release(WallpaperImage_);
+ _release(WallpaperPage_);
+ _release(WallpaperURL_);
+
+ if (paper != nil) {
+ NSArray *themes([NSArray arrayWithObject:paper]);
+
+ if (NSString *path = $getTheme$([NSArray arrayWithObject:@"Wallpaper.mp4"], themes)) {
+#if UseAVController
+ NSError *error;
+
+ static AVController *controller_(nil);
+ if (controller_ == nil) {
+ AVQueue *queue([AVQueue avQueue]);
+ controller_ = [[AVController avControllerWithQueue:queue error:&error] retain];
+ }
+
+ AVQueue *queue([controller_ queue]);
+
+ UIView *video([[[UIView alloc] initWithFrame:[indirect bounds]] autorelease]);
+ [controller_ setLayer:[video _layer]];
+
+ AVItem *item([[[AVItem alloc] initWithPath:path error:&error] autorelease]);
+ [queue appendItem:item error:&error];
+
+ [controller_ play:&error];
+#elif UseMPMoviePlayerController
+ NSURL *url([NSURL fileURLWithPath:path]);
+ MPMoviePlayerController *controller = [[$MPMoviePlayerController alloc] initWithContentURL:url];
+ controller.movieControlMode = MPMovieControlModeHidden;
+ [controller play];
+#else
+ MPVideoView *video = [[[$MPVideoView alloc] initWithFrame:[indirect bounds]] autorelease];
+ [video setMovieWithPath:path];
+ [video setRepeatMode:1];
+ [video setRepeatGap:-1];
+ [video playFromBeginning];;
+#endif
+
+ [indirect addSubview:video];
+ }
+
+ if (NSString *path = $getTheme$($useScale$([NSArray arrayWithObjects:@"Wallpaper.png", @"Wallpaper.jpg", nil]), themes)) {
+ if (UIImage *image = $getImage$(path)) {
+ WallpaperFile_ = [path retain];
+ WallpaperImage_ = [[UIImageView alloc] initWithImage:image];
+ if (NSNumber *number = [Info_ objectForKey:@"WallpaperAlpha"])
+ [WallpaperImage_ setAlpha:[number floatValue]];
+ [indirect addSubview:WallpaperImage_];
+ }
+ }
+
+ if (NSString *path = $getTheme$([NSArray arrayWithObject:@"Wallpaper.html"], themes)) {
+ CGRect bounds = [indirect bounds];
+
+ UIWebDocumentView *view([[[$UIWebDocumentView alloc] initWithFrame:bounds] autorelease]);
+ [view setAutoresizes:true];
+
+ WallpaperPage_ = [view retain];
+ WallpaperURL_ = [[NSURL fileURLWithPath:path] retain];
+
+ [WallpaperPage_ loadRequest:[NSURLRequest requestWithURL:WallpaperURL_]];
+
+ [view setBackgroundColor:[UIColor clearColor]];
+ if ([view respondsToSelector:@selector(setDrawsBackground:)])
+ [view setDrawsBackground:NO];
+ [[view webView] setDrawsBackground:NO];
+
+ [indirect addSubview:view];
+ }
+ }
+
+ for (size_t i(0), e([Themes_ count]); i != e; ++i) {
+ NSString *theme = [Themes_ objectAtIndex:(e - i - 1)];
+ NSString *html = [theme stringByAppendingPathComponent:@"Widget.html"];
+ if ([Manager_ fileExistsAtPath:html]) {
+ CGRect bounds = [indirect bounds];
+
+ UIWebDocumentView *view([[[$UIWebDocumentView alloc] initWithFrame:bounds] autorelease]);
+ [view setAutoresizes:true];
+
+ NSURL *url = [NSURL fileURLWithPath:html];
+ [view loadRequest:[NSURLRequest requestWithURL:url]];
+
+ [view setBackgroundColor:[UIColor clearColor]];
+ if ([view respondsToSelector:@selector(setDrawsBackground:)])
+ [view setDrawsBackground:NO];
+ [[view webView] setDrawsBackground:NO];
+
+ [indirect addSubview:view];
+ }
+ }
+
+ return self;
+}
+// }}}
+
+MSHook(void, SBAwayView$updateDesktopImage$, SBAwayView *self, SEL sel, UIImage *image) {
+ NSString *path = $getTheme$([NSArray arrayWithObject:@"LockBackground.html"]);
+ UIView *&_backgroundView(MSHookIvar<UIView *>(self, "_backgroundView"));
+
+ if (path != nil && _backgroundView != nil)
+ path = nil;
+
+ _SBAwayView$updateDesktopImage$(self, sel, image);
+
+ if (path != nil) {
+ CGRect bounds = [self bounds];
+
+ UIWebDocumentView *view([[[$UIWebDocumentView alloc] initWithFrame:bounds] autorelease]);
+ [view setAutoresizes:true];
+
+ if (WallpaperPage_ != nil)
+ [WallpaperPage_ release];
+ WallpaperPage_ = [view retain];
+
+ if (WallpaperURL_ != nil)
+ [WallpaperURL_ release];
+ WallpaperURL_ = [[NSURL fileURLWithPath:path] retain];
+
+ [WallpaperPage_ loadRequest:[NSURLRequest requestWithURL:WallpaperURL_]];
+
+ [[view webView] setDrawsBackground:false];
+ [view setBackgroundColor:[UIColor clearColor]];
+
+ [self insertSubview:view aboveSubview:_backgroundView];
+
+ if ($objc_setAssociatedObject != NULL)
+ $objc_setAssociatedObject(self, @selector(wb$widgetView), view, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+ }
+}
+
+MSHook(void, SBAwayView$_addSubview$positioned$relativeTo$, SBAwayView *self, SEL sel, UIView *view, int positioned, UIView *relative) {
+ UIView *&_backgroundView(MSHookIvar<UIView *>(self, "_backgroundView"));
+ UIView *&_chargingView(MSHookIvar<UIView *>(self, "_chargingView"));
+ if (&_chargingView != NULL)
+ if (positioned == -2 && (relative == _backgroundView && _chargingView == nil || relative == _chargingView))
+ if ($objc_getAssociatedObject != NULL)
+ if (UIView *widget = $objc_getAssociatedObject(self, @selector(wb$widgetView)))
+ relative = widget;
+ return _SBAwayView$_addSubview$positioned$relativeTo$(self, sel, view, positioned, relative);
+}
+
+/*extern "C" CGColorRef CGGStateGetSystemColor(void *);
+extern "C" CGColorRef CGGStateGetFillColor(void *);
+extern "C" CGColorRef CGGStateGetStrokeColor(void *);
+extern "C" NSString *UIStyleStringFromColor(CGColorRef);*/
+
+/* WBTimeLabel {{{ */
+@interface WBTimeLabel : NSProxy {
+ NSString *time_;
+ _transient SBStatusBarTimeView *view_;
+}
+
+- (id) initWithTime:(NSString *)time view:(SBStatusBarTimeView *)view;
+
+@end
+
+@implementation WBTimeLabel
+
+- (void) dealloc {
+ [time_ release];
+ [super dealloc];
+}
+
+- (id) initWithTime:(NSString *)time view:(SBStatusBarTimeView *)view {
+ time_ = [time retain];
+ view_ = view;
+ return self;
+}
+
+- (NSString *) description {
+ return time_;
+}
+
+WBDelegate(time_)
+
+- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)mode {
+ if (NSString *custom = [Info_ objectForKey:@"TimeStyle"]) {
+ BOOL &_mode(MSHookIvar<BOOL>(view_, "_mode"));;
+
+ [time_ drawAtPoint:point withStyle:[NSString stringWithFormat:@""
+ "font-family: Helvetica; "
+ "font-weight: bold; "
+ "font-size: 14px; "
+ "color: %@; "
+ "%@", _mode ? @"white" : @"black", custom]];
+
+ return CGSizeZero;
+ }
+
+ return [time_ drawAtPoint:point forWidth:width withFont:font lineBreakMode:mode];
+}
+
+@end
+/* }}} */
+/* WBBadgeLabel {{{ */
+@interface WBBadgeLabel : NSProxy {
+ NSString *badge_;
+}
+
+- (id) initWithBadge:(NSString *)badge;
+- (NSString *) description;
+
+@end
+
+@implementation WBBadgeLabel
+
+- (void) dealloc {
+ [badge_ release];
+ [super dealloc];
+}
+
+- (id) initWithBadge:(NSString *)badge {
+ badge_ = [badge retain];
+ return self;
+}
+
+- (NSString *) description {
+ return [badge_ description];
+}
+
+WBDelegate(badge_)
+
+- (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; "
+ "font-weight: bold; "
+ "font-size: 17px; "
+ "color: white; "
+ "%@", custom]];
+
+ return CGSizeZero;
+ }
+
+ return [badge_ drawAtPoint:point forWidth:width withFont:font lineBreakMode:mode];
+}
+
+@end
+/* }}} */
+
+// IconAlpha {{{
+MSInstanceMessageHook1(void, SBIcon, setIconImageAlpha, CGFloat, alpha) {
+ if (NSNumber *number = [Info_ objectForKey:@"IconAlpha"])
+ alpha = [number floatValue];
+ return MSOldCall(alpha);
+}
+
+MSInstanceMessageHook1(void, SBIcon, setIconLabelAlpha, CGFloat, alpha) {
+ if (NSNumber *number = [Info_ objectForKey:@"IconAlpha"])
+ alpha = [number floatValue];
+ return MSOldCall(alpha);
+}
+
+MSInstanceMessageHook0(id, SBIcon, initWithDefaultSize) {
+ if ((self = MSOldCall()) != nil) {
+ if (NSNumber *number = [Info_ objectForKey:@"IconAlpha"]) {
+ // XXX: note: this is overridden above, which is silly
+ float alpha([number floatValue]);
+ 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;
+}
+
+MSInstanceMessageHook1(void, SBIcon, setAlpha, CGFloat, alpha) {
+ if (NSNumber *number = [Info_ objectForKey:@"IconAlpha"])
+ alpha = [number floatValue];
+ return MSOldCall(alpha);
+}
+// }}}
+
+MSHook(id, SBIconBadge$initWithBadge$, SBIconBadge *self, SEL sel, NSString *badge) {
+ if ((self = _SBIconBadge$initWithBadge$(self, sel, badge)) != nil) {
+ id &_badge(MSHookIvar<id>(self, "_badge"));
+ if (_badge != nil)
+ if (id label = [[WBBadgeLabel alloc] initWithBadge:[_badge autorelease]])
+ _badge = label;
+ } return self;
+}
+
+void SBStatusBarController$setStatusBarMode(int &mode) {
+ if (Debug_)
+ NSLog(@"WB:Debug:setStatusBarMode:%d", mode);
+ if (mode < 100) // 104:hidden 105:glowing
+ if (NSNumber *number = [Info_ objectForKey:@"StatusBarMode"])
+ mode = [number intValue];
+}
+
+/*MSHook(void, SBStatusBarController$setStatusBarMode$orientation$duration$animation$, SBStatusBarController *self, SEL sel, int mode, int orientation, double duration, int animation) {
+ NSLog(@"mode:%d orientation:%d duration:%f animation:%d", mode, orientation, duration, animation);
+ SBStatusBarController$setStatusBarMode(mode);
+ return _SBStatusBarController$setStatusBarMode$orientation$duration$animation$(self, sel, mode, orientation, duration, animation);
+}*/
+
+MSHook(void, SBStatusBarController$setStatusBarMode$orientation$duration$fenceID$animation$, SBStatusBarController *self, SEL sel, int mode, int orientation, float duration, int fenceID, int animation) {
+ //NSLog(@"mode:%d orientation:%d duration:%f fenceID:%d animation:%d", mode, orientation, duration, fenceID, animation);
+ SBStatusBarController$setStatusBarMode(mode);
+ return _SBStatusBarController$setStatusBarMode$orientation$duration$fenceID$animation$(self, sel, mode, orientation, duration, fenceID, animation);
+}
+
+MSHook(void, SBStatusBarController$setStatusBarMode$orientation$duration$fenceID$animation$startTime$, SBStatusBarController *self, SEL sel, int mode, int orientation, double duration, int fenceID, int animation, double startTime) {
+ //NSLog(@"mode:%d orientation:%d duration:%f fenceID:%d animation:%d startTime:%f", mode, orientation, duration, fenceID, animation, startTime);
+ SBStatusBarController$setStatusBarMode(mode);
+ //NSLog(@"mode=%u", mode);
+ return _SBStatusBarController$setStatusBarMode$orientation$duration$fenceID$animation$startTime$(self, sel, mode, orientation, duration, fenceID, animation, startTime);
+}
+
+/*MSHook(id, SBStatusBarContentsView$initWithStatusBar$mode$, SBStatusBarContentsView *self, SEL sel, id bar, int mode) {
+ if (NSNumber *number = [Info_ objectForKey:@"StatusBarContentsMode"])
+ mode = [number intValue];
+ return _SBStatusBarContentsView$initWithStatusBar$mode$(self, sel, bar, mode);
+}*/
+
+MSHook(NSString *, SBStatusBarOperatorNameView$operatorNameStyle, SBStatusBarOperatorNameView *self, SEL sel) {
+ NSString *style(_SBStatusBarOperatorNameView$operatorNameStyle(self, sel));
+ if (Debug_)
+ NSLog(@"operatorNameStyle= %@", style);
+ if (NSString *custom = [Info_ objectForKey:@"OperatorNameStyle"])
+ style = [NSString stringWithFormat:@"%@; %@", style, custom];
+ return style;
+}
+
+MSHook(void, SBStatusBarOperatorNameView$setOperatorName$fullSize$, SBStatusBarOperatorNameView *self, SEL sel, NSString *name, BOOL full) {
+ if (Debug_)
+ NSLog(@"setOperatorName:\"%@\" fullSize:%u", name, full);
+ return _SBStatusBarOperatorNameView$setOperatorName$fullSize$(self, sel, name, NO);
+}
+
+// XXX: replace this with [SBStatusBarTimeView tile]
+MSHook(void, SBStatusBarTimeView$drawRect$, SBStatusBarTimeView *self, SEL sel, CGRect rect) {
+ id &_time(MSHookIvar<id>(self, "_time"));
+ if (_time != nil && [_time class] != [WBTimeLabel class])
+ object_setInstanceVariable(self, "_time", reinterpret_cast<void *>([[WBTimeLabel alloc] initWithTime:[_time autorelease] view:self]));
+ return _SBStatusBarTimeView$drawRect$(self, sel, rect);
+}
+
+@interface UIView (WinterBoard)
+- (bool) wb$isWBImageView;
+- (void) wb$logHierarchy;
+- (void) wb$setBackgroundColor:(UIColor *)color;
+@end
+
+@implementation UIView (WinterBoard)
+
+- (bool) wb$isWBImageView {
+ return false;
+}
+
+- (void) wb$logHierarchy {
+ WBLogHierarchy(self);
+}
+
+- (void) wb$setBackgroundColor:(UIColor *)color {
+ [self setBackgroundColor:color];
+ for (UIView *child in [self subviews])
+ [child wb$setBackgroundColor:color];
+}
+
+@end
+
+@interface WBImageView : UIImageView {
+}
+
+- (bool) wb$isWBImageView;
+- (void) wb$updateFrame;
+@end
+
+@implementation WBImageView
+
+- (bool) wb$isWBImageView {
+ return true;
+}
+
+- (void) wb$updateFrame {
+ CGRect frame([self frame]);
+ frame.origin.y = 0;
+
+ for (UIView *view(self); ; ) {
+ view = [view superview];
+ if (view == nil)
+ break;
+ frame.origin.y -= [view frame].origin.y;
+ }
+
+ [self setFrame:frame];
+}
+
+@end
+
+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);
+}
+
+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)
+ $addPerPageView$(i, [lists objectAtIndex:i]);
+}
+
+MSInstanceMessageHook0(void, SBIconController, updateNumberOfRootIconLists) {
+ NSArray *&_rootIconLists(MSHookIvar<NSArray *>(self, "_rootIconLists"));
+ $addPerPageViews$(_rootIconLists);
+ return MSOldCall();
+}
+
+MSInstanceMessageHook0(void, SBIconContentView, layoutSubviews) {
+ MSOldCall();
+
+ if (SBIconController *controller = [$SBIconController sharedInstance]) {
+ UIView *&_dockContainerView(MSHookIvar<UIView *>(controller, "_dockContainerView"));
+ if (&_dockContainerView != NULL)
+ [[_dockContainerView superview] bringSubviewToFront:_dockContainerView];
+ }
+}
+
+MSHook(void, SBIconController$noteNumberOfIconListsChanged, SBIconController *self, SEL sel) {
+ SBIconModel *&_iconModel(MSHookIvar<SBIconModel *>(self, "_iconModel"));
+ $addPerPageViews$([_iconModel iconLists]);
+ return _SBIconController$noteNumberOfIconListsChanged(self, sel);
+}
+
+MSHook(id, SBIconLabel$initWithSize$label$, SBIconLabel *self, SEL sel, CGSize size, NSString *label) {
+ self = _SBIconLabel$initWithSize$label$(self, sel, size, label);
+ if (self != nil)
+ [self setClipsToBounds:NO];
+ return self;
+}
+
+MSHook(void, SBIconLabel$setInDock$, SBIconLabel *self, SEL sel, BOOL docked) {
+ static bool gssc(false);
+ if (!gssc) {
+ BOOL (*GSSystemHasCapability)(CFStringRef) = reinterpret_cast<BOOL (*)(CFStringRef)>(dlsym(RTLD_DEFAULT, "GSSystemHasCapability"));
+ Papered_ |= GSSystemHasCapability != NULL && GSSystemHasCapability(CFSTR("homescreen-wallpaper"));
+ gssc = true;
+
+ if ([Info_ objectForKey:@"UndockedIconLabels"] == nil)
+ [Info_ setObject:[NSNumber numberWithBool:(
+ !Papered_ ||
+ [Info_ objectForKey:@"DockedIconLabelStyle"] != nil ||
+ [Info_ objectForKey:@"UndockedIconLabelStyle"] != nil
+ )] forKey:@"UndockedIconLabels"];
+ }
+
+ id &_label(MSHookIvar<id>(self, "_label"));
+ if (![Info_ wb$boolForKey:@"UndockedIconLabels"])
+ docked = true;
+
+ if (_label != nil && [_label respondsToSelector:@selector(setInDock:)])
+ [_label setInDock:docked];
+
+ _SBIconLabel$setInDock$(self, sel, docked);
+ [self setNeedsDisplay];
+}
+
+MSHook(BOOL, SBDockIconListView$shouldShowNewDock, id self, SEL sel) {
+ return SummerBoard_ && Docked_ ? NO : _SBDockIconListView$shouldShowNewDock(self, sel);
+}
+
+MSHook(void, SBDockIconListView$setFrame$, id self, SEL sel, CGRect frame) {
+ _SBDockIconListView$setFrame$(self, sel, frame);
+}
+
+// %hook -[NSBundle localizedStringForKey:value:table:] {{{
+MSInstanceMessageHook3(NSString *, NSBundle, localizedStringForKey,value,table, NSString *, key, NSString *, value, NSString *, table) {
+ NSString *identifier = [self bundleIdentifier];
+ NSLocale *locale = [NSLocale currentLocale];
+ NSString *language = [locale objectForKey:NSLocaleLanguageCode];
+ if (Debug_)
+ NSLog(@"WB:Debug:[NSBundle(%@) localizedStringForKey:\"%@\" value:\"%@\" table:\"%@\"] (%@)", identifier, key, value, table, language);
+ NSString *file = table == nil ? @"Localizable" : table;
+ NSString *name = [NSString stringWithFormat:@"%@:%@", identifier, file];
+ NSDictionary *strings;
+ if ((strings = [Strings_ objectForKey:name]) != nil) {
+ if (static_cast<id>(strings) != [NSNull null]) strings:
+ if (NSString *value = [strings objectForKey:key])
+ return value;
+ } else if (NSString *path = $pathForFile$inBundle$([NSString stringWithFormat:@"%@.lproj/%@.strings",
+ language, file
+ ], self, false)) {
+ if ((strings = [[NSDictionary alloc] initWithContentsOfFile:path]) != nil) {
+ [Strings_ setObject:[strings autorelease] forKey:name];
+ goto strings;
+ } else goto null;
+ } else null:
+ [Strings_ setObject:[NSNull null] forKey:name];
+ return MSOldCall(key, value, table);
+}
+// }}}
+// %hook -[WebCoreFrameBridge renderedSizeOfNode:constrainedToWidth:] {{{
+MSClassHook(WebCoreFrameBridge)
+
+MSInstanceMessageHook2(CGSize, WebCoreFrameBridge, renderedSizeOfNode,constrainedToWidth, id, node, float, width) {
+ if (node == nil)
+ return CGSizeZero;
+ void **core(reinterpret_cast<void **>([node _node]));
+ if (core == NULL || core[6] == NULL)
+ return CGSizeZero;
+ return MSOldCall(node, width);
+}
+// }}}
+
+MSInstanceMessage1(void, SBIconLabel, drawRect, CGRect, rect) {
+ static Ivar drawMoreLegibly = object_getInstanceVariable(self, "_drawMoreLegibly", NULL);
+
+ int docked;
+ Ivar ivar = object_getInstanceVariable(self, "_inDock", reinterpret_cast<void **>(&docked));
+ docked = (docked & (ivar_getOffset(ivar) == ivar_getOffset(drawMoreLegibly) ? 0x2 : 0x1)) != 0;
+
+ NSString *label(MSHookIvar<NSString *>(self, "_label"));
+
+ NSString *style = [NSString stringWithFormat:@""
+ "font-family: Helvetica; "
+ "font-weight: bold; "
+ "color: %@; %@"
+ "", (docked || !SummerBoard_ ? @"white" : @"#b3b3b3"), (IsWild_
+ ? @"font-size: 12px; "
+ : @"font-size: 11px; "
+ )];
+
+ if (IsWild_)
+ style = [style stringByAppendingString:@"text-shadow: rgba(0, 0, 0, 0.5) 0px 1px 0px; "];
+ else if (docked)
+ style = [style stringByAppendingString:@"text-shadow: rgba(0, 0, 0, 0.5) 0px -1px 0px; "];
+
+ NSString *custom([Info_ objectForKey:(docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle")]);
+
+ $drawLabel$(label, [self bounds], style, custom);
+}
+
+MSInstanceMessage0(CGImageRef, SBIconLabel, buildLabelImage) {
+ bool docked((MSHookIvar<unsigned>(self, "_inDock") & 0x2) != 0);
+
+ WBStringDrawingState labelState = {NULL, 0, @""
+ , docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"};