kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }