/* * Five-Icon SpringBoard (FCSB) by Yanik Magnan * http://r-ch.net */ /* * Redistribution and use in source and binary * forms, with or without modification, are permitted * provided that the following conditions are met: * * 1. Redistributions of source code must retain the * above copyright notice, this list of conditions * and the following disclaimer. * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions * and the following disclaimer in the documentation * and/or other materials provided with the * distribution. * 3. The name of the author may not be used to endorse * or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #import #import #include #include @protocol Tweak - (int) fcsb_maxIconColumns; - (int) fcsb_maxIconRows; - (float) fcsb_leftMarginForIconRowArray:(NSArray *)row; - (void) fcsb_setOrigin:(CGPoint) origin; - (void) fcsb_setAllowJitter:(BOOL) value; @end static BOOL isEnabled() { NSStringEncoding encode = (NSStringEncoding) 1; NSString* state = [[NSString alloc] initWithContentsOfFile:@"/Library/FCSB/state" encoding:encode error:NULL]; return [state hasPrefix:@"on"]; } static bool isADock(SBIconList* obj) { return [obj isKindOfClass:NSClassFromString(@"SBButtonBar")]; } static int $SBIconList$maxIconColumns(SBIconList *self, SEL sel) { if(isADock(self)) return [self fcsb_maxIconColumns]; return 5; } static int $SBIconList$maxIconRows(SBIconList *self, SEL sel) { if(isADock(self)) return [self fcsb_maxIconRows]; return 4; } static float $SBIconList$leftMarginForIconRowArray$(SBIconList *self, SEL sel, NSArray *row) { if(isADock(self)) return [self fcsb_leftMarginForIconRowArray:row]; return 4.0; } static void $SBIcon$setAllowJitter$(SBIcon *self, SEL sel, BOOL value) { [self fcsb_setAllowJitter:NO]; } static void $SBIcon$setOrigin$(SBIcon *self, SEL sel, CGPoint origin) { SBIconList* parent = (SBIconList*) [self superview]; float padding = [parent verticalIconPadding]; [self setAllowJitter:NO]; CGPoint orig_origin = origin; int x = (int) orig_origin.x; // 11 is the y coordinate at which dock icons appear if (!isADock(parent)) { switch(x) { case 17: origin.x = 256; origin.y -= (74+padding); break; case 80: origin.x -= 13; break; case 156: origin.x -= 26; break; case 232: origin.x -= 39; break; } } [self fcsb_setOrigin:origin]; } extern "C" void TweakInitialize() { if ((objc_getClass("SpringBoard") == nil) || (isEnabled() == NO)) return; NSLog(@"FCSB (Five-Column SpringBoard) by Yanik Magnan - the kate is a lie"); Class $SBIconList(objc_getClass("SBIconList")); MSHookMessage($SBIconList, @selector(maxIconColumns), (IMP) &$SBIconList$maxIconColumns, "fcsb_"); MSHookMessage($SBIconList, @selector(maxIconRows), (IMP) &$SBIconList$maxIconRows, "fcsb_"); MSHookMessage($SBIconList, @selector(leftMarginForIconRowArray:), (IMP) &$SBIconList$leftMarginForIconRowArray$, "fcsb_"); Class $SBIcon(objc_getClass("SBIcon")); MSHookMessage($SBIcon, @selector(setOrigin:), (IMP) &$SBIcon$setOrigin$, "fcsb_"); MSHookMessage($SBIcon, @selector(setAllowJitter:), (IMP) &$SBIcon$setAllowJitter$, "fcsb_"); }