]> git.saurik.com Git - winterboard.git/blobdiff - Library.mm
Fix icon image alpha code on 3.1.2.
[winterboard.git] / Library.mm
index 55dfeb02497f51acef549d1198a09262d76c479d..9a04fb556c6817f5dfd8bcda475ad7d536610972 100644 (file)
@@ -141,6 +141,7 @@ MSClassHook(SBDockIconListView)
 MSClassHook(SBIcon)
 MSClassHook(SBIconBadge)
 MSClassHook(SBIconBadgeFactory)
+MSClassHook(SBIconContentView)
 MSClassHook(SBIconController)
 MSClassHook(SBIconLabel)
 MSClassHook(SBIconList)
@@ -159,13 +160,14 @@ MSClassHook(SBWidgetApplicationIcon)
 
 extern "C" void WKSetCurrentGraphicsContext(CGContextRef);
 
-__attribute__((__constructor__))
-static void MSFixClass() {
-    if ($SBIcon == nil)
-        $SBIcon = objc_getClass("SBIconView");
+static struct MSFixClass { MSFixClass() {
+    $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 +202,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);
@@ -676,6 +678,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_;
@@ -683,7 +714,9 @@ static struct WBStringDrawingState {
     NSString *info_;
 } *stringDrawingState_;
 
-MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode,letterSpacing,includeEmoji, CGPoint, point, float, width, UIFont *, font, int, mode, float, spacing, BOOL, emoji) {
+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, spacing, emoji);
@@ -703,7 +736,11 @@ MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreak
     return CGSizeZero;
 }
 
-MSInstanceMessageHook7(CGSize, NSString, _drawInRect,withFont,lineBreakMode,alignment,lineSpacing,includeEmoji,truncationRect, CGRect, rect, UIFont *, font, int, mode, int, alignment, float, spacing, BOOL, emoji, CGRect, truncation) {
+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(rect, font, mode, alignment, spacing, emoji, truncation);
@@ -720,24 +757,31 @@ MSInstanceMessageHook7(CGSize, NSString, _drawInRect,withFont,lineBreakMode,alig
     NSString *textAlign;
     switch (alignment) {
         default:
-        case WebTextAlignmentLeft:
+        case UITextAlignmentLeft:
             textAlign = @"left";
             break;
-        case WebTextAlignmentCenter:
+        case UITextAlignmentCenter:
             textAlign = @"center";
             break;
-        case WebTextAlignmentRight:
+        case UITextAlignmentRight:
             textAlign = @"right";
             break;
     }
 
     NSString *base(state->base_ ?: @"");
     NSString *extra([NSString stringWithFormat:@"text-align: %@", textAlign]);
-    [self drawInRect:rect withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], extra, base, info]];
+
+    if (true)
+        $drawLabel$(self, rect, [NSString stringWithFormat:@"%@;%@", [font markupDescription], base], info);
+    else
+        [self drawInRect:rect withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], extra, base, info]];
+
     return CGSizeZero;
 }
 
-MSInstanceMessageHook4(CGSize, NSString, sizeWithFont,forWidth,lineBreakMode,letterSpacing, UIFont *, font, float, width, int, mode, float, spacing) {
+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);
@@ -757,6 +801,8 @@ MSInstanceMessageHook4(CGSize, NSString, sizeWithFont,forWidth,lineBreakMode,let
 }
 
 MSInstanceMessageHook1(CGSize, NSString, sizeWithFont, UIFont *, font) {
+    //NSLog(@"XXX: ?\"%@\"", self);
+
     WBStringDrawingState *state(stringDrawingState_);
     if (state == NULL)
         return MSOldCall(font);
@@ -1208,7 +1254,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<BOOL>(view_, "_mode"));;
 
@@ -1255,7 +1301,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; "
@@ -1291,8 +1337,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;
 }
@@ -1430,31 +1480,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<SBIconModel *>(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<NSArray *>(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<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);
 }
 
@@ -1539,8 +1611,6 @@ MSInstanceMessageHook2(CGSize, WebCoreFrameBridge, renderedSizeOfNode,constraine
 // }}}
 
 MSInstanceMessage1(void, SBIconLabel, drawRect, CGRect, rect) {
-    CGRect bounds = [self bounds];
-
     static Ivar drawMoreLegibly = object_getInstanceVariable(self, "_drawMoreLegibly", NULL);
 
     int docked;
@@ -1563,46 +1633,23 @@ MSInstanceMessage1(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));
-
-        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 (NSString *custom = [Info_ objectForKey:(docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle")])
-        style = [style stringByAppendingString:custom];
-
-    CGSize size = [label sizeWithStyle:style forWidth:bounds.size.width];
-    [label drawAtPoint:CGPointMake((bounds.size.width - size.width) / 2, 0) withStyle:style];
+    $drawLabel$(label, [self bounds], style, custom);
 }
 
 MSInstanceMessage0(CGImageRef, SBIconLabel, buildLabelImage) {
     bool docked((MSHookIvar<unsigned>(self, "_inDock") & 0x2) != 0);
 
-    WBStringDrawingState labelState = {NULL, 0, [NSString stringWithFormat:@""
-        "color: %@;"
-    ,
-        (docked || !SummerBoard_ ? @"white" : @"#b3b3b3")
-    ], docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"};
+    WBStringDrawingState labelState = {NULL, 0, @""
+        "color: white;"
+    , docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"};
 
     stringDrawingState_ = &labelState;
 
+    //NSLog(@"XXX: +");
     CGImageRef image(MSOldCall());
+    //NSLog(@"XXX: -");
 
     stringDrawingState_ = NULL;
     return image;
@@ -1792,7 +1839,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;
                 }
             }
         }
@@ -1861,6 +1908,7 @@ 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];
 }
 
@@ -1874,6 +1922,7 @@ static void NSString$drawInRect$withStyle$(NSString *self, SEL _cmd, CGRect rect
 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];
 }
 
@@ -1899,7 +1948,7 @@ 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
         WBRename(SBIconLabel, buildLabelImage, buildLabelImage);
@@ -1949,6 +1998,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"])