Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4UIExecutive.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25// $Id: G4UIExecutive.icc,v 1.7 2010-05-28 08:12:27 kmura Exp $
26// GEANT4 tag $Name: geant4-09-04-patch-02 $
27
28#include "G4UIExecutive.hh"
29#include "G4UIsession.hh"
30#include "G4UImanager.hh"
31
32#if defined(G4UI_BUILD_QT_SESSION)
33#include "G4UIQt.hh"
34#include "G4Qt.hh"
35#endif
36
37#if defined(G4UI_BUILD_XM_SESSION)
38#include "G4UIXm.hh"
39#endif
40
41#if defined(G4UI_BUILD_WIN32_SESSION)
42#include "G4UIWin32.hh"
43#endif
44
45#if defined(G4UI_BUILD_WT_SESSION)
46//#include "G4UIWt.hh"
47#endif
48
49#include "G4UIGAG.hh"
50#include "G4UIterminal.hh"
51#include "G4UItcsh.hh"
52#include "G4UIcsh.hh"
53
54// --------------------------------------------------------------------------
55// build flags as variables
56
57#if defined(G4UI_BUILD_QT_SESSION)
58static const G4bool qt_build = true;
59#else
60static const G4bool qt_build = false;
61#endif
62
63#if defined(G4UI_BUILD_XM_SESSION)
64static const G4bool xm_build = true;
65#else
66static const G4bool xm_build = false;
67#endif
68
69#if defined(G4UI_BUILD_WIN32_SESSION)
70static const G4bool win32_build = true;
71#else
72static const G4bool win32_build = false;
73#endif
74
75#if defined(G4UI_BUILD_WT_SESSION)
76static const G4bool wt_build = true;
77#else
78static const G4bool wt_build = false;
79#endif
80
81#ifndef WIN32
82static const G4bool tcsh_build = true;
83#else
84static const G4bool tcsh_build = false;
85#endif
86
87#define DISCARD_PARAMETER(p) (void)p
88
89// --------------------------------------------------------------------------
90G4UIExecutive::G4UIExecutive(G4int argc, char** argv, const G4String& type)
91 : selected(kNone), session(NULL), shell(NULL), isGUI(false)
92{
93 G4cout << "Available UI session types: [ ";
94 if ( qt_build ) G4cout << "Qt, ";
95 if ( xm_build ) G4cout << "Xm, ";
96 if ( win32_build) G4cout << "Win32, ";
97 if ( wt_build ) G4cout << "Wt, ";
98 G4cout << "GAG, ";
99 if (tcsh_build ) G4cout << "tcsh, ";
100 G4cout << "csh ]" << G4endl;
101
102 // selecting session type...
103 // 1st priority : in case argumant specified
104 G4String stype = type;
105 stype.toLower(); // session type is case-insensitive.
106 if (type != "") SelectSessionByArg(stype);
107
108 // 2nd priority : refer environment variables (as backword compatibility)
109 if ( selected == kNone ) SelectSessionByEnv();
110
111 // 3rd priority : refer $HOME/.g4session
112 if ( selected == kNone ) {
113 G4String appinput = argv[0];
114 G4String appname = "";
115 size_t islash = appinput.find_last_of("/\\");
116 if (islash == G4String::npos)
117 appname = appinput;
118 else
119 appname = appinput(islash+1, appinput.size()-islash-1);
120
121 SelectSessionByFile(appname);
122 }
123
124 // 4th, best guess of session type
125 if ( selected == kNone) SelectSessionByBestGuess();
126
127 // instantiate a session...
128 switch ( selected ) {
129 case kQt:
130#if defined(G4UI_BUILD_QT_SESSION)
131 session = new G4UIQt(argc, argv);
132 isGUI = true;
133#endif
134 break;
135 case kXm:
136#if defined(G4UI_BUILD_XM_SESSION)
137 session = new G4UIXm(argc, argv);
138 isGUI = true;
139#endif
140 break;
141 case kWin32:
142#if defined(G4UI_BUILD_WIN32_SESSION)
143 DISCARD_PARAMETER(argc);
144 DISCARD_PARAMETER(argv);
145 session = new G4UIWin32();
146#endif
147 break;
148 case kWt:
149#if defined(G4UI_BUILD_WT_SESSION)
150 //session = new G4UIWt(argc, argv);
151 //isGUI = true;
152#endif
153 break;
154 case kGag:
155 DISCARD_PARAMETER(argc);
156 DISCARD_PARAMETER(argv);
157 session = new G4UIGAG();
158 isGUI = true;
159 break;
160 case kTcsh:
161#ifndef WIN32
162 DISCARD_PARAMETER(argc);
163 DISCARD_PARAMETER(argv);
164 shell = new G4UItcsh;
165 session = new G4UIterminal(shell);
166#endif
167 break;
168 case kCsh:
169 DISCARD_PARAMETER(argc);
170 DISCARD_PARAMETER(argv);
171 shell = new G4UIcsh;
172 session = new G4UIterminal(shell);
173 default:
174 break;
175 }
176
177 // fallback (csh)
178 if ( session == NULL ) {
179 G4Exception("G4UIExecutive::G4UIExecutive()",
180 "UI0002",
182 "Specified session type is not build in your system,\n"
183 "or no session type is specified.\n"
184 "A fallback session type is used.");
185
186 selected = kCsh;
187 DISCARD_PARAMETER(argc);
188 DISCARD_PARAMETER(argv);
189 shell = new G4UIcsh;
190 session = new G4UIterminal(shell);
191 }
192}
193
194// --------------------------------------------------------------------------
196{
197 if ( selected != kWt ) delete session;
198}
199
200// --------------------------------------------------------------------------
201void G4UIExecutive::SelectSessionByArg(const G4String& stype)
202{
203 if ( qt_build && stype == "qt" ) selected = kQt;
204 else if ( xm_build && stype == "xm" ) selected = kXm;
205 else if ( win32_build && stype == "win32" ) selected = kWin32;
206 //else if ( wt_build && stype == "wt" ) selected = kWt;
207 else if ( stype == "gag" ) selected = kGag;
208 else if ( tcsh_build && stype == "tcsh" ) selected = kTcsh;
209 else if ( stype == "csh" ) selected = kCsh;
210}
211
212// --------------------------------------------------------------------------
213void G4UIExecutive::SelectSessionByEnv()
214{
215 if ( qt_build && getenv("G4UI_USE_QT") ) selected = kQt;
216 else if ( xm_build && getenv("G4UI_USE_XM") ) selected = kXm;
217 else if ( win32_build && getenv("G4UI_USE_WIN32") ) selected = kWin32;
218 //else if ( wt_build && getenv("G4UI_USE_WT") ) selected = kWt;
219 else if ( getenv("G4UI_USE_GAG") ) selected = kGag;
220 else if ( tcsh_build && getenv("G4UI_USE_TCSH") ) selected = kTcsh;
221}
222
223// --------------------------------------------------------------------------
224void G4UIExecutive::SelectSessionByFile(const G4String& appname)
225{
226 const char* path = getenv("HOME");
227 if( path == NULL ) return;
228 G4String homedir = path;
229
230#ifndef WIN32
231 G4String fname= homedir + "/.g4session";
232#else
233 G4String fname= homedir + "\\.g4session";
234#endif
235
236 std::ifstream fsession;
237 enum { BUFSIZE= 1024 }; char linebuf[BUFSIZE];
238
239 fsession.open(fname, std::ios::in);
240
241 G4String default_session = "";
242 G4int iline = 1;
243 sessionMap.clear();
244 while( fsession.good() ) {
245 if( fsession.eof()) break;
246 fsession.getline(linebuf, BUFSIZE);
247 G4String aline = linebuf;
248 aline.strip(G4String::both);
249 if ( aline(0) == '#' ) continue;
250 if ( iline == 1 )
251 default_session = aline;
252 else {
253 size_t idx = aline.find_first_of(" ");
254 if ( idx == G4String::npos ) break;
255 G4String aname = aline.substr(0, idx);
256 idx = aline.find_first_not_of(" ", idx);
257 if (idx == G4String::npos ) break;
258 G4String sname = aline.substr(idx, aline.size()-idx);
259 sessionMap[aname] = sname;
260 }
261 iline++;
262 }
263 fsession.close();
264
265 G4String stype = "";
266 std::map<G4String, G4String>::iterator it = sessionMap.find(appname);
267 if ( it != sessionMap.end() ) stype = sessionMap[appname];
268 else stype = default_session;
269 stype.toLower();
270
271 // select session...
272 if ( qt_build && stype == "qt" ) selected = kQt;
273 else if ( xm_build && stype == "xm" ) selected = kXm;
274 else if ( win32_build && stype == "win32" ) selected = kWin32;
275 //else if ( wt_build && stype == "wt" ) selected = kWt;
276 else if ( stype == "gag" ) selected = kGag;
277 else if ( tcsh_build && stype == "tcsh" ) selected = kTcsh;
278 else if ( stype == "csh" ) selected = kCsh;
279}
280
281// --------------------------------------------------------------------------
282void G4UIExecutive::SelectSessionByBestGuess()
283{
284 if ( qt_build ) selected = kQt;
285 else if ( tcsh_build ) selected = kTcsh;
286 else if ( xm_build ) selected = kXm;
287}
288
289// --------------------------------------------------------------------------
291{
292 if(shell) shell-> SetPrompt(prompt);
293}
294
295// --------------------------------------------------------------------------
297 TermColorIndex cmdColor)
298{
299 if(shell) shell-> SetLsColor(dirColor, cmdColor);
300}
301
302// --------------------------------------------------------------------------
304{
305 session-> SessionStart();
306}
@ JustWarning
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define DISCARD_PARAMETER(p)
TermColorIndex
Definition: G4VUIshell.hh:54
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4String strip(G4int strip_Type=trailing, char c=' ')
void toLower()
void SetPrompt(const G4String &prompt)
G4UIExecutive(G4int argc, char **argv, const G4String &type="")
void SetLsColor(TermColorIndex dirColor, TermColorIndex cmdColor)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41