22#include "RConfigure.h"
47#include "TApplicationCommandLineOptionsHelp.h"
89 gROOT->EndOfProcessCleanups();
119 void * ,
Int_t numOptions) :
146 Error(
"TApplication",
"only one instance of TApplication allowed");
152 ::Fatal(
"TApplication::TApplication",
"ROOT system not initialized");
155 ::Fatal(
"TApplication::TApplication",
"gSystem not initialized");
158 if (!hasRegisterAtExit) {
161 hasRegisterAtExit =
kTRUE;
163 gROOT->SetName(appClassName);
166 if (argc && *argc > 0) {
171 for (
int i = 0; i <
fArgc; i++)
181 if (
gSystem->Getenv(
"ROOT_BATCH"))
185 gSystem->NotifyApplicationCreated();
201 gROOT->SetLineHasBeenProcessed();
205 gROOT->SetApplication(
this);
214 for (
int i = 0; i <
fArgc; i++)
258 const char *ttpath =
gEnv->GetValue(
"Root.TTFontPath",
259 TROOT::GetTTFFontDir());
265 #if !defined(R__WIN32)
267 ttfont &&
gEnv->GetValue(
"Root.UseTTFonts", 1)) {
275 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TVirtualX",
"x11ttf")))
276 if (
h->LoadPlugin() == -1)
277 Info(
"InitializeGraphics",
"no TTF support");
304 if (!only_web &&
gEnv->GetValue(
"Canvas.UseScreenFactor", 1)) {
310 gStyle->SetScreenFactor(0.001 *
h);
349 static char null[1] = {
"" };
361 for (i = 1; i < *argc; i++) {
362 if (!strcmp(argv[i],
"-?") || !strncmp(argv[i],
"-h", 2) ||
363 !strncmp(argv[i],
"--help", 6)) {
366 }
else if (!strncmp(argv[i],
"--version", 9)) {
367 fprintf(stderr,
"ROOT Version: %s\n",
gROOT->GetVersion());
368 fprintf(stderr,
"Built for %s on %s\n",
370 gROOT->GetGitDate());
372 fprintf(stderr,
"From %s@%s\n",
373 gROOT->GetGitBranch(),
374 gROOT->GetGitCommit());
377 }
else if (!strcmp(argv[i],
"-config")) {
378 fprintf(stderr,
"ROOT ./configure options:\n%s\n",
gROOT->GetConfigOptions());
380 }
else if (!strcmp(argv[i],
"-a")) {
381 fprintf(stderr,
"ROOT splash screen is not visible with root.exe, use root instead.\n");
383 }
else if (!strcmp(argv[i],
"-b")) {
386 }
else if (!strcmp(argv[i],
"-n")) {
389 }
else if (!strcmp(argv[i],
"-t")) {
395 }
else if (!strcmp(argv[i],
"-q")) {
398 }
else if (!strcmp(argv[i],
"-l")) {
402 }
else if (!strcmp(argv[i],
"-x")) {
405 }
else if (!strcmp(argv[i],
"-splash")) {
409 }
else if (strncmp(argv[i],
"--web", 5) == 0) {
411 const char *opt = argv[i] + 5;
413 gROOT->SetWebDisplay((*opt ==
'=') ? opt + 1 :
"");
414 }
else if (!strcmp(argv[i],
"-e")) {
425 Warning(
"GetOptions",
"-e must be followed by an expression.");
427 }
else if (!strcmp(argv[i],
"--")) {
429 bool warnShown =
false;
435 if (!
dynamic_cast<TNamed*
>(
f)) {
436 Error(
"GetOptions()",
"Inconsistent file entry (not a TObjString)!");
450 if (macro && !warnShown && (warnShown =
true))
451 Warning(
"GetOptions",
"-- is used with several macros. "
452 "The arguments will be passed to the last one.");
464 for (; i < *argc; i++) {
469 str.
EndsWith(
",") ? str[str.Length() - 1] =
')' : str +=
')';
471 Warning(
"GetOptions",
"no macro to pass arguments to was provided. "
472 "Everything after the -- will be ignored.");
473 for (; i < *argc; i++)
476 }
else if (argv[i][0] !=
'-' && argv[i][0] !=
'+') {
479 char *arg = strchr(argv[i],
'(');
480 if (arg) *arg =
'\0';
482 if (
gSystem->ExpandPathName(expandedDir)) {
498 if (!arg && !
gSystem->GetPathInfo(path.
Data(), &
id, &
size, &flags, &modtime)) {
502 pwd =
gSystem->WorkingDirectory();
504 gSystem->ChangeDirectory(expandedDir);
506 }
else if (!strcmp(
gROOT->GetName(),
"Rint")) {
507 Warning(
"GetOptions",
"only one directory argument can be specified (%s)", expandedDir.
Data());
509 }
else if (
size > 0) {
515 Warning(
"GetOptions",
"file %s has size 0, skipping", expandedDir.
Data());
522 if (!strcmp(
gROOT->GetName(),
"Rint"))
523 Warning(
"GetOptions",
"file %s not found", expandedDir.
Data());
546 if (!strcmp(
gROOT->GetName(),
"Rint")) {
547 Error(
"GetOptions",
"macro %s not found", fname.
Data());
565 for (i = 0; i < *argc; i++) {
566 if (strcmp(argv[i],
"")) {
584 Emit(
"HandleIdleTimer()");
640 auto res =
gSystem->Exec(cMac);
641#elif defined(R__WIN32)
643 TString cWindows(
"start \"\" ");
645 auto res =
gSystem->Exec(cWindows);
648 if (!
gSystem->Getenv(
"DISPLAY")) {
650 Warning(
"OpenInBrowser",
"The $DISPLAY is not set! Please manually open (e.g. Ctrl-click) %s\n", url.
Data());
656 auto res =
gSystem->Exec(cLinux);
658 if (res != EXIT_SUCCESS) {
659 Warning(
"OpenInBrowser",
"Could not automatically open web browser (e.g. due to missing X11)! Please manually open (e.g. Ctrl-click) %s\n", url.
Data());
662 Info(
"OpenInBrowser",
"A new tab should have opened in your browser.");
666enum EUrl { kURLforClass, kURLforNameSpace, kURLforStruct };
679 TString url =
"https://root.cern/doc/";
681 TPRegexp re4(R
"(.*/(v\d)-(\d\d)-00-patches)");
682 const char *branchName =
gROOT->GetGitBranch();
683 TObjArray *objarr = re4.MatchS(branchName);
701 if (scopeType == kURLforClass) {
703 }
else if (scopeType == kURLforStruct) {
738 methodArguments.
ReplaceAll(
"ostream",
"std::ostream");
739 methodArguments.
ReplaceAll(
"istream",
"std::istream");
740 methodArguments.
ReplaceAll(
"map",
"std::map");
741 methodArguments.
ReplaceAll(
"vector",
"std::vector");
745 scopeNameRE.Append(scopeName);
746 scopeNameRE.Append(
"::\\b");
748 argFix.Substitute(methodArguments,
"");
749 return methodArguments;
763 text.ReplaceAll(
"\n",
"%0A");
764 text.ReplaceAll(
"#",
"%23");
765 text.ReplaceAll(
";",
"%3B");
766 text.ReplaceAll(
"\"",
"%22");
767 text.ReplaceAll(
"`",
"%60");
768 text.ReplaceAll(
"+",
"%2B");
769 text.ReplaceAll(
"/",
"%2F");
792 scopeNameRE.Append(scopeName);
793 scopeNameRE.Append(
"::\\b");
795 returnFix.Substitute(returnType,
"");
801 returnType.
Prepend(
"virtual ");
811 returnType.
ReplaceAll(
"istream",
"std::istream");
812 returnType.
ReplaceAll(
"ostream",
"std::ostream");
814 returnType.
ReplaceAll(
"vector",
"std::vector");
838 if (!dataMember->
IsEnum()) {
843 md5DataMember.Append(
" ");
845 md5DataMember.Append(scopeName);
846 md5DataMember.Append(
"::");
848 md5DataMember.Append(dataMemberName);
849 md5DataMember.Append(dataMemberName);
851 TString urlForDataMember = UrlGenerator(scopeName, scopeType);
853 urlForDataMember.
Append(
"#a");
854 urlForDataMember.
Append(md5DataMember.MD5());
855 return urlForDataMember;
862 if (scopeEnumeration.
Contains(
"(unnamed)")) {
864 md5EnumClass.
Append(scopeName);
865 md5EnumClass.
Append(
"::@1@1");
869 md5EnumClass.
Append(scopeEnumeration);
873 md5EnumClass.
Append(enumOnlyName);
877 md5Enumerator.Append(scopeName);
878 md5Enumerator.Append(
"::");
879 md5Enumerator.Append(dataMemberName);
880 md5Enumerator.Append(dataMemberName);
882 TString url = UrlGenerator(scopeName, scopeType);
888 url.
Append(md5Enumerator.MD5());
906 TString md5Enumeration(scopeName);
907 md5Enumeration.Append(
"::");
908 md5Enumeration.Append(enumeration);
909 md5Enumeration.Append(enumeration);
911 TString url(UrlGenerator(scopeName, scopeType));
914 url.
Append(md5Enumeration.MD5());
920enum EMethodKind { kURLforMethod, kURLforStructor };
936 EMethodKind methodType, EUrl scopeType)
939 if (methodType == kURLforMethod) {
942 md5Text.
Append((FormatReturnTypeForDoxygen(scopeName, func)));
943 if (scopeType == kURLforNameSpace) {
952 md5Text.
Append(scopeName);
954 md5Text.
Append(methodName);
955 md5Text.
Append(methodName);
957 md5Text.
Append(FormatMethodArgsForDoxygen(scopeName, func));
959 TString url = UrlGenerator(scopeName, scopeType);
974 std::vector<TString> lines;
975 lines.emplace_back(
"```");
977 gROOT->GetVersion()));
979 if (!strcmp(
gROOT->GetGitBranch(),
gROOT->GetGitCommit())) {
980 static const char *months[] = {
"January",
"February",
"March",
"April",
"May",
981 "June",
"July",
"August",
"September",
"October",
982 "November",
"December"};
984 Int_t iday = idatqq%100;
985 Int_t imonth = (idatqq/100)%100;
986 Int_t iyear = (idatqq/10000);
989 gROOT->GetGitBranch(),
990 iday,months[imonth-1],iyear));
995 gROOT->GetGitBranch(),
996 gROOT->GetGitCommit()));
999 gSystem->GetBuildCompilerVersionStr(), __cplusplus));
1000 lines.emplace_back(
"Binary directory: "+
gROOT->GetBinDir());
1001 lines.emplace_back(
"```");
1003 for (
auto&
line : lines) {
1020 if (
type ==
"bug") {
1024_Please read [tips for efficient and successful posting](https://root-forum.cern.ch/t/tips-for-efficient-and-successful-posting/28292) and [posting code](https://root-forum.cern.ch/t/posting-code-read-this-first/28293)_
1028A clear and concise description of what the wrong behavior is.
1030### Expected behavior
1032A clear and concise description of what you expected to happen.
1037Steps to reproduce the behavior:
10381. Your code that triggers the issue: at least a part; ideally something we can run ourselves.
10392. Don't forget to attach the required input files!
10403. How to run your code and / or build it, e.g. `root myMacro.C`, ...
1047Please specify also how you obtained ROOT, such as `dnf install` / binary download / you built it yourself.
1050### Additional context
1052Add any other context about the problem here.
1054 report_template = FormatHttpUrl(report_template);
1056 OpenInBrowser("\"https://root-forum.cern.ch/new-topic?category=ROOT&tags=bug&body="+report_template+
"&\"");
1058 Warning(
"OpenForumTopic",
"cannot find \"%s\" as type for a Forum topic\n"
1059 "Available types are 'bug'.",
type.Data());
1072 if (
type ==
"bug") {
1074 "\"https://github.com/root-project/root/issues/new?labels=bug&template=bug_report.yml&root-version=" +
1076 }
else if (
type ==
"improvement") {
1077 OpenInBrowser(
"\"https://github.com/root-project/root/issues/"
1078 "new?labels=improvement&template=improvement_report.yml&root-version=" +
1080 }
else if (
type ==
"feature") {
1082 "\"https://github.com/root-project/root/issues/new?labels=new+feature&template=feature_request.yml\"");
1085 "Cannot find GitHub issue type \"%s\".\n"
1086 "Available types are 'bug', 'feature' and 'improvement'.",
1107 scopeType = kURLforNameSpace;
1108 }
else if (clas->Property() &
kIsStruct) {
1109 scopeType = kURLforStruct;
1111 scopeType = kURLforClass;
1121 if (strippedClass == memberName) {
1122 Error(
"OpenReferenceGuideFor",
"Unknown entity \"%s\" - global variables / functions not supported yet!",
1123 strippedClass.
Data());
1127 TString scopeName = strippedClass(0, strippedClass.
Length() - memberName.
Length() - 2);
1132 Warning(
"OpenReferenceGuideFor",
"\"%s\" does not exist in ROOT!", scopeName.
Data());
1138 scopeType = kURLforNameSpace;
1140 scopeType = kURLforStruct;
1142 scopeType = kURLforClass;
1147 int bracket = memberName.
First(
"(");
1149 memberName.
Remove(bracket);
1154 TString baseClName = ((TMethod *)func)->GetClass()->GetName();
1156 EMethodKind methodType;
1158 if (baseClName == memberName) {
1159 methodType = kURLforStructor;
1161 }
else if (memberName[0] ==
'~') {
1162 methodType = kURLforStructor;
1165 methodType = kURLforMethod;
1168 OpenInBrowser(GetUrlForMethod(baseClName, memberName, func, methodType, scopeType));
1175 OpenInBrowser(GetUrlForEnumeration(scopeName, memberName, scopeType));
1182 TString baseClName = ((TMethod *)enumerator->GetClass())->GetName();
1183 OpenInBrowser(GetUrlForDataMember(baseClName, memberName, enumerator, scopeType));
1189 Warning(
"OpenReferenceGuideFor",
"cannot find \"%s\" as member of %s or its base classes! Check %s\n", memberName.
Data(),
1190 scopeName.
Data(), UrlGenerator(scopeName, scopeType).Data());
1203 if (!strippedCommand.
BeginsWith(
".forum ")) {
1204 Error(
"Forum",
"Unknown command! Use 'bug' after '.forum '");
1208 strippedCommand.
Remove(0, 7);
1225 Error(
"GitHub",
"Unknown command! Use 'bug', 'feature' or 'improvement' after '.gh '");
1229 strippedCommand.
Remove(0, 4);
1247 if ((strippedCommand ==
".help") || (strippedCommand ==
".?")) {
1249 Printf(
"\n ROOT special commands.");
1250 Printf(
" ==============================================================================");
1251 Printf(
" .L <filename>[flags]: load the given file with optional flags like\n"
1252 " + to compile or ++ to force recompile.\n"
1253 " Type .? TSystem::CompileMacro for a list of all flags.\n"
1254 " <filename> can also be a shared library; skip flags.");
1255 Printf(
" .(x|X) <filename>[flags](args) :\n"
1256 " same as .L <filename>[flags] and runs then a function\n"
1257 " with signature: ret_type filename(args).");
1258 Printf(
" .credits : show credits");
1259 Printf(
" .demo : launch GUI demo");
1260 Printf(
" .forum bug : ask for help with a bug or crash at the ROOT forum.");
1261 Printf(
" .gh [bug|feature|improvement]\n"
1262 " : submit a bug report, feature or improvement suggestion");
1263 Printf(
" .help Class::Member : open reference guide for that class member (or .?).\n"
1264 " Specifying '::Member' is optional.");
1265 Printf(
" .help edit : show line editing shortcuts (or .?)");
1266 Printf(
" .license : show license");
1267 Printf(
" .libraries : show loaded libraries");
1268 Printf(
" .ls : list contents of current TDirectory");
1269 Printf(
" .pwd : show current TDirectory, pad and style");
1270 Printf(
" .quit (or .exit) : quit ROOT (long form of .q)");
1271 Printf(
" .R [user@]host[:dir] [-l user] [-d dbg] [script] :\n"
1272 " launch process in a remote host");
1273 Printf(
" .qqq : quit ROOT - mandatory");
1274 Printf(
" .qqqqq : exit process immediately");
1275 Printf(
" .qqqqqqq : abort process");
1276 Printf(
" .which [file] : show path of macro file");
1277 Printf(
" .![OS_command] : execute OS-specific shell command");
1278 Printf(
" .!root -? : print ROOT usage (CLI options)");
1284 Error(
"Help",
"Unknown command!");
1289 strippedCommand.
Remove(0, 3);
1291 strippedCommand.
Remove(0, 5);
1296 if (strippedCommand ==
"edit") {
1297 Printf(
"\n ROOT terminal keyboard shortcuts (GNU-readline style).");
1299 #define FOOTNOTE " *"
1300 Printf(
"* Some of these commands might be intercepted by macOS predefined system shortcuts.");
1305 Printf(
" ==============================================================================");
1306 Printf(
" Arrow_Left : move cursor left [Ctrl+B]");
1307 Printf(
" Arrow_Right : move cursor right [Ctrl+F] [Ctrl+G]");
1309 Printf(
" Fn+Arrow_Left : move cursor to beginning of line [Ctrl+A]");
1311 Printf(
" Home : move cursor to beginning of line [Ctrl+A]");
1314 Printf(
" Fn+Arrow_Right : move cursor to end of line [Ctrl+E]");
1316 Printf(
" End : move cursor to end of line [Ctrl+E]");
1318 Printf(
" Ctrl+Arrow_Left : jump to previous word [Esc,B] [Alt,B]" FOOTNOTE);
1319 Printf(
" Ctrl+Arrow_Right : jump to next word [Esc,F] [Alt,F]" FOOTNOTE);
1321 Printf(
" Backspace : delete previous character [Ctrl+H]");
1322 Printf(
" Del : delete next character [Ctrl+D]");
1323 Printf(
" Esc,Backspace : delete previous word [Ctrl+W] [Esc,Ctrl+H] [Alt+Backspace] [Esc,Del] [Esc,Ctrl+Del]" FOOTNOTE);
1325 Printf(
" Ctrl+U : cut all characters between cursor and start of line");
1326 Printf(
" Ctrl+K : cut all characters between cursor and end of line");
1328 Printf(
" Ctrl+T : transpose characters");
1329 Printf(
" Esc,C : character to upper and jump to next word");
1330 Printf(
" Esc,L : word to lower case and jump to its end");
1331 Printf(
" Esc,U : word to upper case and jump to its end");
1332 Printf(
" Ctrl+Shift+C : copy clipboard content");
1333 Printf(
" Ctrl+Shift+V : paste clipboard content [Ctrl+Y] [Alt+Y]");
1335 Printf(
" Fn+Enter : toggle overwrite mode");
1337 Printf(
" Ins : toggle overwrite mode");
1340 Printf(
" Ctrl+_ : undo last keypress action");
1341 Printf(
" Tab : autocomplete command or print suggestions [Ctrl+I] [Esc,Tab]");
1342 Printf(
" Enter : execute command [Ctrl+J] [Ctrl+M]");
1343 Printf(
" Ctrl+L : clear prompt screen");
1344 Printf(
" Ctrl+D : quit ROOT (if empty line)");
1345 Printf(
" Ctrl+C : send kSigInt interrupt signal");
1346 Printf(
" Ctrl+Z : send kSigStop pause job signal");
1347 Printf(
" Ctrl+\\ : send kSigQuit quit job signal");
1349 Printf(
" Arrow_Down : navigate downwards in command history [Ctrl+N]");
1350 Printf(
" Arrow_Up : navigate upwards in command history [Ctrl+P]");
1351 Printf(
" Ctrl+R ; Ctrl+S : search command in your history by typing a string.\n"
1352 " Use Backspace if you mistyped (but not arrows).\n"
1353 " Press Ctrl+R (Ctrl+S) repeateadly to navigate matches in reverse (forward) order");
1354 Printf(
" Arrow_Right : after Ctrl+R (Ctrl+S), select current match of the history search\n"
1355 " [Ctrl+O] [Enter] [Ctrl+J] [Ctrl+M] [Arrow_Left] [Esc,Esc].\n"
1356 " Use Ctrl+F or Ctrl+G to cancel search and revert original line");
1370 if (
gROOT->IsBatch())
1373 if (
auto h =
gROOT->GetPluginManager()->FindHandler(
"TVirtualPad"))
1374 if (
h->LoadPlugin() == -1)
1378 TString title1 =
"ROOT interface to ";
1379 TString nativex, title;
1382 nativex =
"win32gdk";
1384 title = title1 +
"Win32gdk";
1385#elif defined(R__HAS_COCOA)
1388 title = title1 +
"Quartz";
1392 title = title1 +
"X11";
1395 TString guiBackend =
gEnv->
GetValue(
"Gui.Backend",
"native");
1397 if (guiBackend ==
"native") {
1398 guiBackend = nativex;
1401 title = title1 + guiBackend;
1404 if (
auto h =
gROOT->GetPluginManager()->FindHandler(
"TVirtualX", guiBackend)) {
1405 if (
h->LoadPlugin() == -1) {
1413 TString guiFactory =
gEnv->
GetValue(
"Gui.Factory",
"native");
1415 if (guiFactory ==
"native")
1416 guiFactory =
"root";
1418 if (
auto h =
gROOT->GetPluginManager()->FindHandler(
"TGuiFactory", guiFactory)) {
1419 if (
h->LoadPlugin() == -1) {
1458 if (!ln || strlen(ln) <= 0)
1470 while (
line.Tokenize(tkn, from,
" ")) {
1474 }
else if (tkn ==
"-d") {
1476 }
else if (tkn ==
"-close") {
1479 ::Warning(
"TApplication::ParseRemoteLine",
"unknown option: %s", tkn.
Data());
1487 }
else if (isHostDir) {
1492 }
else if (isScript) {
1522 if (!
line)
return 0;
1524 if (!strncmp(
line,
"-?", 2) || !strncmp(
line,
"-h", 2) ||
1525 !strncmp(
line,
"--help", 6)) {
1526 Info(
"ProcessRemote",
"remote session help:");
1527 Printf(
".R [user@]host[:dir] [-l user] [-d dbg] [[<]script] | [host] -close");
1528 Printf(
"Create a ROOT session on the specified remote host.");
1529 Printf(
"The variable \"dir\" is the remote directory to be used as working dir.");
1530 Printf(
"The username can be specified in two ways, \"-l\" having the priority");
1531 Printf(
"(as in ssh). A \"dbg\" value > 0 gives increasing verbosity.");
1532 Printf(
"The last argument \"script\" allows to specify an alternative script to");
1533 Printf(
"be executed remotely to startup the session, \"roots\" being");
1534 Printf(
"the default. If the script is preceded by a \"<\" the script will be");
1535 Printf(
"sourced, after which \"roots\" is executed. The sourced script can be ");
1536 Printf(
"used to change the PATH and other variables, allowing an alternative");
1537 Printf(
"\"roots\" script to be found.");
1538 Printf(
"To close down a session do \".R host -close\".");
1539 Printf(
"To switch between sessions do \".R host\", to switch to the local");
1540 Printf(
"session do \".R\".");
1541 Printf(
"To list all open sessions do \"gApplication->GetApplications()->Print()\".");
1545 TString hostdir, user, script;
1548 if (hostdir.
Length() <= 0) {
1558 }
else if (rc == 1) {
1569 const char *sc = (script.
Length() > 0) ? script.
Data() :
nullptr;
1580 static int PrintFile(
const char*
filename) {
1582 gSystem->ExpandPathName(sFileName);
1583 if (
gSystem->AccessPathName(sFileName)) {
1587 std::ifstream instr(sFileName);
1605 if (!strncmp(
line,
".R", 2)) {
1607 while (*(
line+
n) ==
' ')
1618 if (!strncasecmp(
line,
".qqqqqqq", 7)) {
1620 }
else if (!strncasecmp(
line,
".qqqqq", 5)) {
1621 Info(
"ProcessLine",
"Bye... (try '.qqqqqqq' if still running)");
1623 }
else if (!strncasecmp(
line,
".exit", 4) || !strncasecmp(
line,
".quit", 2)) {
1628 if (!strncmp(
line,
".gh", 3)) {
1633 if (!strncmp(
line,
".forum", 6)) {
1638 if (!strncmp(
line,
".?", 2) || !strncmp(
line,
".help", 5)) {
1643 if (!strncmp(
line,
".demo", 5)) {
1644 if (
gROOT->IsBatch()) {
1645 Error(
"ProcessLine",
"Cannot show demos in batch mode!");
1652 if (!strncmp(
line,
".license", 8)) {
1656 if (!strncmp(
line,
".credits", 8)) {
1660 return PrintFile(credits);
1663 if (!strncmp(
line,
".pwd", 4)) {
1673 if (!strncmp(
line,
".ls", 3)) {
1674 const char *opt =
nullptr;
1680 if (!strncmp(
line,
".which", 6)) {
1682 char *s = strtok(fn,
"+(");
1693 if (!strncmp(
line,
".L", 2) || !strncmp(
line,
".U", 2)) {
1694 TString aclicMode, arguments, io;
1699 Warning(
"ProcessLine",
"argument(s) \"%s\" ignored with .%c", arguments.
Data(),
line[1]);
1704 TString cmd(
line + 1);
1705 Ssiz_t posSpace = cmd.Index(
' ');
1706 if (posSpace ==
kNPOS)
1709 cmd.Remove(posSpace);
1723 if (!strncmp(
line,
".X", 2) || !strncmp(
line,
".x", 2)) {
1727 if (!strcmp(
line,
".reset")) {
1729 Printf(
"*** .reset not allowed, please use gROOT->Reset() ***");
1740 if (!strcmp(
line,
".libraries")) {
1766 static const Int_t kBufSize = 1024;
1768 if (!file || !*file)
return 0;
1777 ::Error(
"TApplication::ExecuteFile",
"macro %s not found in path %s", fname.
Data(),
1785 ::std::ifstream macro(exnam, std::ios::in);
1786 if (!macro.good()) {
1787 ::Error(
"TApplication::ExecuteFile",
"%s no such file", exnam);
1794 char currentline[kBufSize];
1795 char dummyline[kBufSize];
1805 bool res = (bool)macro.getline(currentline, kBufSize);
1806 if (macro.eof())
break;
1811 while (!macro.getline(dummyline, kBufSize) && !macro.eof()) {
1816 while (s && (*s ==
' ' || *s ==
'\t')) s++;
1823 if (strstr(cs,
"#ifndef__CLING__") || strstr(cs,
"#ifndef__CINT__") ||
1824 strstr(cs,
"#if!defined(__CLING__)") || strstr(cs,
"#if!defined(__CINT__)"))
1826 else if (ifndefc && (strstr(cs,
"#ifdef") || strstr(cs,
"#ifndef") ||
1827 strstr(cs,
"#ifdefined") || strstr(cs,
"#if!defined")))
1829 else if (ifndefc && strstr(cs,
"#endif")) {
1834 }
else if (ifndefc && !ifdef && strstr(cs,
"#else"))
1838 if (!*s || *s ==
'#' || ifndefc || !strncmp(s,
"//", 2))
continue;
1840 if (!comment && (!strncmp(s,
".X", 2) || !strncmp(s,
".x", 2))) {
1846 if (!strncmp(s,
"/*", 2)) comment = 1;
1850 s = strstr(s,
"*/");
1855 while (s && (*s ==
' ' || *s ==
'\t')) s++;
1857 if (!strncmp(s,
"//", 2))
continue;
1858 if (!strncmp(s,
"/*", 2)) {
1864 if (!comment && *s ==
'{') tempfile = 1;
1865 if (!comment)
break;
1874 exname += aclicMode;
1876 exname += arguments;
1881 tempbuf.
Form(
".x %s", exname.
Data());
1883 tempbuf.
Form(
".X%s %s", keep ?
"k" :
" ", exname.
Data());
1964 Emit(
"Terminate(Int_t)", status);
1978 Emit(
"LineProcessed(const char*)",
line);
1986 Emit(
"KeyPressed(Int_t)", key);
1994 Emit(
"ReturnPressed(char*)",
text);
2023 Printf(
"<TApplication::CreateApplication>: "
2024 "created default TApplication");
2025 delete []
a;
delete []
b;
2035 Int_t debug,
const char *script)
2052 if (strlen(au.GetUser()) > 0 && strlen(nu.GetUser()) > 0 &&
2053 !strcmp(au.GetUser(), nu.GetUser())) {
2054 if (!strncmp(au.GetHost(), nu.GetHost(), strlen(nu.GetHost())))
2061 ::Error(
"TApplication::Open",
"list of applications undefined - protocol error");
2072 TPluginHandler *
h =
nullptr;
2073 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TApplication",
"remote"))) {
2074 if (
h->LoadPlugin() == 0) {
2075 ap = (
TApplication *)
h->ExecPlugin(3, nu.GetUrl(), debug, script);
2077 ::Error(
"TApplication::Open",
"failed to load plugin for TApplicationRemote");
2080 ::Error(
"TApplication::Open",
"failed to find plugin for TApplicationRemote");
2087 TIter next(
gROOT->GetListOfBrowsers());
2089 while ((
b = (TBrowser*) next()))
2091 gROOT->RefreshBrowsers();
2095 "TApplicationRemote for %s could not be instantiated", url);
2110 gROOT->GetListOfBrowsables()->RecursiveRemove(app);
2114 b->RecursiveRemove(app);
2115 gROOT->RefreshBrowsers();
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
bool Bool_t
Boolean (0=false, 1=true) (bool)
int Int_t
Signed integer 4 bytes (int)
long Longptr_t
Integer large enough to hold a pointer (platform-dependent)
int Ssiz_t
String size (currently int)
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
long long Long64_t
Portable signed long integer 8 bytes.
const char Option_t
Option string (const char)
static void CallEndOfProcessCleanups()
TApplication * gApplication
R__EXTERN TApplication * gApplication
R__EXTERN TClassTable * gClassTable
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
R__EXTERN ExceptionContext_t * gException
R__EXTERN void Throw(int code)
If an exception context has been set (using the TRY and RETRY macros) jump back to where it was set.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void w
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char text
R__EXTERN TGuiFactory * gBatchGuiFactory
R__EXTERN TGuiFactory * gGuiFactory
R__EXTERN TVirtualMutex * gInterpreterMutex
externTVirtualMutex * gROOTMutex
char * Compress(const char *str)
Remove all blanks from the string str.
char * Strip(const char *str, char c=' ')
Strip leading and trailing c (blanks by default) from a string.
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
char * StrDup(const char *str)
Duplicate the string str.
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
#define R__LOCKGUARD(mutex)
R__EXTERN TVirtualX * gGXBatch
This class creates the ROOT Application Environment that interfaces to the windowing system eventloop...
EExitOnException ExitOnException(EExitOnException opt=kExit)
Set the exit on exception option.
virtual void KeyPressed(Int_t key)
Emit signal when console keyboard key was pressed.
virtual Longptr_t ProcessLine(const char *line, Bool_t sync=kFALSE, Int_t *error=nullptr)
Process a single command line, either a C++ statement or an interpreter command starting with a "....
static TList * fgApplications
static void Close(TApplication *app)
Static function used to close a remote application.
virtual void SetEchoMode(Bool_t mode)
Set console echo mode:
virtual void Help(const char *line)
The function lists useful commands (".help") or opens the online reference guide, generated with Doxy...
virtual void LineProcessed(const char *line)
Emit signal when a line has been processed.
void ClearInputFiles()
Clear list containing macro files passed as program arguments.
TApplicationImp * fAppImp
!Window system specific application implementation
TApplication(const TApplication &)=delete
static Longptr_t ExecuteFile(const char *file, Int_t *error=nullptr, Bool_t keep=kFALSE)
Execute a file containing a C++ macro (static method).
void InitializeGraphics(Bool_t only_web=kFALSE)
Initialize the graphics environment.
virtual void LoadGraphicsLibs()
Load shared libs necessary for graphics.
virtual void StopIdleing()
Called when system stops idleing.
virtual void StartIdleing()
Called when system starts idleing.
virtual void Run(Bool_t retrn=kFALSE)
Main application eventloop. Calls system dependent eventloop via gSystem.
virtual ~TApplication()
TApplication dtor.
void OpenReferenceGuideFor(const TString &strippedClass)
It opens the online reference guide, generated with Doxygen, for the chosen scope (class/namespace/st...
virtual void HandleException(Int_t sig)
Handle exceptions (kSigBus, kSigSegmentationViolation, kSigIllegalInstruction and kSigFloatingExcepti...
virtual void MakeBatch()
Switch to batch mode.
void OpenGitHubIssue(const TString &type)
It opens a GitHub issue in a web browser with prefilled ROOT version.
static Bool_t fgGraphNeeded
virtual void Terminate(Int_t status=0)
Terminate the application by call TSystem::Exit() unless application has been told to return from Run...
void OpenInBrowser(const TString &url)
The function generates and executes a command that loads the Doxygen URL in a browser.
virtual const char * ApplicationName() const
virtual void Forum(const char *line)
The function (".forum <type>") submits a new post on the ROOT forum via web browser.
void SetReturnFromRun(Bool_t ret)
virtual Int_t TabCompletionHook(char *buf, int *pLoc, std::ostream &out)
What to do when tab is pressed.
EExitOnException fExitOnException
const char * GetIdleCommand() const
TApplication()
Default ctor. Can be used by classes deriving from TApplication.
virtual Longptr_t ProcessFile(const char *file, Int_t *error=nullptr, Bool_t keep=kFALSE)
Process a file containing a C++ macro.
void OpenForumTopic(const TString &type)
It opens a Forum topic in a web browser with prefilled ROOT version.
virtual void ReturnPressed(char *text)
Emit signal when return key was pressed.
static Bool_t fgGraphInit
virtual void RemoveIdleTimer()
Remove idle timer. Normally called via TROOT::Idle(0).
virtual void SetIdleTimer(UInt_t idleTimeInSec, const char *command)
Set the command to be executed after the system has been idle for idleTimeInSec seconds.
virtual void GitHub(const char *line)
The function (".gh <type>") submits a new issue on GitHub via web browser.
static void CreateApplication()
Static function used to create a default application environment.
virtual void GetOptions(Int_t *argc, char **argv)
Get and handle command line options.
static TList * GetApplications()
Static method returning the list of available applications.
std::atomic< bool > fIsRunning
static void NeedGraphicsLibs()
Static method.
static Int_t ParseRemoteLine(const char *ln, TString &hostdir, TString &user, Int_t &dbg, TString &script)
Parse the content of a line starting with ".R" (already stripped-off) The format is.
void ls(Option_t *option="") const override
Show available sessions.
TString GetSetup()
It gets the ROOT installation setup as TString.
virtual void HandleIdleTimer()
Handle idle timeout.
TSignalHandler * fSigHandler
virtual Longptr_t ProcessRemote(const char *line, Int_t *error=nullptr)
Process the content of a line starting with ".R" (already stripped-off) The format is.
TApplication * fAppRemote
Using a TBrowser one can browse all ROOT objects.
TList * GetListOfAllPublicDataMembers(Bool_t load=kTRUE)
Returns a list of all public data members of this class and its base classes.
TList * GetListOfEnums(Bool_t load=kTRUE)
Return a list containing the TEnums of a class.
Long_t Property() const override
Returns the properties of the TClass as a bit field stored as a Long_t value.
TMethod * GetMethodAllAny(const char *method)
Return pointer to method without looking at parameters.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
static void InitializeColors()
Initialize colors used by the TCanvas based graphics (via TColor objects).
All ROOT classes may have RTTI (run time type identification) support added.
const char * GetTrueTypeName() const
Get the desugared type name of this data member, including const and volatile qualifiers.
Bool_t IsEnum() const
Return true if data member is an enum.
const char * GetFullTypeName() const
Get the concrete type name of this data member, including const and volatile qualifiers.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Global functions class (global functions are obtained from CINT).
Long_t Property() const override
Get property description word. For meaning of bits see EProperty.
const char * GetSignature()
Return signature of function.
Long_t ExtraProperty() const
Get property description word. For meaning of bits see EProperty.
const char * GetReturnTypeName() const
Get full type description of function return type, e,g.: "class TDirectory*".
Bool_t Notify() override
Notify handler.
void ls(Option_t *option="") const override
List this line with its attributes.
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
Collectable string class.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual void Print(Option_t *option="") const
This method must be overridden when a class wants to print itself.
@ kInvalidObject
if object ctor succeeded but object should not be used
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
void Emit(const char *signal, const T &arg)
Activate signal with single parameter.
static const char * GetMacroPath()
Get macro search path. Static utility function.
static Bool_t Initialized()
Return kTRUE if the TROOT object has been initialized.
static const TString & GetTutorialDir()
Get the tutorials directory in the installation. Static utility function.
static const TString & GetDocDir()
Get the documentation directory in the installation. Static utility function.
void ToLower()
Change string to lower-case.
TString & Insert(Ssiz_t pos, const char *s)
Int_t Atoi() const
Return integer value of string.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
TString MD5() const
Return the MD5 digest for this string, in a string representation.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Prepend(const char *cs)
std::istream & ReadFile(std::istream &str)
Replace string with the contents of strm, stopping at an EOF.
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form:
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual void Exit(int code, Bool_t mode=kTRUE)
Exit the application.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual void Abort(int code=0)
Abort the application.
virtual TTimer * RemoveTimer(TTimer *t)
Remove timer from list of system timers.
void Reset()
Reset the timer.
TTimer(const TTimer &)=delete
This class represents a WWW compatible URL.
const char * GetUrl(Bool_t withDeflt=kFALSE) const
Return full URL.
const char * GetFileAndOptions() const
Return the file and its options (the string specified behind the ?).
const char * GetFile() const
const char * GetProtocol() const
static constexpr const char kCommandLineOptionsHelp[]
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT's implicit multi-threading for all objects and methods that provide an internal paralleli...
void EnableThreadSafety()
Enable support for multi-threading within the ROOT code in particular, enables the global mutex to ma...
const char * GetUnqualifiedName(const char *name)
Return the start of the unqualified name include in 'original'.