ios_app.c (3386B)
1 #include <CoreGraphics/CGGeometry.h> 2 #include <objc/message.h> 3 #include <objc/objc.h> 4 #include <objc/runtime.h> 5 6 extern int UIApplicationMain(int argc, char** argv, id principal_class_name, 7 id delegate_class_name); 8 9 static SEL kit_sel(const char* name) { 10 return sel_registerName(name); 11 } 12 13 static id kit_msg_id(id receiver, const char* name) { 14 return ((id(*)(id, SEL))objc_msgSend)(receiver, kit_sel(name)); 15 } 16 17 static id kit_msg_id_cstr(id receiver, const char* name, const char* arg) { 18 return ((id(*)(id, SEL, const char*))objc_msgSend)(receiver, kit_sel(name), 19 arg); 20 } 21 22 static id kit_msg_id_rect(id receiver, const char* name, CGRect arg) { 23 return ((id(*)(id, SEL, CGRect))objc_msgSend)(receiver, kit_sel(name), arg); 24 } 25 26 static CGRect kit_msg_rect(id receiver, const char* name) { 27 return ((CGRect(*)(id, SEL))objc_msgSend)(receiver, kit_sel(name)); 28 } 29 30 static void kit_msg_void(id receiver, const char* name) { 31 ((void (*)(id, SEL))objc_msgSend)(receiver, kit_sel(name)); 32 } 33 34 static void kit_msg_void_id(id receiver, const char* name, id arg) { 35 ((void (*)(id, SEL, id))objc_msgSend)(receiver, kit_sel(name), arg); 36 } 37 38 static BOOL kit_app_did_finish_launching(id self, SEL op, id app, 39 id options) { 40 (void)op; 41 (void)app; 42 (void)options; 43 44 id screen = kit_msg_id((id)objc_getClass("UIScreen"), "mainScreen"); 45 CGRect bounds = kit_msg_rect(screen, "bounds"); 46 id window = kit_msg_id_rect( 47 kit_msg_id((id)objc_getClass("UIWindow"), "alloc"), "initWithFrame:", 48 bounds); 49 id view_controller = 50 kit_msg_id(kit_msg_id((id)objc_getClass("UIViewController"), "alloc"), 51 "init"); 52 id view = kit_msg_id(view_controller, "view"); 53 id color = kit_msg_id((id)objc_getClass("UIColor"), "whiteColor"); 54 Ivar window_ivar = class_getInstanceVariable(object_getClass(self), "_window"); 55 56 kit_msg_void_id(view, "setBackgroundColor:", color); 57 kit_msg_void_id(window, "setRootViewController:", view_controller); 58 kit_msg_void(window, "makeKeyAndVisible"); 59 (void)kit_msg_id(window, "retain"); 60 if (window_ivar) object_setIvar(self, window_ivar, window); 61 return YES; 62 } 63 64 static const char* kit_delegate_class_name(void) { 65 return "KitCSmokeAppDelegate"; 66 } 67 68 static void kit_register_delegate_class(void) { 69 const char* name = kit_delegate_class_name(); 70 Class superclass = (Class)objc_getClass("UIResponder"); 71 Class delegate = objc_allocateClassPair(superclass, name, 0); 72 if (!delegate) return; 73 74 (void)class_addIvar(delegate, "_window", sizeof(id), 75 sizeof(id) == 8 ? 3 : 2, "@"); 76 (void)class_addMethod( 77 delegate, kit_sel("application:didFinishLaunchingWithOptions:"), 78 (IMP)kit_app_did_finish_launching, "B@:@@"); 79 objc_registerClassPair(delegate); 80 } 81 82 int main(int argc, char** argv) { 83 id pool = kit_msg_id(kit_msg_id((id)objc_getClass("NSAutoreleasePool"), 84 "alloc"), 85 "init"); 86 id delegate_name = kit_msg_id_cstr((id)objc_getClass("NSString"), 87 "stringWithUTF8String:", 88 kit_delegate_class_name()); 89 int rc; 90 91 kit_register_delegate_class(); 92 rc = UIApplicationMain(argc, argv, (id)0, delegate_name); 93 kit_msg_void(pool, "drain"); 94 return rc; 95 }