]> git.saurik.com Git - winterboard.git/commitdiff
Finally remembering to commit stuff.
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 4 Aug 2008 03:18:32 +0000 (03:18 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 4 Aug 2008 03:18:32 +0000 (03:18 +0000)
Library.mm
Nature/Bundles/com.apple.springboard/SBDockBG.png
Nature/Info.plist
control
makefile

index ebc014083b5ef63e1ce4103eac9ad97cac16e9c4..265534286fa545d99b2057692d871889dc78efb8 100644 (file)
@@ -35,7 +35,7 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-#define _trace() NSLog(@"_trace(%u)", __LINE__);
+#define _trace() NSLog(@"WB:_trace(%u)", __LINE__);
 
 #include <objc/runtime.h>
 #include <objc/message.h>
@@ -48,10 +48,14 @@ extern "C" {
 #import <CoreGraphics/CoreGraphics.h>
 
 #import <UIKit/UIColor.h>
+#import <UIKit/UIFont.h>
 #import <UIKit/UIImage.h>
 #import <UIKit/UIImageView.h>
 #import <UIKit/UINavigationBarBackground.h>
 
+#import <UIKit/NSString-UIStringDrawing.h>
+#import <UIKit/NSString-UIStringDrawingDeprecated.h>
+
 #import <UIKit/UIImage-UIImageDeprecated.h>
 
 #import <UIKit/UIView-Geometry.h>
@@ -62,6 +66,7 @@ extern "C" {
 #import <SpringBoard/SBAppWindow.h>
 #import <SpringBoard/SBButtonBar.h>
 #import <SpringBoard/SBContentLayer.h>
+#import <SpringBoard/SBIconLabel.h>
 #import <SpringBoard/SBStatusBarContentsView.h>
 #import <SpringBoard/SBStatusBarTimeView.h>
 #import <SpringBoard/SBUIController.h>
@@ -70,6 +75,7 @@ extern "C" {
 
 @interface NSDictionary (WinterBoard)
 - (UIColor *) colorForKey:(NSString *)key;
+- (BOOL) boolForKey:(NSString *)key;
 @end
 
 @implementation NSDictionary (WinterBoard)
@@ -82,8 +88,16 @@ extern "C" {
     return nil;
 }
 
+- (BOOL) boolForKey:(NSString *)key {
+    if (NSString *value = [self objectForKey:key])
+        return [value boolValue];
+    return NO;
+}
+
 @end
 
+bool Debug_ = false;
+
 /* WinterBoard Backend {{{ */
 #define WBPrefix "wb_"
 
@@ -95,15 +109,19 @@ void WBInject(const char *classname, const char *oldname, IMP newimp, const char
         NSLog(@"WB:Error: failed to inject [%s %s]", classname, oldname);
 }
 
-void WBRename(const char *classname, const char *oldname, IMP newimp) {
+void WBRename(bool instance, const char *classname, const char *oldname, IMP newimp) {
     Class _class = objc_getClass(classname);
     if (_class == nil) {
-        NSLog(@"WB:Warning: cannot find class [%s]", classname);
+        if (Debug_)
+            NSLog(@"WB:Warning: cannot find class [%s]", classname);
         return;
     }
+    if (!instance)
+        _class = object_getClass(_class);
     Method method = class_getInstanceMethod(_class, sel_getUid(oldname));
     if (method == nil) {
-        NSLog(@"WB:Warning: cannot find method [%s %s]", classname, oldname);
+        if (Debug_)
+            NSLog(@"WB:Warning: cannot find method [%s %s]", classname, oldname);
         return;
     }
     size_t namelen = strlen(oldname);
@@ -136,6 +154,7 @@ void WBRename(const char *classname, const char *oldname, IMP newimp) {
 - (id) wb_init;
 - (id) wb_layer;
 - (id) wb_initWithSize:(CGSize)size;
+- (id) wb_initWithSize:(CGSize)size label:(NSString *)label;
 - (id) wb_initWithFrame:(CGRect)frame;
 - (id) wb_initWithCoder:(NSCoder *)coder;
 - (void) wb_setFrame:(CGRect)frame;
@@ -144,14 +163,15 @@ void WBRename(const char *classname, const char *oldname, IMP newimp) {
 - (void) wb_setBarStyle:(int)style;
 - (id) wb_initWithFrame:(CGRect)frame withBarStyle:(int)style withTintColor:(UIColor *)color;
 - (void) wb_setOpaque:(BOOL)opaque;
+- (void) wb_setInDock:(BOOL)docked;
 - (void) wb_didMoveToSuperview;
++ (UIImage *) wb_imageNamed:(NSString *)name inBundle:(NSBundle *)bundle;
 @end
 
 NSMutableDictionary **ImageMap_;
 
-bool Debug_;
-
 NSFileManager *Manager_;
+NSDictionary *English_;
 NSDictionary *Info_;
 NSString *theme_;
 NSString *Wallpaper_;
@@ -167,39 +187,77 @@ NSString *SBApplication$pathForIcon(SBApplication<WinterBoard> *self, SEL sel) {
                     return path; \
             }
 
-        testForIcon([self displayName]);
-        testForIcon(identifier);
-
         if (identifier != nil) {
             NSString *path = [NSString stringWithFormat:@"%@/Bundles/%@/icon.png", theme_, identifier];
             if ([Manager_ fileExistsAtPath:path])
                 return path;
         }
+
+        testForIcon(identifier);
+        testForIcon([self displayName]);
+
+        if (NSString *display = [self displayIdentifier])
+            testForIcon([English_ objectForKey:display]);
+
+        /*if (NSDictionary *strings = [[NSDictionary alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/English.lproj/InfoPlist.strings", [self path]]]) {
+            testForIcon([strings objectForKey:@"UISettingsDisplayName"]);
+
+            _trace();
+            if (NSString *bundle = [strings objectForKey:@"CFBundleName"]) {
+                if ([bundle hasPrefix:@"Mobile"]) {
+                    NSLog(@"bd:%@:%@", bundle, [bundle substringFromIndex:6]);
+                    testForIcon([bundle substringFromIndex:6]);
+                }
+                testForIcon(bundle);
+            }
+        }*/
     }
 
     return [self wb_pathForIcon];
 }
 
-NSString *NSBundle$pathForResource$ofType$(NSBundle<WinterBoard> *self, SEL sel, NSString *resource, NSString *type) {
-    if (Debug_)
-        NSLog(@"WB:Debug: [NSBundle(%@) pathForResource:\"%@.%@\"]", [self bundleIdentifier], resource, type);
-
+NSString *$pathForFileInBundle$(NSString *file) {
     if (theme_ != nil) {
-        NSString *identifier = [self bundleIdentifier];
+        NSString *path = [NSString stringWithFormat:@"%@/Bundles/%@", theme_, file];
+        if ([Manager_ fileExistsAtPath:path])
+            return path;
 
-        if (identifier != nil) {
-            NSString *path = [NSString stringWithFormat:@"%@/Bundles/%@/%@.%@", theme_, identifier, resource, type];
-            if ([Manager_ fileExistsAtPath:path])
-                return path;
-        }
+        #define remapResourceName(oldname, newname) \
+            else if ([file isEqualToString:oldname]) { \
+                NSString *path = [NSString stringWithFormat:@"%@/%@.png", theme_, newname]; \
+                if ([Manager_ fileExistsAtPath:path]) \
+                    return path; \
+            }
 
-        if ([resource isEqualToString:@"SBDockBG"] && [type isEqualToString:@"png"]) {
-            NSString *path = [NSString stringWithFormat:@"%@/Dock.png", theme_];
-            if ([Manager_ fileExistsAtPath:path])
-                return path;
-        }
+        if (false);
+            remapResourceName(@"com.apple.springboard/FSO_BG.png", @"StatusBar")
+            remapResourceName(@"com.apple.springboard/SBDockBG.png", @"Dock")
+            remapResourceName(@"com.apple.springboard/SBWeatherCelsius.png", @"Icons/Weather")
     }
 
+    return nil;
+}
+
+UIImage *UIImage$imageNamed$inBundle$(Class<WinterBoard> self, SEL sel, NSString *name, NSBundle *bundle) {
+    if (Debug_)
+        NSLog(@"WB:Debug: [UIImage(%@) imageNamed:\"%@\"]", [bundle bundleIdentifier], name);
+    if (NSString *identifier = [bundle bundleIdentifier])
+        if (NSString *path = $pathForFileInBundle$([NSString stringWithFormat:@"%@/%@", identifier, name]))
+            return [UIImage imageWithContentsOfFile:path];
+    return [self wb_imageNamed:name inBundle:bundle];
+}
+
+UIImage *UIImage$imageNamed$(Class<WinterBoard> self, SEL sel, NSString *name) {
+    return UIImage$imageNamed$inBundle$(self, sel, name, [NSBundle mainBundle]);
+}
+
+NSString *NSBundle$pathForResource$ofType$(NSBundle<WinterBoard> *self, SEL sel, NSString *resource, NSString *type) {
+    NSString *file = type == nil ? resource : [NSString stringWithFormat:@"%@.%@", resource, type];
+    if (Debug_)
+        NSLog(@"WB:Debug: [NSBundle(%@) pathForResource:\"%@\"]", [self bundleIdentifier], file);
+    if (NSString *identifier = [self bundleIdentifier])
+        if (NSString *path = $pathForFileInBundle$([NSString stringWithFormat:@"%@/%@", identifier, file]))
+            return path;
     return [self wb_pathForResource:resource ofType:type];
 }
 
@@ -291,6 +349,88 @@ id SBContentLayer$initWithSize$(SBContentLayer<WinterBoard> *self, SEL sel, CGSi
     return self;
 }
 
+@interface WBIconLabel : NSProxy {
+    NSString *label_;
+    BOOL docked_;
+}
+
+- (id) initWithLabel:(NSString *)label;
+- (void) setInDock:(BOOL)docked;
+
+@end
+
+@implementation WBIconLabel
+
+- (void) dealloc {
+    [label_ release];
+    [super dealloc];
+}
+
+- (id) initWithLabel:(NSString *)label {
+    label_ = [label retain];
+    return self;
+}
+
+- (BOOL) respondsToSelector:(SEL)sel {
+    return
+        sel == @selector(setInDock:)
+    ? YES : [super respondsToSelector:sel];
+}
+
+- (NSMethodSignature*) methodSignatureForSelector:(SEL)sel {
+    if (NSMethodSignature *sig = [label_ methodSignatureForSelector:sel])
+        return sig;
+    NSLog(@"WB:Error: [WBIconLabel methodSignatureForSelector:(%s)]", sel_getName(sel));
+    return nil;
+}
+
+- (void) forwardInvocation:(NSInvocation*)inv {
+    SEL sel = [inv selector];
+    if ([label_ respondsToSelector:sel])
+        [inv invokeWithTarget:label_];
+    else
+        NSLog(@"WB:Error: [WBIconLabel forwardInvocation:(%s)]", sel_getName(sel));
+}
+
+- (NSString *) _iconLabelStyle {
+    return Info_ == nil ? nil : [Info_ objectForKey:(docked_ ? @"DockIconLabelStyle" : @"IconLabelStyle")];
+}
+
+- (CGSize) drawInRect:(CGRect)rect withFont:(UIFont *)font lineBreakMode:(int)mode alignment:(int)alignment {
+    if (NSString *custom = [self _iconLabelStyle]) {
+        [label_ drawInRect:rect withStyle:[NSString stringWithFormat:@"font-family: Helvetica; font-weight: bold; font-size: 11px; text-align: center; %@", custom]];
+        return CGSizeZero;
+    }
+
+    return [label_ drawInRect:rect withFont:font lineBreakMode:mode alignment:alignment];
+}
+
+- (void) drawInRect:(CGRect)rect withStyle:(NSString *)style {
+    if (NSString *custom = [self _iconLabelStyle])
+        return [label_ drawInRect:rect withStyle:[NSString stringWithFormat:@"%@; %@", style, custom]];
+    return [label_ drawInRect:rect withStyle:style];
+}
+
+- (void) setInDock:(BOOL)docked {
+    docked_ = docked;
+}
+
+@end
+
+void SBIconLabel$setInDock$(SBIconLabel<WinterBoard> *self, SEL sel, BOOL docked) {
+    id label;
+    object_getInstanceVariable(self, "_label", (void **) &label);
+    if (Info_ == nil || [Info_ boolForKey:@"IconLabelInDock"])
+        docked = YES;
+    if (label != nil && [label respondsToSelector:@selector(setInDock:)])
+        [label setInDock:docked];
+    return [self wb_setInDock:docked];
+}
+
+id SBIconLabel$initWithSize$label$(SBIconLabel<WinterBoard> *self, SEL sel, CGSize size, NSString *label) {
+    return [self wb_initWithSize:size label:[[[WBIconLabel alloc] initWithLabel:label] autorelease]];
+}
+
 extern "C" void FindMappedImages(void);
 extern "C" NSData *UIImagePNGRepresentation(UIImage *);
 
@@ -320,20 +460,28 @@ extern "C" void WBInitialize() {
         [pool release];
     }*/
 
+    English_ = [[NSDictionary alloc] initWithContentsOfFile:@"/System/Library/CoreServices/SpringBoard.app/English.lproj/LocalizedApplicationNames.strings"];
+    if (English_ != nil)
+        English_ = [English_ retain];
+
     Manager_ = [[NSFileManager defaultManager] retain];
 
     //WBRename("SBStatusBarContentsView", "setBackgroundColor:", (IMP) &$setBackgroundColor$);
     //WBRename("UINavigationBar", "initWithFrame:", (IMP) &UINavigationBar$initWithFrame$);
     //WBRename("UINavigationBar", "initWithCoder:", (IMP) &UINavigationBar$initWithCoder$);
-    WBRename("UINavigationBar", "setBarStyle:", (IMP) &UINavigationBar$setBarStyle$);
+    WBRename(true, "UINavigationBar", "setBarStyle:", (IMP) &UINavigationBar$setBarStyle$);
     //WBRename("UINavigationBarBackground", "initWithFrame:withBarStyle:withTintColor:", (IMP) &UINavigationBarBackground$initWithFrame$withBarStyle$withTintColor$);
     //WBRename("SBStatusBarContentsView", "initWithFrame:", (IMP) &SBStatusBarContentsView$initWithFrame$);
 
-    WBRename("SBApplication", "pathForIcon", (IMP) &SBApplication$pathForIcon);
-    WBRename("NSBundle", "pathForResource:ofType:", (IMP) &NSBundle$pathForResource$ofType$);
-    WBRename("SBContentLayer", "initWithSize:", (IMP) &SBContentLayer$initWithSize$);
-    WBRename("SBStatusBarContentsView", "didMoveToSuperview", (IMP) &$didMoveToSuperview);
-    WBRename("SBButtonBar", "didMoveToSuperview", (IMP) &$didMoveToSuperview);
+    WBRename(false, "UIImage", "imageNamed:inBundle:", (IMP) &UIImage$imageNamed$inBundle$);
+    WBRename(false, "UIImage", "imageNamed:", (IMP) &UIImage$imageNamed$);
+    WBRename(true, "SBApplication", "pathForIcon", (IMP) &SBApplication$pathForIcon);
+    WBRename(true, "NSBundle", "pathForResource:ofType:", (IMP) &NSBundle$pathForResource$ofType$);
+    WBRename(true, "SBContentLayer", "initWithSize:", (IMP) &SBContentLayer$initWithSize$);
+    WBRename(true, "SBStatusBarContentsView", "didMoveToSuperview", (IMP) &$didMoveToSuperview);
+    WBRename(true, "SBButtonBar", "didMoveToSuperview", (IMP) &$didMoveToSuperview);
+    WBRename(true, "SBIconLabel", "setInDock:", (IMP) &SBIconLabel$setInDock$);
+    WBRename(true, "SBIconLabel", "initWithSize:label:", (IMP) &SBIconLabel$initWithSize$label$);
 
     if (NSDictionary *settings = [[NSDictionary alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/Library/Preferences/com.saurik.WinterBoard.plist", NSHomeDirectory()]]) {
         [settings autorelease];
index 4904b93db229d7e9769a01faf612d18af9e953f9..a8c73e6f13030a7a505a2224e180ed13a66ee1b9 100644 (file)
Binary files a/Nature/Bundles/com.apple.springboard/SBDockBG.png and b/Nature/Bundles/com.apple.springboard/SBDockBG.png differ
index 69b69dcc1c81ad387c722b3f7c88b23d3298e2d7..e4f7da0ecd800490a353973a304730d32984aebd 100644 (file)
@@ -5,4 +5,10 @@
 <key>NavigationBarStyle</key>
 <string>1</string>
 
+<key>IconLabelStyle</key>
+<string>color: white</string>
+
+<key>DockIconLabelStyle</key>
+<string>color: burlywood</string>
+
 </dict></plist>
diff --git a/control b/control
index ad24cef77461a7ffe63f9dc592a816907c961672..01cd1711e573b39b42593cd1c28f09ecc572026e 100644 (file)
--- a/control
+++ b/control
@@ -3,11 +3,11 @@ Priority: optional
 Section: Themes
 Maintainer: Jay Freeman (saurik) <saurik@saurik.com>
 Architecture: iphoneos-arm
-Version: 0.9.2501-2
+Version: 0.9.2501-4
 Description: more powerful, open-source SummerBoard
  This tool lets you apply SummerBoard themes. Themes are taken from /Library/Themes (or, now, the older SummerBoard folder). Right now the tool is /very/ simplistic: I have spent about a day coding it so that we would have some stronger theme support on iPhone 2.x. After you install or uninstall this package you will have to /reboot/ (seriously, REBOOT) your phone to it to take effect.
  
- More work will be done on this package in the very near future to make it actually have an interface ;P. (Also, the wallpaper is cut off at the bottom under the dock. I'm working on that still. That has to be done special on 2.x.)
+ More work will be done on this package in the very near future to make it actually have an interface ;P.
  
  WinterBoard is /much/ more powerful than SummerBoard and lets you theme almost any graphic on the system. You can even easily theme .artwork files without having to hack their contents. Instructions on how this works will be posted soon on the More Information page.
 Name: WinterBoard
index 4310cb7e9b707374bc294f384bc098f722cf3d97..08cdfad097072eb8d41e48d45a2eb7aa5968d419 100644 (file)
--- a/makefile
+++ b/makefile
@@ -10,7 +10,7 @@ clean:
        rm -f WinterBoard WinterBoard.dylib
 
 WinterBoard.dylib: Library.mm makefile
-       $(target)g++ -dynamiclib -g0 -O2 -Wall -Werror -o $@ $(filter %.mm,$^) -framework UIKit -framework CoreFoundation -framework Foundation -lobjc -init _WBInitialize -I/apl/inc/iPhoneOS-2.0
+       $(target)g++ -dynamiclib -g0 -O2 -Wall -Werror -o $@ $(filter %.mm,$^) -framework UIKit -framework CoreFoundation -framework Foundation -lobjc -init _WBInitialize -I/apl/inc/iPhoneOS-2.0 -framework CoreGraphics
 
 WinterBoard: Application.mm makefile
        $(target)g++ -g0 -O2 -Wall -Werror -o $@ $(filter %.mm,$^) -framework UIKit -framework Foundation -framework CoreFoundation -lobjc -framework CoreGraphics
@@ -23,6 +23,6 @@ package:
        cp -a Nature winterboard/Library/Themes/com.saurik.WinterBoard.Nature
        cp -a control preinst postinst prerm winterboard/DEBIAN
        cp -a Test.sh icon.png WinterBoard.dylib WinterBoard Info.plist ../pledit/pledit winterboard/Applications/WinterBoard.app
-       dpkg-deb -b winterboard winterboard_0.9.2501-2_iphoneos-arm.deb
+       dpkg-deb -b winterboard winterboard_0.9.2501-4_iphoneos-arm.deb
 
 .PHONY: all clean package