int main(int argc, char *argv[]) { KAboutData aboutData( "rkward", I18N_NOOP ("RKWard"), version, description, KAboutData::License_GPL, "(c) 2002, 2004, 2005, 2006", 0, "http://rkward.sf.net", "*****@*****.**"); aboutData.addAuthor ("Thomas Friedrichsmeier", I18N_NOOP ("Project leader / main developer"), 0); aboutData.addAuthor ("Pierre Ecochard", I18N_NOOP ("C++ coder since 0.2.9"), 0); aboutData.addCredit ("Contributors in alphabetical order", 0, 0); aboutData.addCredit ("Philippe Grosjean", I18N_NOOP ("Several helpful comments and discussions"), 0); aboutData.addCredit ("Adrien d'Hardemare", I18N_NOOP ("Plugins and patches"), 0); aboutData.addCredit ("Yves Jacolin", I18N_NOOP ("New website"), 0); aboutData.addCredit ("Prasenjit Kapat", I18N_NOOP ("Several plugins"), 0); aboutData.addCredit ("Marco Martin", I18N_NOOP ("A cool icon"), 0); aboutData.addCredit ("Daniele Medri", I18N_NOOP ("RKWard logo, many suggestions, help on wording"), 0); aboutData.addCredit ("Stefan Roediger", I18N_NOOP ("Many plugins, suggestions, marketing, translations"), 0); aboutData.addCredit ("David Sibai", I18N_NOOP ("Several valuable comments, hints and patches"), 0); aboutData.addCredit ("Ilias Soumpasis", I18N_NOOP ("Translation, Suggestions, plugins"), 0); aboutData.addCredit ("Ralf Tautenhahn", I18N_NOOP ("Many comments, useful suggestions, and bug reports"), 0); aboutData.addCredit ("Roland Vollgraf", I18N_NOOP ("Some patches"), 0); aboutData.addCredit (I18N_NOOP ("Many more people on [email protected]"), I18N_NOOP ("Sorry, if we forgot to list you. Please contact us to get added"), 0); // before initializing the commandline args, remove the ".bin" from "rkward.bin". // This is so it prints "Usage rkward..." instead of "Usage rkward.bin...", etc. // it seems safest to keep a copy, since the shell still owns argv[0] char *argv_zero_copy = argv[0]; argv[0] = qstrdup (QString (argv_zero_copy).remove (".bin").local8Bit ()); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineArgs::addCmdLineOptions( options ); // Add our own options. RKWardApplication app; if (app.isRestored ()) { RESTORE(RKWardMainWindow); // well, whatever this is supposed to do -> TODO } else { KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); RK_Debug_Level = 5 - QString (args->getOption ("debug-level")).toInt (); RK_Debug_Flags = QString (args->getOption ("debug-flags")).toInt (0, 2); qDebug ("Debug-flags as decimal: %d", RK_Debug_Flags); KURL *open_url = 0; if (args->count ()) { open_url = new KURL (args->makeURL (args->arg (0))); } args->clear(); new RKWardMainWindow(open_url); } // do it! int status = app.exec (); // restore old argv[0] so the shell is happy argv[0] = argv_zero_copy; return status; }
int main(int argc, char *argv[]) { options.add ("evaluate <Rcode>", ki18n ("After starting (and after loading the specified workspace, if applicable), evaluate the given R code."), 0); options.add ("debug-level <level>", ki18n ("Verbosity of debug messages (0-5)"), "2"); options.add ("debug-flags <flags>", ki18n ("Mask for components to debug (see debug.h)"), QString::number (DEBUG_ALL).toLocal8Bit ()); options.add ("debugger <command and arguments>", ki18n ("Debugger for the frontend. Specify last, or add '--' after all debugger arguments"), ""); options.add ("backend-debugger <command>", ki18n ("Debugger for the backend. (Enclose any debugger arguments in single quotes ('') together with the command. Make sure to re-direct stdout!)"), ""); options.add ("r-executable <command>", ki18n ("Use specified R installation, instead of the one configured at compile time (note: rkward R library must be installed to that installation of R)"), ""); options.add ("reuse", ki18n ("Reuse a running RKWard instance (if available). If a running instance is reused, only the file arguments will be interpreted, all other options will be ignored."), 0); options.add ("nowarn-external", ki18n ("When used in conjunction with rkward://runplugin/-URLs specified on the command line, suppresses the warning about application-external (untrusted) links.")); options.add ("+[Files]", ki18n ("File or files to open, typically a workspace, or an R script file. When loading several things, you should specify the workspace, first."), 0); KAboutData aboutData("rkward", QByteArray (), ki18n ("RKWard"), RKWARD_VERSION, ki18n ("Frontend to the R statistics language"), KAboutData::License_GPL, ki18n ("(c) 2002, 2004 - 2016"), KLocalizedString (), "http://rkward.kde.org", "*****@*****.**"); aboutData.addAuthor (ki18n ("Thomas Friedrichsmeier"), ki18n ("Project leader / main developer")); aboutData.addAuthor (ki18n ("Pierre Ecochard"), ki18n ("C++ developer between 2004 and 2007")); aboutData.addAuthor (ki18n ("Prasenjit Kapat"), ki18n ("Many plugins, suggestions, plot history feature")); aboutData.addAuthor (ki18n ("Meik Michalke"), ki18n ("Many plugins, suggestions, rkwarddev package")); aboutData.addAuthor (ki18n ("Stefan Roediger"), ki18n ("Many plugins, suggestions, marketing, translations")); aboutData.addCredit (ki18n ("Contributors in alphabetical order")); aboutData.addCredit (ki18n ("Björn Balazs"), ki18n ("Extensive usability feedback")); aboutData.addCredit (ki18n ("Aaron Batty"), ki18n ("Whealth of feedback, hardware donations")); aboutData.addCredit (ki18n ("Jan Dittrich"), ki18n ("Extensive usability feedback")); aboutData.addCredit (ki18n ("Philippe Grosjean"), ki18n ("Several helpful comments and discussions")); aboutData.addCredit (ki18n ("Adrien d'Hardemare"), ki18n ("Plugins and patches")); aboutData.addCredit (ki18n ("Yves Jacolin"), ki18n ("New website")); aboutData.addCredit (ki18n ("Germán Márquez Mejía"), ki18n ("HP filter plugin, spanish translation"), 0); aboutData.addCredit (ki18n ("Marco Martin"), ki18n ("A cool icon")); aboutData.addCredit (ki18n ("Daniele Medri"), ki18n ("RKWard logo, many suggestions, help on wording")); aboutData.addCredit (ki18n ("David Sibai"), ki18n ("Several valuable comments, hints and patches")); aboutData.addCredit (ki18n ("Ilias Soumpasis"), ki18n ("Translation, Suggestions, plugins")); aboutData.addCredit (ki18n ("Ralf Tautenhahn"), ki18n ("Many comments, useful suggestions, and bug reports")); aboutData.addCredit (ki18n ("Jannis Vajen"), ki18n ("German Translation, bug reports")); aboutData.addCredit (ki18n ("Roland Vollgraf"), ki18n ("Some patches")); aboutData.addCredit (ki18n ("Roy Qu"), ki18n ("patches and helpful comments")); aboutData.addCredit (ki18n ("Many more people on [email protected]"), ki18n ("Sorry, if we forgot to list you. Please contact us to get added")); // before initializing the commandline args, remove the ".bin" from "rkward.bin". // This is so it prints "Usage rkward..." instead of "Usage rkward.bin...", etc. // it seems safest to keep a copy, since the shell still owns argv char *argv_copy[argc]; argv_copy[0] = qstrdup (QString (argv[0]).remove (".frontend").replace (".exe", ".bat").toLocal8Bit ()); for (int i = 1; i < argc; ++i) { argv_copy[i] = argv[i]; } KCmdLineArgs::init (argc, argv_copy, &aboutData); KCmdLineArgs::addCmdLineOptions( options ); // Add our own options. KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); RK_Debug_Level = DL_FATAL - QString (args->getOption ("debug-level")).toInt (); RK_Debug_Flags = QString (args->getOption ("debug-flags")).toInt (); if (!args->getOption ("debugger").isEmpty ()) { RK_DEBUG (DEBUG_ALL, DL_ERROR, "--debugger option should have been handled by wrapper script. Ignoring."); } if (args->count ()) { QStringList urls_to_open; for (int i = 0; i < args->count (); ++i) { urls_to_open.append (KCmdLineArgs::makeURL (decodeArgument (args->arg (i)).toUtf8 ()).url ()); } RKGlobals::startup_options["initial_urls"] = urls_to_open; RKGlobals::startup_options["warn_external"] = args->isSet ("warn-external"); } RKGlobals::startup_options["evaluate"] = decodeArgument (args->getOption ("evaluate")); RKGlobals::startup_options["backend-debugger"] = decodeArgument (args->getOption ("backend-debugger")); RKWardApplication app; // No, I do not really understand the point of separating KDE_LANG from LANGUAGE. We do honor it in so far as not // forcing LANGUAGE on the backend, though. Having language as LANGUAGE makes code in RKMessageCatalog much easier compared to KCatalog. qputenv ("LANGUAGE", QFile::encodeName (KGlobal::locale ()->language ())); // install message handler *after* the componentData has been initialized RKSettingsModuleDebug::debug_file = new QTemporaryFile (QDir::tempPath () + "/rkward.frontend"); RKSettingsModuleDebug::debug_file->setAutoRemove (false); if (RKSettingsModuleDebug::debug_file->open ()) { RK_DEBUG (APP, DL_INFO, "Full debug output is at %s", qPrintable (RKSettingsModuleDebug::debug_file->fileName ())); qInstallMsgHandler (RKDebugMessageOutput); } if (app.isSessionRestored ()) { RESTORE(RKWardMainWindow); // well, whatever this is supposed to do -> TODO } else { new RKWardMainWindow (); } args->clear(); // Usually, KDE always adds the current directory to the list of prefixes. // However, since RKWard 0.5.6, the main binary is in KDE's libexec dir, which defies this mechanism. Therefore, RKWARD_ENSURE_PREFIX is set from the wrapper script. char *add_path = getenv ("RKWARD_ENSURE_PREFIX"); if (add_path) KGlobal::dirs ()->addPrefix (QString::fromLocal8Bit (add_path)); // do it! int status = app.exec (); qInstallMsgHandler (0); RKSettingsModuleDebug::debug_file->close (); return status; }