MSClassHook(CKTimestampView)
MSClassHook(CKTranscriptCell)
MSClassHook(CKTranscriptController)
+MSClassHook(CKTranscriptHeaderView)
MSClassHook(CKTranscriptTableView)
MSClassHook(SBApplication)
static struct WBStringDrawingState {
WBStringDrawingState *next_;
+ unsigned count_;
NSString *base_;
NSString *info_;
} *stringDrawingState_;
MSInstanceMessageHook4(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode, CGPoint, point, float, width, UIFont *, font, int, mode) {
- if (stringDrawingState_ == NULL || stringDrawingState_->info_ == nil)
+ WBStringDrawingState *state(stringDrawingState_);
+ if (state == NULL)
return MSOldCall(point, width, font, mode);
- NSString *info([Info_ objectForKey:stringDrawingState_->info_]);
- if (info == nil)
+ if (--state->count_ == 0)
+ stringDrawingState_ = state->next_;
+ if (state->info_ == nil)
return MSOldCall(point, width, font, mode);
- NSString *base(stringDrawingState_->base_ ?: @"");
- stringDrawingState_ = stringDrawingState_->next_;
+ NSString *info([Info_ objectForKey:state->info_]);
+ if (info == nil)
+ return MSOldCall(point, width, font, mode);
+ NSString *base(state->base_ ?: @"");
[self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info]];
return CGSizeZero;
}
MSInstanceMessageHook2(CGSize, NSString, drawAtPoint,withFont, CGPoint, point, UIFont *, font) {
- if (stringDrawingState_ == NULL || stringDrawingState_->info_ == nil)
+ WBStringDrawingState *state(stringDrawingState_);
+ if (state == NULL)
return MSOldCall(point, font);
- NSString *info([Info_ objectForKey:stringDrawingState_->info_]);
- if (info == nil)
+ if (--state->count_ == 0)
+ stringDrawingState_ = state->next_;
+ if (state->info_ == nil)
return MSOldCall(point, font);
- NSString *base(stringDrawingState_->base_ ?: @"");
- stringDrawingState_ = stringDrawingState_->next_;
+ NSString *info([Info_ objectForKey:state->info_]);
+ if (info == nil)
+ return MSOldCall(point, font);
+ NSString *base(state->base_ ?: @"");
[self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info]];
return CGSizeZero;
}
+MSInstanceMessageHook1(CGSize, NSString, sizeWithFont, UIFont *, font) {
+ WBStringDrawingState *state(stringDrawingState_);
+ if (state == NULL)
+ return MSOldCall(font);
+
+ if (--state->count_ == 0)
+ stringDrawingState_ = state->next_;
+ if (state->info_ == nil)
+ return MSOldCall(font);
+
+ NSString *info([Info_ objectForKey:state->info_]);
+ if (info == nil)
+ return MSOldCall(font);
+
+ NSString *base(state->base_ ?: @"");
+ return [self sizeWithStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info] forWidth:65535];
+}
+
MSInstanceMessageHook1(UIImage *, SBIconBadgeFactory, checkoutBadgeImageForText, NSString *, text) {
- WBStringDrawingState badgeState = {NULL, @""
+ WBStringDrawingState badgeState = {NULL, 1, @""
"color: white;"
, @"BadgeStyle"};
}
MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage, int, type) {
- WBStringDrawingState dayState = {NULL, @""
+ 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"};
- WBStringDrawingState dateState = {&dayState, @""
+ WBStringDrawingState sizeState = {&dayState, 7, nil, nil};
+
+ WBStringDrawingState dateState = {&sizeState, 2, @""
"color: #333333;"
, @"CalendarIconDateStyle"};
IsWild_ = machine != NULL && strncmp(machine, "iPad", 4) == 0;
}
- BOOL (*GSSystemHasCapability)(CFStringRef) = reinterpret_cast<BOOL (*)(CFStringRef)>(dlsym(RTLD_DEFAULT, "GSSystemHasCapability"));
-
- if ([Info_ objectForKey:@"UndockedIconLabels"] == nil)
- [Info_ setObject:[NSNumber numberWithBool:(
- !(paper != nil || GSSystemHasCapability != NULL && GSSystemHasCapability(CFSTR("homescreen-wallpaper"))) ||
- [Info_ objectForKey:@"DockedIconLabelStyle"] != nil ||
- [Info_ objectForKey:@"UndockedIconLabelStyle"] != nil
- )] forKey:@"UndockedIconLabels"];
-
if (Debug_)
NSLog(@"WB:Debug:Info = %@", [Info_ description]);
@interface UIView (WinterBoard)
- (bool) wb$isWBImageView;
- (void) wb$logHierarchy;
+- (void) wb$setBackgroundColor:(UIColor *)color;
@end
@implementation UIView (WinterBoard)
WBLogHierarchy(self);
}
+- (void) wb$setBackgroundColor:(UIColor *)color {
+ [self setBackgroundColor:color];
+ for (UIView *child in [self subviews])
+ [child wb$setBackgroundColor:color];
+}
+
@end
@interface WBImageView : UIImageView {
}
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;
}
// ChatKit {{{
+MSInstanceMessageHook0(void, CKTranscriptHeaderView, layoutSubviews) {
+ [self wb$setBackgroundColor:[UIColor clearColor]];
+ return MSOldCall();
+}
+
MSInstanceMessageHook1(void, CKMessageCell, addBalloonView, CKBalloonView *, balloon) {
MSOldCall(balloon);
[balloon setBackgroundColor:[UIColor clearColor]];
MSInstanceMessageHook1(void, CKTranscriptCell, setBackgroundColor, UIColor *, color) {
MSOldCall([UIColor clearColor]);
+ [[self contentView] wb$setBackgroundColor:[UIColor clearColor]];
}
MSInstanceMessageHook2(id, CKTranscriptCell, initWithStyle,reuseIdentifier, int, style, NSString *, reuse) {
if ((self = MSOldCall(style, reuse)) != nil) {
[self setBackgroundColor:[UIColor clearColor]];
- [[self contentView] setBackgroundColor:[UIColor clearColor]];
+ [[self contentView] wb$setBackgroundColor:[UIColor clearColor]];
} return self;
}
SummerBoard_ = [value boolValue];
if (NSNumber *value = [settings objectForKey:@"Debug"])
Debug_ = [value boolValue];
+ if (NSNumber *value = [settings objectForKey:@"RecordUI"])
+ UIDebug_ = [value boolValue];
NSArray *themes([settings objectForKey:@"Themes"]);
if (themes == nil)
// SpringBoard {{{
if (SpringBoard_) {
Wallpapers_ = [[NSArray arrayWithObjects:@"Wallpaper.mp4", @"Wallpaper@2x.png", @"Wallpaper@2x.jpg", @"Wallpaper.png", @"Wallpaper.jpg", @"Wallpaper.html", nil] retain];
+ Papered_ = $getTheme$(Wallpapers_) != nil;
Docked_ = $getTheme$([NSArray arrayWithObjects:@"Dock.png", nil]);
CFNotificationCenterAddObserver(
}
// }}}
- if (Debug_ && [Manager_ fileExistsAtPath:@"/tmp/UIImages"])
- UIDebug_ = true;
+ if (UIDebug_ && ![Manager_ fileExistsAtPath:@"/tmp/UIImages"]) {
+ NSError *error(nil);
+ if (![Manager_ createDirectoryAtPath:@"/tmp/UIImages" withIntermediateDirectories:NO attributes:[NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithShort:0777], NSFilePosixPermissions,
+ nil] error:&error])
+ NSLog(@"WB:Error: cannot create /tmp/UIImages (%@)", error);
+ }
[pool release];
}