]> git.saurik.com Git - winterboard.git/blobdiff - Library.mm
Per-page wallpaper alignment was broken until jitter.
[winterboard.git] / Library.mm
index 7c9c5946031e14b8f0cf9fde57a8bdc02301ee6b..80001b2c3d92d0a1a3d212f8b62e7bd8cdb9c9b3 100644 (file)
@@ -122,6 +122,7 @@ MSMetaClassHook(UIImage)
 MSClassHook(UINavigationBar)
 MSClassHook(UIToolbar)
 MSClassHook(UIStatusBarTimeItemView)
+MSClassHook(UIWebDocumentView)
 
 MSClassHook(CKBalloonView)
 MSClassHook(CKMessageCell)
@@ -162,6 +163,7 @@ MSClassHook(SBWidgetApplicationIcon)
 extern "C" void WKSetCurrentGraphicsContext(CGContextRef);
 
 static struct MSFixClass { MSFixClass() {
+    $UIWebDocumentView = objc_getClass("UIWebBrowserView") ?: $UIWebDocumentView;
     $SBIcon = objc_getClass("SBIconView") ?: $SBIcon;
 
     if ($SBIconList == nil)
@@ -267,8 +269,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]];
@@ -276,20 +277,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]];
         }
     }
 
@@ -313,8 +314,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;
@@ -339,6 +343,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]];
@@ -715,6 +721,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);
 
@@ -733,7 +785,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;
 }
 
@@ -773,9 +825,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;
 }
@@ -798,7 +850,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) {
@@ -818,12 +870,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;"
+    WBStringDrawingState badgeState = {NULL, -1, @""
     , @"BadgeStyle"};
 
     stringDrawingState_ = &badgeState;
@@ -836,7 +887,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"};
@@ -844,7 +894,6 @@ MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage,
     WBStringDrawingState sizeState = {&dayState, 7, nil, nil};
 
     WBStringDrawingState dateState = {&sizeState, 2, @""
-        "color: #333333;"
     , @"CalendarIconDateStyle"};
 
     stringDrawingState_ = &dateState;
@@ -857,7 +906,6 @@ MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage,
 
 MSInstanceMessageHook1(UIImage *, UIStatusBarTimeItemView, contentsImageForStyle, int, style) {
     WBStringDrawingState timeState = {NULL, 0, @""
-        "color: white;"
     , @"TimeStyle"};
 
     stringDrawingState_ = &timeState;
@@ -1160,7 +1208,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];
@@ -1183,7 +1231,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];
@@ -1214,7 +1262,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)
@@ -1486,11 +1534,20 @@ 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);
 }
 
@@ -1656,7 +1713,6 @@ MSInstanceMessage0(CGImageRef, SBIconLabel, buildLabelImage) {
     bool docked((MSHookIvar<unsigned>(self, "_inDock") & 0x2) != 0);
 
     WBStringDrawingState labelState = {NULL, 0, @""
-        "color: white;"
     , docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle"};
 
     stringDrawingState_ = &labelState;
@@ -1886,7 +1942,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 <typename Type_>
 static void msset(Type_ &function, MSImageRef image, const char *name) {
@@ -1922,7 +1978,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:@" "]);
+    //NSLog(@"XXX:drawP(%@)", [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]);
     return [[WBMarkup sharedMarkup] drawString:self atPoint:point withStyle:style];
 }
 
@@ -1930,6 +1986,7 @@ static void NSString$drawInRect$withStyle$(NSString *self, SEL _cmd, CGRect rect
     WKSetCurrentGraphicsContext(UIGraphicsGetCurrentContext());
     if (style == nil || [style length] == 0)
         style = @"font-family: Helvetica; font-size: 12px";
+    //NSLog(@"XXX:drawR(%@)", [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]);
     return [[WBMarkup sharedMarkup] drawString:self inRect:rect withStyle:style];
 }
 
@@ -1941,10 +1998,6 @@ static CGSize NSString$sizeWithStyle$forWidth$(NSString *self, SEL _cmd, NSStrin
 }
 
 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);
@@ -1970,6 +2023,7 @@ static void SBInitialize() {
     WBRename(SBIconLabel, initWithSize:label:, initWithSize$label$);
     WBRename(SBIconLabel, setInDock:, setInDock$);
 
+    WBRename(SBIconList, didMoveToSuperview, didMoveToSuperview);
     WBRename(SBIconList, setFrame:, setFrame$);
 
     WBRename(SBIconModel, cacheImageForIcon:, cacheImageForIcon$);
@@ -2109,6 +2163,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";