25 #ifdef USE_SDL_MAINLOOP
34 return (
C4AppDelegate*)[[NSApplication sharedApplication] delegate];
43 @synthesize addViewportForPlayerMenuItem, editorWindowController, kickPlayerMenuItem, recordMenuItem, netMenu, gameWindowController, toggleFullScreen;
51 NSArray* processArguments = [[NSProcessInfo processInfo] arguments];
52 gatheredArguments = [NSMutableArray arrayWithCapacity:[processArguments count]+2];
53 [gatheredArguments addObjectsFromArray:processArguments];
60 NSAppleEventManager* appleEvents = [NSAppleEventManager sharedAppleEventManager];
61 [appleEvents setEventHandler:self
62 andSelector:@selector(getUrl:withReplyEvent:)
63 forEventClass:kInternetEventClass andEventID:kAEGetURL];
64 [appleEvents setEventHandler:self
65 andSelector:@selector(handleQuitEvent:withReplyEvent:)
66 forEventClass:kCoreEventClass andEventID:kAEQuitApplication];
70 - (void)handleQuitEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent
72 NSLog(
@"Quit message via Dock or Tab-Switcher");
73 [
self suggestQuitting:self];
76 - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
78 NSString* pathExtension = [[filename pathExtension] lowercaseString];
80 NSArray* clonkFileNameExtensions = @[@"ocd", @"ocs", @"ocf", @"ocg"];
81 if ([clonkFileNameExtensions containsObject:pathExtension])
94 - (void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
96 NSString *url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
97 [gatheredArguments addObject:url];
100 - (void) quitAndMaybeRestart
106 NSString* filename = [[NSBundle mainBundle] bundlePath];
107 NSString* cmd = [@"open " stringByAppendingString: filename];
108 system([cmd UTF8String]);
113 - (NSString*)clonkDirectory {
return [NSBundle.mainBundle.bundlePath stringByDeletingLastPathComponent]; }
115 - (void) applicationDidFinishLaunching: (NSNotification *) note
117 [[NSFileManager defaultManager] changeCurrentDirectoryPath:[
self clonkDirectory]];
120 [NSApp activateIgnoringOtherApps:YES];
124 #ifdef USE_SDL_MAINLOOP
126 SDL_main(newArgc, newArgv);
128 [
self quitAndMaybeRestart];
129 [NSApp terminate:self];
137 [NSApp terminate:self];
139 [[NSRunLoop currentRunLoop] performSelector:@selector(delayedRun:) target:self argument:self order:0 modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]];
141 [toggleFullScreen setTarget:self];
146 [NSApp terminate:self];
151 - (void) delayedRun:(
id)sender
164 - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)application
167 [
self suggestQuitting:self];
168 return NSTerminateNow;
171 - (void)terminate:(NSApplication*)sender
173 #ifdef USE_SDL_MAINLOOP
176 event.type = SDL_QUIT;
177 SDL_PushEvent(&event);
196 for (
unsigned int i = 0; i < [gatheredArguments count]; i++)
198 NSString* arg = [gatheredArguments objectAtIndex:i];
199 if ([arg hasPrefix:
@"-psn"])
205 - (void) infoWithFormat:(NSString*) formatString andArgument:(const
char*) arg
207 NSRunInformationalAlertPanel([NSString stringWithCString:
LoadResStr(
"IDS_ADDON_INSTALLTITLE") encoding:NSUTF8StringEncoding],
208 [NSString stringWithFormat: formatString, arg],
212 - (void) minimalConfigurationInitialization
228 [
self minimalConfigurationInitialization];
231 NSString* justFileName = [addonSupplied lastPathComponent];
232 NSString* destPath = [
self clonkDirectory];
233 NSString* formatString;
238 if ([
addonSupplied hasPrefix:[NSString stringWithCString:(*it).strBuf.getData() encoding:NSUTF8StringEncoding]])
240 [gatheredArguments addObject:addonSupplied];
244 destPath = [NSString stringWithCString:it->strBuf.getData() encoding:NSUTF8StringEncoding];
246 destPath = [destPath stringByAppendingPathComponent:justFileName];
248 NSFileManager* fileManager = [NSFileManager defaultManager];
249 if ([fileManager fileExistsAtPath:destPath])
251 [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:[
self clonkDirectory] destination:@"" files:[NSArray arrayWithObject:justFileName] tag:0];
252 if ([fileManager copyItemAtPath:
addonSupplied toPath:destPath error:NULL])
254 formatString = [NSString stringWithCString:LoadResStr("IDS_ADDON_INSTALLSUCCESS") encoding:NSUTF8StringEncoding];
258 formatString = [NSString stringWithCString:LoadResStr("IDS_ADDON_INSTALLFAILURE") encoding:NSUTF8StringEncoding];
260 [
self infoWithFormat:formatString andArgument:[justFileName cStringUsingEncoding:NSUTF8StringEncoding]];
267 NSArray* nonCocoaArgs = [gatheredArguments filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString* arg, NSDictionary *bindings)
271 [arg hasPrefix:@"-NS"] ||
272 [arg isEqualToString:@"YES"]
276 int argCount = [nonCocoaArgs count];
277 args.resize(argCount);
278 for (
int i = 0; i < argCount; i++)
280 args[i] = strdup([[nonCocoaArgs objectAtIndex:i] cStringUsingEncoding:NSUTF8StringEncoding]);
284 - (void) applicationDidBecomeActive:(NSNotification*)notification
287 if (gameWindowController)
288 [gameWindowController.window makeKeyAndOrderFront:self];
298 static void _ExceptionHandler(NSException* exception)
300 NSAlert* alert = [NSAlert alertWithMessageText:[exception description] defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:@""];
305 int main (
int argc,
const char **argv)
307 NSSetUncaughtExceptionHandler(&_ExceptionHandler);
308 return NSApplicationMain(argc, argv);
int main(int argc, const char **argv)
C4Application Application
const char * LoadResStr(const char *id)
bool Init(int argc, char *argv[])
char LanguageEx[CFG_MaxString+1]
bool Load(const char *config_file=nullptr)
bool LoadLanguage(const char *strLanguages)
@ PATH_PreferredInstallationLocation
void StartOnCurrentThread()
BOOL isEditorAndGameRunning()
BOOL argsLookLikeItShouldBeInstallation()
NSMutableArray * gatheredArguments
std::vector< char * > args
C4AppDelegate * instance()