void SDLAppCreateWindowsConsole() { if(using_parent_console || gSDLAppConsoleWindow != 0) return; //try to attach to the available console if there is one if(SDLAppAttachToConsole()) return; //create a console on Windows so users can see messages //find an available name for our window char consoleTitle[512]; int console_suffix = 0; sprintf(consoleTitle, "%s Console", gSDLAppTitle.c_str()); while(FindWindow(0, consoleTitle)) { sprintf(consoleTitle, "%s Console %d", gSDLAppTitle.c_str(), ++console_suffix); } AllocConsole(); SetConsoleTitle(consoleTitle); //redirect streams to console freopen("conin$", "r", stdin); freopen("conout$","w", stdout); freopen("conout$","w", stderr); gSDLAppConsoleWindow = 0; //wait for our console window while(gSDLAppConsoleWindow==0) { gSDLAppConsoleWindow = FindWindow(0, consoleTitle); SDL_Delay(100); } //disable the close button so the user cant crash the application HMENU hm = GetSystemMenu(gSDLAppConsoleWindow, false); DeleteMenu(hm, SC_CLOSE, MF_BYCOMMAND); }
int main(int argc, char *argv[]) { SDLAppInit("Gource", "gource"); ConfFile conf; std::vector<std::string> files; //convert args to a conf file //read the conf file //apply the conf file to settings try { gGourceSettings.parseArgs(argc, argv, conf, &files); if(gGourceSettings.load_config.empty() && !files.empty()) { //see if file looks like a config file for(std::vector<std::string>::iterator fit = files.begin(); fit != files.end(); fit++) { std::string file = *fit; int file_length = file.size(); if( (file.rfind(".conf") == (file_length-5) && file_length > 5) || (file.rfind(".cfg") == (file_length-4) && file_length > 4) || (file.rfind(".ini") == (file_length-4) && file_length > 4) ) { bool is_conf=true; try { ConfFile conftest; conftest.load(file); } catch(ConfFileException& exception) { is_conf = false; } if(is_conf) { gGourceSettings.load_config = file; files.erase(fit); break; } } } } //set log level Logger::getDefault()->setLevel(gGourceSettings.log_level); //load config if(!gGourceSettings.load_config.empty()) { conf.clear(); conf.load(gGourceSettings.load_config); //apply args to loaded conf file gGourceSettings.parseArgs(argc, argv, conf); } //set path if(!files.empty()) { std::string path = files[files.size()-1]; ConfSectionList* sectionlist = conf.getSections("gource"); if(sectionlist!=0) { for(ConfSectionList::iterator sit = sectionlist->begin(); sit != sectionlist->end(); sit++) { (*sit)->setEntry("path", path); } } else { conf.setEntry("gource", "path", path); } } //apply the config / see if its valid gGourceSettings.importDisplaySettings(conf); gGourceSettings.importGourceSettings(conf); //save config if(!gGourceSettings.save_config.empty()) { conf.save(gGourceSettings.save_config); exit(0); } //write custom log file if(gGourceSettings.output_custom_filename.size() > 0 && gGourceSettings.path.size() > 0) { Gource::writeCustomLog(gGourceSettings.path, gGourceSettings.output_custom_filename); exit(0); } } catch(ConfFileException& exception) { SDLAppQuit(exception.what()); } // this causes corruption on some video drivers if(gGourceSettings.multisample) { display.multiSample(4); } //background needs alpha channel if(gGourceSettings.transparent) { display.enableAlpha(true); } //enable vsync display.enableVsync(gGourceSettings.vsync); //allow resizing window if we are not recording if(gGourceSettings.resizable && gGourceSettings.output_ppm_filename.empty()) { display.enableResize(true); } try { display.init("Gource", gGourceSettings.display_width, gGourceSettings.display_height, gGourceSettings.fullscreen); } catch(SDLInitException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "SDL initialization failed - %s", exception.what()); SDLAppQuit(errormsg); } #ifdef _WIN32 SDLAppAttachToConsole(); #endif //init frame exporter FrameExporter* exporter = 0; if(gGourceSettings.output_ppm_filename.size() > 0) { try { exporter = new PPMExporter(gGourceSettings.output_ppm_filename); } catch(PPMExporterException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "could not write to '%s'", exception.what()); SDLAppQuit(errormsg); } } if(display.multiSamplingEnabled()) { glEnable(GL_MULTISAMPLE_ARB); } GourceShell* gourcesh = 0; try { gourcesh = gGourceShell = new GourceShell(&conf, exporter); gourcesh->run(); } catch(ResourceException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "failed to load resource '%s'", exception.what()); SDLAppQuit(errormsg); } catch(SDLAppException& exception) { if(exception.showHelp()) { gGourceSettings.help(); } else { SDLAppQuit(exception.what()); } } gGourceShell = 0; if(gourcesh != 0) delete gourcesh; if(exporter != 0) delete exporter; //free resources display.quit(); return 0; }