@@ -45,10 +45,23 @@ [delegate applicationWillTerminate]; [(id)delegate release]; } +#define SIGNAL_HANDLER(sig) \ + static void \ + handle##sig(int signal) \ + { \ + app->sig##Handler(app->delegate, \ + @selector(applicationDidReceive##sig)); \ + } +SIGNAL_HANDLER(SIGINT) +SIGNAL_HANDLER(SIGHUP) +SIGNAL_HANDLER(SIGUSR1) +SIGNAL_HANDLER(SIGUSR2) +#undef SIGNAL_HANDLER + int of_application_main(int *argc, char **argv[], Class cls) { OFApplication *app = [OFApplication sharedApplication]; id delegate = [[cls alloc] init]; @@ -234,10 +247,25 @@ } - (void)setDelegate: (id )delegate_ { delegate = delegate_; + +#define REGISTER_SIGNAL(sig) \ + sig##Handler = (void(*)(id, SEL))[(id)delegate methodForSelector: \ + @selector(applicationDidReceive##sig)]; \ + if (sig##Handler != (void(*)(id, SEL))[OFObject \ + instanceMethodForSelector: \ + @selector(applicationDidReceive##sig)]) \ + signal(sig, handle##sig); \ + else \ + signal(sig, SIG_DFL); + REGISTER_SIGNAL(SIGINT) + REGISTER_SIGNAL(SIGHUP) + REGISTER_SIGNAL(SIGUSR1) + REGISTER_SIGNAL(SIGUSR2) +#undef REGISTER_SIGNAL } - (void)run { [delegate applicationDidFinishLaunching]; @@ -270,6 +298,22 @@ } - (void)applicationWillTerminate { } + +- (void)applicationDidReceiveSIGINT +{ +} + +- (void)applicationDidReceiveSIGHUP +{ +} + +- (void)applicationDidReceiveSIGUSR1 +{ +} + +- (void)applicationDidReceiveSIGUSR2 +{ +} @end