int main(int argc, char *argv[]) #endif { SDL_Event event; char *loadFile = 0; pp_int32 defaultBPP = -1; PPDisplayDevice::Orientations orientation = PPDisplayDevice::ORIENTATION_NORMAL; bool swapRedBlue = false, noSplash = false; bool recVelocity = false; // Parse command line while ( argc > 1 ) { --argc; #ifdef __APPLE__ // OSX: Swallow "-psn_xxx" argument passed by Finder on OSX <10.9 if ( strncmp(argv[argc], "-psn", 4) == 0 ) { continue; } else #endif if ( strcmp(argv[argc-1], "-bpp") == 0 ) { defaultBPP = atoi(argv[argc]); --argc; } else if ( strcmp(argv[argc], "-nosplash") == 0 ) { noSplash = true; } else if ( strcmp(argv[argc], "-swap") == 0 ) { swapRedBlue = true; } else if ( strcmp(argv[argc-1], "-orientation") == 0 ) { if (strcmp(argv[argc], "NORMAL") == 0) { orientation = PPDisplayDevice::ORIENTATION_NORMAL; } else if (strcmp(argv[argc], "ROTATE90CCW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CCW; } else if (strcmp(argv[argc], "ROTATE90CW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CW; } else goto unrecognizedCommandLineSwitch; --argc; } else if ( strcmp(argv[argc], "-nonstdkb") == 0) { stdKb = false; } else if ( strcmp(argv[argc], "-recvelocity") == 0) { recVelocity = true; } else { unrecognizedCommandLineSwitch: if (argv[argc][0] == '-') { fprintf(stderr, "Usage: %s [-bpp N] [-swap] [-orientation NORMAL|ROTATE90CCW|ROTATE90CW] [-nosplash] [-nonstdkb] [-recvelocity]\n", argv[0]); exit(1); } else { loadFile = argv[argc]; } } } globalMutex = new PPMutex(); // Store current working path (init routine is likely to change it) PPPath_POSIX path; PPSystemString oldCwd = path.getCurrent(); globalMutex->lock(); initTracker(defaultBPP, orientation, swapRedBlue, noSplash); globalMutex->unlock(); #ifdef HAVE_LIBASOUND if (myMidiReceiver && recVelocity) { myMidiReceiver->setRecordVelocity(true); } #endif if (loadFile) { PPSystemString newCwd = path.getCurrent(); path.change(oldCwd); SendFile(loadFile); path.change(newCwd); pp_uint16 chr[3] = {VK_RETURN, 0, 0}; PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&event); } // Main event loop done = 0; while (!done && SDL_WaitEvent(&event)) { switch (event.type) { case SDL_QUIT: exitSDLEventLoop(false); break; case SDL_MOUSEMOTION: { // Ignore old mouse motion events in the event queue SDL_Event new_event; if (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0) { while (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0); processSDLEvents(new_event); } else { processSDLEvents(event); } break; } // Open modules drag 'n dropped onto MilkyTracker (currently only works on Dock icon, OSX) case SDL_DROPFILE: SendFile(event.drop.file); SDL_free(event.drop.file); break; // Refresh GUI if window resized case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: myTrackerScreen->update(); } break; case SDL_USEREVENT: processSDLUserEvents((const SDL_UserEvent&)event); break; default: processSDLEvents(event); break; } } ticking = false; SDL_RemoveTimer(timer); globalMutex->lock(); #ifdef HAVE_LIBASOUND delete myMidiReceiver; #endif delete myTracker; myTracker = NULL; delete myTrackerScreen; myTrackerScreen = NULL; delete myDisplayDevice; globalMutex->unlock(); SDL_Quit(); delete globalMutex; return 0; }
int main(int argc, char *argv[]) #endif { Uint32 videoflags; SDL_Event event; char *loadFile = 0; pp_int32 defaultBPP = -1; PPDisplayDevice::Orientations orientation = PPDisplayDevice::ORIENTATION_NORMAL; bool swapRedBlue = false, fullScreen = false, noSplash = false; bool recVelocity = false; // Parse command line while ( argc > 1 ) { --argc; if ( strcmp(argv[argc-1], "-bpp") == 0 ) { defaultBPP = atoi(argv[argc]); --argc; } else if ( strcmp(argv[argc], "-nosplash") == 0 ) { noSplash = true; } else if ( strcmp(argv[argc], "-swap") == 0 ) { swapRedBlue = true; } else if ( strcmp(argv[argc], "-fullscreen") == 0) { fullScreen = true; } else if ( strcmp(argv[argc-1], "-orientation") == 0 ) { if (strcmp(argv[argc], "NORMAL") == 0) { orientation = PPDisplayDevice::ORIENTATION_NORMAL; } else if (strcmp(argv[argc], "ROTATE90CCW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CCW; } else if (strcmp(argv[argc], "ROTATE90CW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CW; } else goto unrecognizedCommandLineSwitch; --argc; } else if ( strcmp(argv[argc], "-nonstdkb") == 0) { stdKb = false; } else if ( strcmp(argv[argc], "-recvelocity") == 0) { recVelocity = true; } else { unrecognizedCommandLineSwitch: if (argv[argc][0] == '-') { fprintf(stderr, "Usage: %s [-bpp N] [-swap] [-orientation NORMAL|ROTATE90CCW|ROTATE90CW] [-fullscreen] [-nosplash] [-nonstdkb] [-recvelocity]\n", argv[0]); exit(1); } else { loadFile = argv[argc]; } } } // Workaround for seg-fault in SDL_Init on Eee PC (thanks nostromo) // (see http://forum.eeeuser.com/viewtopic.php?pid=136945) #if HAVE_DECL_SDL_PUTENV SDL_putenv("SDL_VIDEO_X11_WMCLASS=Milkytracker"); #endif timerMutex = new PPMutex(); globalMutex = new PPMutex(); // Store current working path (init routine is likely to change it) PPPath_POSIX path; PPSystemString oldCwd = path.getCurrent(); globalMutex->lock(); initTracker(defaultBPP, orientation, swapRedBlue, fullScreen, noSplash); globalMutex->unlock(); #ifdef HAVE_LIBASOUND if (myMidiReceiver && recVelocity) { myMidiReceiver->setRecordVelocity(true); } #endif if (loadFile) { PPSystemString newCwd = path.getCurrent(); path.change(oldCwd); SendFile(loadFile); path.change(newCwd); pp_uint16 chr[3] = {VK_RETURN, 0, 0}; PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&event); } /* Main event loop */ done = 0; while (!done && SDL_WaitEvent(&event)) { switch (event.type) { case SDL_QUIT: exitSDLEventLoop(false); break; case SDL_MOUSEMOTION: { // ignore old mouse motion events in the event queue SDL_Event new_event; if (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0) { while (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0); processSDLEvents(new_event); } else { processSDLEvents(event); } break; } case SDL_USEREVENT: processSDLUserEvents((const SDL_UserEvent&)event); break; default: processSDLEvents(event); break; } } #ifdef __GP2X__ SDL_JoystickClose(0); #endif timerMutex->lock(); ticking = false; timerMutex->unlock(); SDL_SetTimer(0, NULL); timerMutex->lock(); globalMutex->lock(); #ifdef HAVE_LIBASOUND delete myMidiReceiver; #endif delete myTracker; myTracker = NULL; delete myTrackerScreen; myTrackerScreen = NULL; delete myDisplayDevice; globalMutex->unlock(); timerMutex->unlock(); SDL_Quit(); delete globalMutex; delete timerMutex; /* Quoting from README.Qtopia (Application Porting Notes): One thing I have noticed is that applications sometimes don't exit correctly. Their icon remains in the taskbar and they tend to relaunch themselves automatically. I believe this problem doesn't occur if you exit your application using the exit() method. However, if you end main() with 'return 0;' or so, this seems to happen. */ #ifdef __QTOPIA__ exit(0); #else return 0; #endif }