123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- /*************************************************************************/
- /* godot_osx.mm */
- /*************************************************************************/
- /* This file is part of: */
- /* GODOT ENGINE */
- /* http://www.godotengine.org */
- /*************************************************************************/
- /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
- /* */
- /* Permission is hereby granted, free of charge, to any person obtaining */
- /* a copy of this software and associated documentation files (the */
- /* "Software"), to deal in the Software without restriction, including */
- /* without limitation the rights to use, copy, modify, merge, publish, */
- /* distribute, sublicense, and/or sell copies of the Software, and to */
- /* permit persons to whom the Software is furnished to do so, subject to */
- /* the following conditions: */
- /* */
- /* The above copyright notice and this permission notice shall be */
- /* included in all copies or substantial portions of the Software. */
- /* */
- /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
- /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
- /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
- /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
- /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
- /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
- /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- /*************************************************************************/
- #include <sys/param.h> /* for MAXPATHLEN */
- #include <unistd.h>
- #include "godot_osx.h"
- /* For some reaon, Apple removed setAppleMenu from the headers in 10.4,
- but the method still is there and works. To avoid warnings, we declare
- it ourselves here. */
- @interface NSApplication()
- - (void)setAppleMenu:(NSMenu *)menu;
- @end
- static int global_argc;
- static char **global_argv;
- static BOOL gCalledAppMainline = FALSE;
- static NSString *getApplicationName(void)
- {
- const NSDictionary *dict;
- NSString *appName = 0;
- /* Determine the application name */
- dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
- if (dict)
- appName = [dict objectForKey: @"CFBundleName"];
- if (![appName length])
- appName = [[NSProcessInfo processInfo] processName];
- return appName;
- }
- /* The main class of the application, the application's delegate */
- @implementation GodotMain
- static void setApplicationMenu(void)
- {
- /* warning: this code is very odd */
- NSMenu *appleMenu;
- NSMenuItem *menuItem;
- NSString *title;
- NSString *appName;
- appName = getApplicationName();
- appleMenu = [[NSMenu alloc] initWithTitle:@""];
- /* Add menu items */
- title = [@"About " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
- [appleMenu addItem:[NSMenuItem separatorItem]];
- title = [@"Hide " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
- menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
- [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
- [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
- [appleMenu addItem:[NSMenuItem separatorItem]];
- title = [@"Quit " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
- /* Put menu into the menubar */
- menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
- [menuItem setSubmenu:appleMenu];
- [[NSApp mainMenu] addItem:menuItem];
- /* Tell the application object that this is now the application menu */
- [NSApp setAppleMenu:appleMenu];
- /* Finally give up our references to the objects */
- [appleMenu release];
- [menuItem release];
- }
- /* Create a window menu */
- static void setupWindowMenu(void)
- {
- NSMenu *windowMenu;
- NSMenuItem *windowMenuItem;
- NSMenuItem *menuItem;
- windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
- /* "Minimize" item */
- menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
- [windowMenu addItem:menuItem];
- [menuItem release];
- /* Put menu into the menubar */
- windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
- [windowMenuItem setSubmenu:windowMenu];
- [[NSApp mainMenu] addItem:windowMenuItem];
- /* Tell the application object that this is now the window menu */
- [NSApp setWindowsMenu:windowMenu];
- /* Finally give up our references to the objects */
- [windowMenu release];
- [windowMenuItem release];
- }
- /* Replacement for NSApplicationMain */
- static void CustomApplicationMain (int argc, char **argv)
- {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- GodotMain *main;
- /* Ensure the application object is initialised */
- [NSApplication sharedApplication];
- /* Set up the menubar */
- [NSApp setMainMenu:[[NSMenu alloc] init]];
- setApplicationMenu();
- setupWindowMenu();
- main = [[main alloc] init];
- [NSApp setDelegate:main];
- /* Start the main event loop */
- [NSApp run];
- [main release];
- [pool release];
- }
- extern int godot_main(int argc, char** argv);
- /* Called when the internal event loop has just started running */
- - (void) applicationDidFinishLaunching: (NSNotification *) note
- {
- int status;
- /* Hand off to main application code */
- gCalledAppMainline = TRUE;
- int ret = godot_main(global_argc, global_argv);
- exit(ret);
- }
- @end
- #ifdef main
- #undef main
- #endif
- int main (int argc, char **argv)
- {
- /* Copy the arguments into a global variable */
- /* This is passed if we are launched by double-clicking */
- if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) {
- global_argv = (char **) malloc(sizeof (char *) * 2);
- global_argv[0] = argv[0];
- global_argv[1] = NULL;
- global_argc = 1;
- // chdir to binary's dir when launched from finder
- int len = strlen(global_argv[0]);
- while (len--){
- if (global_argv[0][len] == '/') break;
- }
- if (len>=0) {
- char *path = (char *)malloc(len+1);
- memcpy(path, global_argv[0], len);
- path[len]=0;
- printf("Path: %s\n", path);
- chdir(path);
- }
- } else {
- int i;
- global_argc = argc;
- global_argv = (char **) malloc(sizeof (char *) * (argc+1));
- for (i = 0; i <= argc; i++)
- global_argv[i] = argv[i];
- }
- CustomApplicationMain (argc, argv);
- return 0;
- }
|