Remove update_rect from Surface.xs, enable it in SDL.xs
[sdlgit/SDL_perl.git] / MacOSX / launcher.m
CommitLineData
bfd90409 1// lancher.m
2//
3// Copyright (C) 2006 David J. Goehrig <dgoehrig@cpan.org>
4//
5//
6
7
8// Define _SDL_main_h to avoid using SDLMain.m
9
10#define _SDL_main_h
11#include <Foundation/Foundation.h>
12#include <AppKit/AppKit.h>
13#include <EXTERN.h>
14#include <perl.h>
15#include <SDL/SDL.h>
16#include "launcher.h"
17
18static SDLPerlMain* sdlplmain;
19static PerlInterpreter *my_perl = NULL;
20char path[MAXPATHLEN];
21char libpath[MAXPATHLEN];
22char scriptfile[MAXPATHLEN];
23BOOL init_path;
24
25void xs_init (pTHX);
26EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
27EXTERN_C void
28xs_init(pTHX)
29{
30 char *file = __FILE__;
31
32 sprintf(libpath,"%s/Contents/Resources/lib/%s",path,ARCHNAME);
33 fprintf(stderr,"LIBPATH: %s\n",libpath);
34
35 dXSUB_SYS;
36
37 /* DynaLoader is a special case */
38 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
39 SV* svpth = newSVpv(libpath,strlen(libpath));
40 AV* inc = get_av("INC",0);
41 if (inc && svpth) {
42 av_unshift(inc,1);
43 av_store(inc,0,svpth);
44 }
45}
46
47
48@implementation SDLPerlApplication
49- (void) terminate:(id)sender
50{
51 fprintf(stderr,"Quitting Event\n");
52 SDL_Event event;
53 event.type = SDL_QUIT;
54 SDL_PushEvent(&event);
55 [NSApp stop: nil];
56}
57@end
58
59@implementation SDLPerlMain
60- (void) setupWorkingDirectory:(BOOL)changep
61{
62 CFURLRef bpath;
63 fprintf(stderr,"Setup working directory ? %s", (changep ? "True" : "False"));
64 if (! changep) return;
65 bpath = CFBundleCopyBundleURL(CFBundleGetMainBundle());
66 if (CFURLGetFileSystemRepresentation(bpath,true,(UInt8*)path,MAXPATHLEN)) {
67 fprintf(stderr,"PATH: %s\n",path);
68 chdir((char*)path);
69 }
70}
71
72- (void) applicationWillFinishLaunching: (NSNotification *) note
73{
74 NSMenu* appleMenu;
75 NSMenuItem* item;
76 NSDictionary* dict;
77 NSString* appName;
78 NSString* title;
79
80 fprintf(stderr, "Application will finish launching\n");
81
82 dict = (NSDictionary*)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
83 appName = (dict ? [dict objectForKey: @"CFBundleName"] : [[NSProcessInfo processInfo] processName]);
84
85 appleMenu = [[NSMenu alloc] initWithTitle: @""];
86
87 title = [@"About " stringByAppendingString: appName ];
88 [appleMenu addItemWithTitle: title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
89
90 [appleMenu addItem: [NSMenuItem separatorItem]];
91
92 title = [@"Hide " stringByAppendingString: appName ];
93 [appleMenu addItemWithTitle: title action:@selector(hide:) keyEquivalent:@"h"];
94
95 title = @"Hide Others";
96 [appleMenu addItemWithTitle: title action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
97
98 title = @"Show All";
99 [appleMenu addItemWithTitle: title action:@selector(unhideAllApplications:) keyEquivalent:@""];
100
101 [appleMenu addItem: [NSMenuItem separatorItem]];
102
103 title = @"Quit";
104 [appleMenu addItemWithTitle: title action:@selector(terminate:) keyEquivalent:@"q"];
105
106 item = [[NSMenuItem alloc] initWithTitle:@"" action: nil keyEquivalent:@""];
107 [item setSubmenu: appleMenu];
108
109 [[NSApp mainMenu] addItem: item];
110
111 [NSApp setMainMenu: appleMenu];
112
113 fprintf(stderr,"Done with menu\n");
114}
115
116- (void) applicationDidFinishLaunching: (NSNotification *) note
117{
118 fprintf(stderr, "Application did finish launching\n");
119
120// fprintf(stderr, "SCRIPT: %s\n",scriptfile);
121// NSString* scr = [[NSString alloc] initWithUTF8String: scriptfile];
122// fprintf(stderr, "Setting directory: %s\n",init_path ? "true" : "false");
123// [self setupWorkingDirectory: init_path];
124// fprintf(stderr,"Launching perl script %s\n", scriptfile);
125// [self launchPerl: scr ];
126 [NSApp terminate: self];
127}
128
129- (void) launchPerl: (NSString*) script
130{
131 int count = 3;
132 char* embedding[] = { path, scriptfile , "0" } ;
133 unsigned buflen = [ script lengthOfBytesUsingEncoding: NSUTF8StringEncoding] + 1;
134 [script getCString:scriptfile maxLength: buflen encoding:NSUTF8StringEncoding];
135 fprintf(stderr,"Launching script: %s\n",scriptfile);
136 PERL_SYS_INIT3(&count,&embedding,NULL);
137 my_perl = perl_alloc();
138 perl_construct(my_perl);
139 perl_parse(my_perl,xs_init,count,embedding,NULL);
140 fprintf(stderr,"Running perl\n");
141 perl_run(my_perl);
142 fprintf(stderr,"Destructing perl\n");
143 perl_destruct(my_perl);
144 fprintf(stderr,"Freeing perl\n");
145 perl_free(my_perl);
146 fprintf(stderr,"Quiting perl script: %s\n",scriptfile);
147 PERL_SYS_TERM();
148}
149
150- (BOOL) application: (NSApplication*) theApplication openFile: (NSString*) filename
151{
152 fprintf(stderr,"openFile %s\n", [filename UTF8String]);
153 fprintf(stderr, "Setting directory: %s\n",init_path ? "true" : "false");
154 [self setupWorkingDirectory: init_path];
155 fprintf(stderr,"launchgin perl\n");
156 [self launchPerl: filename];
157}
158
159@end
160
161int
162main( int argc, char** argv)
163{
164 int i;
165 NSAutoreleasePool* pool;
166
167 fprintf(stderr, "ARGC %d \n", argc);
168 for (i = 0; i < argc; ++i) {
169 fprintf(stderr,"ARGV[%d] %s\n",i,argv[i]);
170 }
171
172 init_path = YES;
173 memset(scriptfile,0,MAXPATHLEN);
174 if (argc >= 2) {
175 if ( argc == 2 ) {
176 strncpy(scriptfile,argv[1],strlen(argv[1]));
177 } else {
178 strncpy(scriptfile,argv[1],strlen(argv[2]));
179 }
180 }
181 fprintf(stderr, "[main] SCRIPT: %s\n",scriptfile);
182
183 pool = [[NSAutoreleasePool alloc] init];
184
185 [SDLPerlApplication sharedApplication];
186 [NSApp setMainMenu: [[NSMenu alloc] init]];
187
188 sdlplmain = [[SDLPerlMain alloc] init];
3a32e86d 189 [sdlplmain retain];
bfd90409 190 [NSApp setDelegate: sdlplmain];
191
192 [NSApp run];
193
194 fprintf(stderr,"Terminating NSApp\n");
195 [sdlplmain release];
196 [pool release];
197
198 return 0;
199}