void SDLAppParseArgs(int argc, char *argv[], int* xres, int* yres, bool* fullscreen, std::vector<std::string>* otherargs) { SDLAppInit(); for (int i=1; i<argc; i++) { debugLog("argv[%d] = %s\n", i, argv[i]); if (!strcmp(argv[i],"-f")) { *fullscreen = 1; continue; } else if (!strcmp(argv[i],"-w")) { *fullscreen = 0; continue; } //get video mode if(strchr(argv[i], '-') != 0 && strlen(argv[i])>1) { std::string argstr(argv[i], 1, strlen(argv[i])-1); debugLog("%s\n", argstr.c_str()); size_t x = argstr.rfind("x"); if(x != std::string::npos) { std::string widthstr = argstr.substr(0, x); std::string heightstr = argstr.substr(x+1); int width = atoi(widthstr.c_str()); int height = atoi(heightstr.c_str()); if(width!=0 && height!=0) { debugLog("w=%d, h=%d\n",width,height); *xres = width; *yres = height; continue; } } } // non display argument if(otherargs != 0) { otherargs->push_back(std::string(argv[i])); } } }
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; }
int main(int argc, char *argv[]) { //defaults int width = 1024; int height = 768; bool fullscreen = false; float simu_speed = 1.0f; float update_rate = 5.0f; float time_scale = 1.0f; bool multisample = false; vec3f background = vec3f(0.0, 0.0, 0.0); int video_framerate = 60; std::string ppm_file_name; std::string mpeg_file_name; std::string logfile = ""; std::vector<std::string> groupstr; std::vector<std::string> arguments; XInitThreads(); SDLAppInit("Logstalgia", "logstalgia"); SDLAppParseArgs(argc, argv, &width, &height, &fullscreen, &arguments); for (int i=0; i<arguments.size(); i++) { std::string args = arguments[i]; if(args == "-h" || args == "-?" || args == "--help") { logstalgia_help(); } if(args == "-c") { gSplash = 15.0f; continue; } if(args == "-x" || args == "--full-hostnames") { gMask = false; continue; } if(args == "--hide-url-prefix") { gHideURLPrefix = true; continue; } if(args == "-s" || args == "--speed") { if((i+1)>=arguments.size()) { logstalgia_quit("specify speed (1 to 30)"); } simu_speed = atof(arguments[++i].c_str()); if(simu_speed < 1.0f || simu_speed > 30.0f) { logstalgia_quit("speed should be between 1 and 30\n"); } continue; } if(args == "-t" || args == "--time-scale") { if((i+1)>=arguments.size()) { logstalgia_quit("specify time scale (0.25 to 4)"); } time_scale = atof(arguments[++i].c_str()); if(time_scale < 0.25f || time_scale > 4.0f) { logstalgia_quit("time scale should be between 0.25 and 4\n"); } continue; } if(args == "-u" || args == "--update-rate") { if((i+1)>=arguments.size()) { logstalgia_quit("specify update rate (1 to 60)"); } update_rate = atof(arguments[++i].c_str()); if(update_rate < 1.0f || update_rate > 60.0f) { logstalgia_quit("update rate should be between 1 and 60\n"); } continue; } //specify page url group if(args == "-g") { if((i+1)>=arguments.size()) { logstalgia_quit("specify group definition"); } groupstr.push_back(arguments[++i].c_str()); continue; } if(args == "--paddle-mode") { if((i+1)>=arguments.size()) { logstalgia_quit("specify paddle-mode (vhost,pid)"); } std::string paddle_mode = arguments[++i]; if(paddle_mode == "single") { gPaddleMode = PADDLE_SINGLE; } else if(paddle_mode == "pid") { gPaddleMode = PADDLE_PID; } else if(paddle_mode == "vhost") { gPaddleMode = PADDLE_VHOST; } else { logstalgia_quit("invalid paddle-mode"); } continue; } if(args == "--paddle-position") { if((i+1)>=arguments.size()) { logstalgia_quit("specify paddle-position (0.25 - 0.75)"); } gPaddlePosition = atof(arguments[++i].c_str()); if(gPaddlePosition < 0.25f || gPaddlePosition > 0.75f) { logstalgia_quit("paddle-position outside of range 0.25 - 0.75"); } continue; } if(args == "--font-size") { if((i+1)>=arguments.size()) { logstalgia_quit("specify font-size (10 - 40)"); } gFontSize = atoi(arguments[++i].c_str()); if(gFontSize < 10 || gFontSize > 40) { logstalgia_quit("font-size outside of range 10 - 40"); } continue; } if(args == "-b" || args == "--background") { if((i+1)>=arguments.size()) { logstalgia_quit("specify background colour (FFFFFF)"); } int r,g,b; std::string colstring = arguments[++i]; if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { background = vec3f(r,g,b); background /= 255.0f; } else { logstalgia_quit("invalid colour string"); } continue; } //dont bounce if(args == "--no-bounce") { gBounce = false; continue; } //dont draw response code if(args == "--hide-response-code") { gResponseCode = false; continue; } //no paddle if(args == "--hide-paddle") { gPaddleMode = PADDLE_NONE; continue; } if(args == "--start-position") { if((i+1)>=arguments.size()) { logstalgia_quit("specify start-position (0.0 - 1.0)"); } gStartPosition = atof(arguments[++i].c_str()); if(gStartPosition<=0.0 || gStartPosition>=1.0) { logstalgia_quit("start-position outside of range 0.0 - 1.0 (non-inclusive)"); } continue; } if(args == "--stop-position") { if((i+1)>=arguments.size()) { logstalgia_quit("specify stop-position (0.0 - 1.0)"); } gStopPosition = atof(arguments[++i].c_str()); if(gStopPosition<=0.0 || gStopPosition>1.0) { logstalgia_quit("stop-position outside of range 0.0 - 1.0"); } continue; } //disable automatic skipping of empty time periods if(args == "--disable-auto-skip") { gAutoSkip = false; continue; } //disable progress bar if(args == "--disable-progress") { gDisableProgress = true; continue; } if(args == "--disable-glow") { gDisableGlow = true; continue; } //enable multisampling if(args == "--multi-sampling") { multisample = true; continue; } if(args == "--glow-duration") { if((i+1)>=arguments.size()) { logstalgia_quit("specify glow-duration (float)"); } gGlowDuration = atof(arguments[++i].c_str()); if(gGlowDuration<=0.0 || gGlowDuration>1.0) { logstalgia_quit("glow-duration outside of range 0.0 - 1.0"); } continue; } if(args == "--glow-intensity") { if((i+1)>=arguments.size()) { logstalgia_quit("specify glow-intensity (float)"); } gGlowIntensity = atof(arguments[++i].c_str()); if(gGlowIntensity<=0.0) { logstalgia_quit("invalid glow-intensity value"); } continue; } if(args == "--glow-multiplier") { if((i+1)>=arguments.size()) { logstalgia_quit("specify glow-multiplier (float)"); } gGlowMultiplier = atof(arguments[++i].c_str()); if(gGlowMultiplier<=0.0) { logstalgia_quit("invalid glow-multiplier value"); } continue; } if(args == "--output-ppm-stream") { if((i+1)>=arguments.size()) { logstalgia_quit("specify ppm output file or '-' for stdout"); } ppm_file_name = arguments[++i]; #ifdef _WIN32 if(ppm_file_name == "-") { logstalgia_quit("stdout PPM mode not supported on Windows"); } #endif continue; } if(args == "--output-mpeg-stream") { if((i+1)>=arguments.size()) { logstalgia_quit("specify mpeg output file or '-' for stdout"); } mpeg_file_name = arguments[++i]; #ifdef _WIN32 if(mpeg_file_name == "-") { logstalgia_quit("stdout MPEG mode not supported on Windows"); } #endif continue; } if(args == "--output-framerate") { if((i+1)>=arguments.size()) { logstalgia_quit("specify framerate (25,30,60)"); } video_framerate = atoi(arguments[++i].c_str()); if( video_framerate != 25 && video_framerate != 30 && video_framerate != 60) { logstalgia_quit("supported framerates are 25,30,60"); } continue; } if(args == "--sync") { gSyncLog = true; if(!logfile.size()) logfile = "-"; continue; } //if given a non option arg treat it as a file, or if it is '-', pass that too (stdin) if(args == "-" || args.size() >= 1 && args[0] != '-') { logfile = args; continue; } // unknown argument std::string arg_error = std::string("unknown option ") + std::string(args); logstalgia_quit(arg_error); } #ifdef _WIN32 if(!logfile.size()) { //open file dialog logfile = win32LogSelector(); if(!logfile.size()) return 0; } #endif if(!logfile.size()) logstalgia_quit("no file supplied"); // wait for a character on the file handle if reading stdin if(logfile == "-") { #ifdef _WIN32 DWORD available_bytes; HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE); while(PeekNamedPipe(stdin_handle, 0, 0, 0, &available_bytes, 0) && available_bytes==0 && !std::cin.fail()) { SDL_Delay(100); } #else while(std::cin.peek() == EOF && !std::cin.fail()) SDL_Delay(100); #endif std::cin.clear(); } //enable vsync display.enableVsync(true); // this causes corruption on some video drivers if(multisample) display.multiSample(4); display.init("Logstalgia", width, height, fullscreen); //init frame exporter FrameExporter* exporter = 0; if(ppm_file_name.size() > 0) { try { exporter = new PPMExporter(ppm_file_name); } catch(PPMExporterException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "could not write to '%s'", exception.what()); logstalgia_quit(errormsg); } }else if(mpeg_file_name.size() > 0) { try { exporter = new MPEGExporter(mpeg_file_name); } catch(MPEGExporterException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "could not write to '%s'", exception.what()); logstalgia_quit(errormsg); } } if(multisample) glEnable(GL_MULTISAMPLE_ARB); Logstalgia* ls = 0; try { ls = new Logstalgia(logfile, simu_speed, update_rate, time_scale); //init frame exporter if(ppm_file_name.size() > 0 || mpeg_file_name.size() > 0) { ls->setFrameExporter(exporter, video_framerate); } for(size_t i=0;i<groupstr.size();i++) { ls->addGroup(groupstr[i]); } ls->setBackground(background); ls->run(); } catch(ResourceException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "failed to load resource '%s'", exception.what()); logstalgia_quit(errormsg); } catch(SDLAppException& exception) { if(exception.showHelp()) { logstalgia_help(); } else { logstalgia_quit(exception.what()); } } if(ls!=0) delete ls; if(exporter!=0) delete exporter; display.quit(); return 0; }
int main(int argc, char *argv[]) { ConfFile conf; std::vector<std::string> files; SDLAppInit("Logstalgia", "logstalgia"); #ifdef _WIN32 SDLApp::initConsole(); #endif try { settings.parseArgs(argc, argv, conf, &files); //set log level Logger::getDefault()->setLevel(settings.log_level); #ifdef _WIN32 // hide console if not needed if(settings.log_level == LOG_LEVEL_OFF && !SDLApp::existing_console) { SDLApp::showConsole(false); } #endif //load config if(!settings.load_config.empty()) { conf.clear(); conf.load(settings.load_config); //apply args to loaded conf file settings.parseArgs(argc, argv, conf); } if(!files.empty()) { std::string path = files[files.size()-1]; ConfSectionList* sectionlist = conf.getSections("logstalgia"); if(sectionlist!=0) { for(ConfSectionList::iterator sit = sectionlist->begin(); sit != sectionlist->end(); sit++) { (*sit)->setEntry("path", path); } } else { conf.setEntry("logstalgia", "path", path); } } //apply the config / see if its valid settings.importDisplaySettings(conf); settings.importLogstalgiaSettings(conf); //save config if(!settings.save_config.empty()) { conf.save(settings.save_config); exit(0); } } catch(ConfFileException& exception) { SDLAppQuit(exception.what()); } #ifdef _WIN32 if(settings.path.empty()) { //open file dialog settings.path = win32LogSelector(); //TODO chdir back to original directory if(settings.path.empty()) return 0; } #endif if(settings.path.empty()) SDLAppQuit("no file supplied"); //enable vsync display.enableVsync(settings.vsync); // this causes corruption on some video drivers if(settings.multisample) display.multiSample(4); if(settings.resizable && settings.output_ppm_filename.empty()) { display.enableResize(true); } display.init("Logstalgia", settings.display_width, settings.display_height, settings.fullscreen); // Don't minimize when alt-tabbing so you can fullscreen logstalgia on a second monitor #if SDL_VERSION_ATLEAST(2,0,0) SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); #endif //disable OpenGL 2.0 functions if not supported if(!GLEW_VERSION_2_0) settings.ffp = true; //init frame exporter FrameExporter* exporter = 0; if(!settings.output_ppm_filename.empty()) { try { exporter = new PPMExporter(settings.output_ppm_filename); } catch(PPMExporterException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "could not write to '%s'", exception.what()); SDLAppQuit(errormsg); } } if(settings.multisample) glEnable(GL_MULTISAMPLE_ARB); Logstalgia* ls = 0; try { ls = new Logstalgia(settings.path); if(exporter != 0) { ls->setFrameExporter(exporter); } for(const std::string& group : settings.groups) { ls->addGroup(group); } ls->setBackground(settings.background_colour); ls->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()) { settings.help(); } else { SDLAppQuit(exception.what()); } } if(ls!=0) delete ls; if(exporter!=0) delete exporter; display.quit(); return 0; }