+#include <substrate.h>
+
+#import <Foundation/NSArray.h>
+#import <Foundation/NSNull.h>
+#import <CoreGraphics/CGGeometry.h>
+#import <SpringBoard/SBButtonBar.h>
+#import <SpringBoard/SBIcon.h>
+
+@protocol Tweak
+- (float) fid_leftMarginForIconRowArray:(NSArray *)row;
+- (void) fid_setOrigin:(CGPoint)origin;
+- (float) fid_topIconPadding;
+@end
+
+static bool $SBButtonBar$$isCrowded(SBButtonBar<Tweak> *self) {
+ NSArray *matrix;
+ object_getInstanceVariable(self, "_iconMatrix", reinterpret_cast<void **>(&matrix));
+ NSArray *row([matrix objectAtIndex:0]);
+ return row != nil && [row indexOfObject:[NSNull null]] == NSNotFound;
+}
+
+static float $SBButtonBar$leftMarginForIconRowArray$(SBButtonBar<Tweak> *self, SEL sel, NSArray *row) {
+ return [row indexOfObject:[NSNull null]] == NSNotFound ? 4 : [self fid_leftMarginForIconRowArray:row];
+}
+
+static int $SBButtonBar$maxIconColumns(SBButtonBar<Tweak> *self, SEL sel) {
+ return 5;
+}
+
+static float $SBButtonBar$topIconPadding(SBButtonBar<Tweak> *self, SEL sel) {
+ float padding([self fid_topIconPadding]);
+ if ($SBButtonBar$$isCrowded(self))
+ --padding;
+ return padding;
+}
+
+static float $SBButtonBar$verticalIconPadding(SBButtonBar<Tweak> *self, SEL sel) {
+ return 0;
+}
+
+static void $SBIcon$setOrigin$(SBIcon<Tweak> *self, SEL sel, CGPoint origin) {
+ if (origin.y == 10)
+ origin.x = (origin.x - 4) / 76 * 63 + 4;
+ else if (origin.y == 84) {
+ origin.y -= 74;
+ origin.x = 256;
+ } else goto set;
+ ++origin.y;
+ set:
+ [self fid_setOrigin:origin];
+}
+
+extern "C" void TweakInitialize() {
+ if (objc_getClass("SpringBoard") == nil)
+ return;
+
+ Class $SBButtonBar(objc_getClass("SBButtonBar"));
+ MSHookMessage($SBButtonBar, @selector(leftMarginForIconRowArray:), (IMP) &$SBButtonBar$leftMarginForIconRowArray$, "fid_");
+ MSHookMessage($SBButtonBar, @selector(maxIconColumns), (IMP) &$SBButtonBar$maxIconColumns, "fid_");
+ MSHookMessage($SBButtonBar, @selector(topIconPadding), (IMP) &$SBButtonBar$topIconPadding, "fid_");
+ MSHookMessage($SBButtonBar, @selector(verticalIconPadding), (IMP) &$SBButtonBar$verticalIconPadding, "fid_");
+
+ Class $SBIcon(objc_getClass("SBIcon"));
+ MSHookMessage($SBIcon, @selector(setOrigin:), (IMP) $SBIcon$setOrigin$, "fid_");
+}