55 #include "common/glew_wrappers.hh"
63 #include <OpenFlipper/SimpleOpt/SimpleOpt.h>
85 #include "StackWalker/StackWalker.hh"
91 virtual void OnOutput(LPCSTR szText)
94 std::ofstream crashFile;
95 QString crashName = OpenFlipper::Options::configDirStr() + QDir::separator() +
"CrashDump.txt";
96 crashFile.open(crashName.toLatin1(),std::ios::out | std::ios::app);
116 if (AttachConsole(-1))
119 FILE* check = freopen(
"CONIN$",
"r", stdin);
121 std::cerr <<
"Error reopening stdin" << std::endl;
123 check = freopen(
"CONOUT$",
"w", stdout);
125 std::cerr <<
"Error reopening stdout" << std::endl;
127 check = freopen(
"CONOUT$",
"w", stderr);
129 std::cerr <<
"Error reopening stderr" << std::endl;
139 FILE* check = freopen(
"CONIN$",
"r", stdin);
141 std::cerr <<
"Error reopening stdin" << std::endl;
143 check = freopen(
"CONOUT$",
"w", stdout);
145 std::cerr <<
"Error reopening stdout" << std::endl;
147 check = freopen(
"CONOUT$",
"w", stderr);
149 std::cerr <<
"Error reopening stderr" << std::endl;
153 if (OpenFlipper::Options::logToConsole())
157 FILE* check = freopen(
"CONIN$",
"r", stdin);
159 std::cerr <<
"Error reopening stdin" << std::endl;
161 check = freopen(
"CONOUT$",
"w", stdout);
163 std::cerr <<
"Error reopening stdout" << std::endl;
165 check = freopen(
"CONOUT$",
"w", stderr);
167 std::cerr <<
"Error reopening stderr" << std::endl;
186 int size = backtrace(addresses, 20);
187 strings = backtrace_symbols(addresses, size);
188 std::cerr <<
"Stack frames: " << size << std::endl;
189 for(
int i = 0; i < size; i++)
190 std::cerr << i <<
": " << strings[i] << std::endl;
202 void segfaultHandling (
int) {
205 std::signal(SIGSEGV, SIG_DFL);
208 std::cerr <<
"\n" << std::endl;
209 std::cerr <<
"\n" << std::endl;
210 std::cerr <<
"\33[31m" <<
"=====================================================" << std::endl;
211 std::cerr <<
"\33[31m" <<
"OpenFlipper or one of its plugins caused a Segfault." << std::endl;
212 std::cerr <<
"\33[31m" <<
"This should not happen,... Sorry :-(" << std::endl;
213 std::cerr <<
"\33[31m" <<
"=====================================================" << std::endl;
214 std::cerr <<
"\n" << std::endl;
218 std::cerr <<
"\33[0m" <<
"Trying a backtrace to show what happened last: " << std::endl;
221 std::cerr <<
"\n" << std::endl;
222 std::cerr <<
"Backtrace completed, trying to abort now ..." << std::endl;
227 StackWalkerToConsole sw;
232 std::cerr <<
"Trying to get additional information (This might fail if the memory is corrupted)." << std::endl;
234 if (OpenFlipper::Options::gui()) {
235 for (
unsigned int i = 0 ; i < 4 ; ++i) {
243 enum {OPT_HELP , OPT_STEREO, OPT_BATCH ,OPT_CONSOLE_LOG , OPT_DEBUGGING, OPT_FULLSCREEN,
244 OPT_HIDDDEN_LOGGER , OPT_NOSPLASH ,OPT_HIDDDEN_TOOLBOX , OPT_LOAD_POLYMESHES,
245 OPT_REMOTE, OPT_REMOTE_PORT};
247 CSimpleOpt::SOption g_rgOptions[] = {
248 { OPT_DEBUGGING , (
char*)
"--debug" , SO_NONE },
249 { OPT_HELP , (
char*)
"-?" , SO_NONE },
250 { OPT_HELP , (
char*)
"--help" , SO_NONE },
251 { OPT_HELP , (
char*)
"-h" , SO_NONE },
252 { OPT_STEREO , (
char*)
"--disable-stereo" , SO_NONE },
253 { OPT_BATCH , (
char*)
"-b" , SO_NONE },
254 { OPT_CONSOLE_LOG , (
char*)
"-c" , SO_NONE },
255 { OPT_CONSOLE_LOG , (
char*)
"--log-to-console" , SO_NONE },
256 { OPT_FULLSCREEN , (
char*)
"-f" , SO_NONE },
257 { OPT_HIDDDEN_LOGGER , (
char*)
"-l" , SO_NONE },
258 { OPT_NOSPLASH , (
char*)
"--no-splash" , SO_NONE },
259 { OPT_HIDDDEN_TOOLBOX , (
char*)
"-t" , SO_NONE },
260 { OPT_LOAD_POLYMESHES , (
char*)
"-p" , SO_NONE },
261 { OPT_REMOTE , (
char*)
"--remote-control" , SO_NONE },
262 { OPT_REMOTE_PORT , (
char*)
"--remote-port" , SO_REQ_SEP },
267 std::cerr <<
"OpenFlipper [Options] <filenames> " << std::endl << std::endl;;
268 std::cerr <<
"Possible Options : " << std::endl;
269 std::cerr << std::endl;
271 std::cerr <<
"Load/Save Options:" << std::endl;
272 std::cerr <<
" -p \t: Open files as PolyMeshes" << std::endl;
273 std::cerr << std::endl;
275 std::cerr <<
"Gui Options:" << std::endl;
276 std::cerr <<
" -f \t\t: Start Fullscreen" << std::endl;
277 std::cerr <<
" -l \t\t: Start with hidden logger" << std::endl;
278 std::cerr <<
" -t \t\t: Start with hidden Toolbox" << std::endl;
279 std::cerr <<
" --no-splash \t: Disable splash screen" << std::endl;
281 std::cerr <<
" --disable-stereo \t: Disable Stereo Mode" << std::endl;
282 std::cerr << std::endl;
284 std::cerr <<
"Log options:" << std::endl;
285 std::cerr <<
" --log-to-console ( -c ) \t: Write logger window contents to console" << std::endl;
286 std::cerr << std::endl;
288 std::cerr <<
"Other options:" << std::endl;
289 std::cerr <<
" -b \t: Batch mode, you have to provide a script for execution" << std::endl;
290 std::cerr <<
" --remote-control \t: Batch mode accepting remote connections" << std::endl;
292 std::cerr << std::endl;
295 std::cerr <<
" -h \t: This help" << std::endl;
303 bool openPolyMeshes =
false;
304 bool remoteControl =
false;
306 bool parseCommandLineOptions(CSimpleOpt& args){
313 int QtVersionMajor, QtVersionMinor, QtVersionPatch;
314 if(sscanf(qVersion(),
"%1d.%1d.%1d",&QtVersionMajor, &QtVersionMinor, &QtVersionPatch) == 3)
316 if(QtVersionMajor == 5 && QtVersionMinor >= 7)
318 if(QtVersionPatch < 2)
320 std::cerr <<
"The used Qt Version does not support stereo mode. Disabling stereo mode." << std::endl;
321 OpenFlipper::Options::stereo(
false);
324 std::cerr <<
"Stereo Mode has not been tested for the used Qt Version." << std::endl;
331 while (args.Next()) {
333 if (args.LastError() == SO_SUCCESS) {
335 switch (args.OptionId() ) {
337 OpenFlipper::Options::nogui(
true);
339 case OPT_CONSOLE_LOG:
340 OpenFlipper::Options::logToConsole(
true);
343 OpenFlipper::Options::debug(
true);
346 OpenFlipper::Options::stereo(
false);
348 case OPT_HIDDDEN_TOOLBOX:
351 case OPT_HIDDDEN_LOGGER:
352 OpenFlipper::Options::loggerState(OpenFlipper::Options::Hidden);
357 case OPT_LOAD_POLYMESHES:
358 openPolyMeshes =
true;
364 OpenFlipper::Options::remoteControl(
true);
366 case OPT_REMOTE_PORT:
367 port = args.OptionArg();
368 std::cerr <<
"Got option : " << port.toStdString() << std::endl;
369 OpenFlipper::Options::remoteControl(port.toInt());
376 std::cerr <<
"Invalid argument: " << args.OptionText() << std::endl;
384 int main(
int argc,
char **argv)
389 for (
int i = 0; i < argc; i++) {
390 if(strlen(argv[i]) > 4) {
391 if( ( (argv[i])[0] ==
'-' ) &&
392 ( (argv[i])[1] ==
'p' ) &&
393 ( (argv[i])[2] ==
's' ) &&
394 ( (argv[i])[3] ==
'n' ) ) {
396 argv[i] = (
char *)
"";
401 OpenFlipper::Options::argc(&argc);
402 OpenFlipper::Options::argv(&argv);
404 CSimpleOpt argBatch(argc, argv, g_rgOptions);
407 while (argBatch.Next())
408 if (argBatch.OptionId() == OPT_BATCH ){
409 OpenFlipper::Options::nogui(
true);
413 CSimpleOpt args(argc, argv, g_rgOptions);
415 #ifndef NO_CATCH_SIGSEGV
417 std::signal(SIGSEGV, segfaultHandling);
420 OpenFlipper::Options::windowTitle(
TOSTRING(PRODUCT_STRING)
" v" + OpenFlipper::Options::coreVersion());
422 if ( !OpenFlipper::Options::nogui() ) {
425 QApplication::setColorSpec( QApplication::CustomColor );
426 QApplication app(argc,argv);
430 QCoreApplication::setOrganizationName(
"rwth-aachen.de");
431 QCoreApplication::setApplicationName(
"graphics.openflipper");
434 if ( !QGLFormat::hasOpenGL() ) {
435 std::cerr <<
"This system has no OpenGL support.\n";
440 glutInit(&argc,argv);
446 if ( !parseCommandLineOptions(args) ) {
458 if (tLang ==
"locale")
459 tLang = QLocale::system().name();
462 QTranslator qtTranslator;
467 qtTranslator.load(
"qt_" + tLang, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
470 app.installTranslator(&qtTranslator);
473 QString translationDir = OpenFlipper::Options::translationsDirStr() + QDir::separator();
477 QDir dir(translationDir);
478 dir.setFilter(QDir::Files);
480 QFileInfoList list = dir.entryInfoList();
482 for (
int i = 0; i < list.size(); ++i) {
483 QFileInfo fileInfo = list.at(i);
485 if ( fileInfo.baseName().contains(tLang) ){
486 QTranslator* myAppTranslator =
new QTranslator();
488 if ( myAppTranslator->load( fileInfo.filePath() ) ){
491 app.installTranslator(myAppTranslator);
493 delete myAppTranslator;
505 for (
int i = 0 ; i < args.FileCount(); ++i )
512 QCoreApplication app(argc,argv);
516 QCoreApplication::setOrganizationName(
"rwth-aachen.de");
517 QCoreApplication::setApplicationName(
"graphics.openflipper");
523 if ( !parseCommandLineOptions(args) ) {
531 for (
int i = 0 ; i < args.FileCount(); ++i )
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void init()
Second initialization stage.
void setValue(const QString &key, const QVariant &value)
Wrapper function which makes it possible to enable Debugging output with -DOPENFLIPPER_SETTINGS_DEBUG...
DLLEXPORT OpenFlipperQSettings & OpenFlipperSettings()
QSettings object containing all program settings of OpenFlipper.
#define TOSTRING(x)
QSettings object containing all program settings of OpenFlipper.
ACG::SceneGraph::DrawModes::DrawMode drawMode(int _viewer)
Get the current draw Mode of a Viewer.
void commandLineOpen(const char *_filename, bool _asPolyMesh)
Load an object from the commandline on application start.
void commandLineScript(const char *_filename)
Load a script from the commandline on application start.
std::string description() const