]> git.saurik.com Git - winterboard.git/blobdiff - Library.mm
I need to provide the style retrofit to all UIKit applications.
[winterboard.git] / Library.mm
index 42e2fc0df9465bd43a3be2358993248e935dd9a3..3904ea9ba171dda9aa0fb064565eac93bd0a7374 100644 (file)
@@ -121,6 +121,7 @@ MSClassHook(UIImage)
 MSMetaClassHook(UIImage)
 MSClassHook(UINavigationBar)
 MSClassHook(UIToolbar)
+MSClassHook(UIStatusBarTimeItemView)
 
 MSClassHook(CKBalloonView)
 MSClassHook(CKMessageCell)
@@ -141,6 +142,7 @@ MSClassHook(SBDockIconListView)
 MSClassHook(SBIcon)
 MSClassHook(SBIconBadge)
 MSClassHook(SBIconBadgeFactory)
+MSClassHook(SBIconContentView)
 MSClassHook(SBIconController)
 MSClassHook(SBIconLabel)
 MSClassHook(SBIconList)
@@ -159,13 +161,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);
@@ -852,6 +855,19 @@ MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage,
     return image;
 }
 
+MSInstanceMessageHook1(UIImage *, UIStatusBarTimeItemView, contentsImageForStyle, int, style) {
+    WBStringDrawingState timeState = {NULL, 0, @""
+        "color: white;"
+    , @"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]);
 
@@ -1335,8 +1351,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;
 }
@@ -1474,31 +1494,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);
 }
 
@@ -1613,11 +1655,9 @@ MSInstanceMessage1(void, SBIconLabel, drawRect, CGRect, rect) {
 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;
 
@@ -1813,7 +1853,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;
                 }
             }
         }
@@ -1901,10 +1941,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);
@@ -2069,6 +2105,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";