Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenGL/src/G4OpenGLXmViewer.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/OpenGL/src/G4OpenGLXmViewer.cc (Version 11.3.0) and /visualization/OpenGL/src/G4OpenGLXmViewer.cc (Version 11.1.2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
 27 //                                                 27 //
 28 //                                                 28 // 
 29 // Andrew Walkden  10th February 1997              29 // Andrew Walkden  10th February 1997
 30 // G4OpenGLXmViewer : Class derived from G4Ope     30 // G4OpenGLXmViewer : Class derived from G4OpenGLXViewer, to provide
 31 //                  (Motif) widget OpenGL func     31 //                  (Motif) widget OpenGL functionality for GEANT4.
 32                                                    32 
 33 #include "globals.hh"                              33 #include "globals.hh"
 34                                                    34 
 35 #include "G4OpenGLXmViewer.hh"                     35 #include "G4OpenGLXmViewer.hh"
 36 #include "G4OpenGLSceneHandler.hh"                 36 #include "G4OpenGLSceneHandler.hh"
 37                                                    37 
 38 #include "G4VisExtent.hh"                          38 #include "G4VisExtent.hh"
 39 #include "G4LogicalVolume.hh"                      39 #include "G4LogicalVolume.hh"
 40 #include "G4VSolid.hh"                             40 #include "G4VSolid.hh"
 41 #include "G4Point3D.hh"                            41 #include "G4Point3D.hh"
 42 #include "G4Normal3D.hh"                           42 #include "G4Normal3D.hh"
 43                                                    43 
 44 #include "G4Scene.hh"                              44 #include "G4Scene.hh"
 45                                                    45 
 46 #include "G4OpenGLXmSliderBar.hh"                  46 #include "G4OpenGLXmSliderBar.hh"
 47 #include "G4OpenGLXmTextField.hh"                  47 #include "G4OpenGLXmTextField.hh"
 48                                                    48 
 49 #include "G4Xt.hh"                                 49 #include "G4Xt.hh"
 50 #include <X11/Shell.h>                             50 #include <X11/Shell.h>
 51 #include <Xm/MainW.h>                              51 #include <Xm/MainW.h>
 52 #include <Xm/Frame.h>                              52 #include <Xm/Frame.h>
 53 #include <Xm/DrawingA.h>                           53 #include <Xm/DrawingA.h>
 54                                                    54 
 55 #include <sstream>                                 55 #include <sstream>
 56                                                    56 
 57 void G4OpenGLXmViewer::ShowView () {               57 void G4OpenGLXmViewer::ShowView () {
 58                                                    58 
 59 //  glXWaitGL (); //Wait for effects of all pr     59 //  glXWaitGL (); //Wait for effects of all previous OpenGL commands to
 60                 //be propagated before progres     60                 //be propagated before progressing.
 61 // JA: Commented out July 2021 - slows renderi     61 // JA: Commented out July 2021 - slows rendering down in some cases and I
 62 // don't see any adverse effects.                  62 // don't see any adverse effects.
 63                                                    63 
 64   glFlush ();                                      64   glFlush ();
 65                                                    65 
 66   G4Xt::getInstance () -> SecondaryLoop ();        66   G4Xt::getInstance () -> SecondaryLoop ();
 67                                                    67 
 68 }                                                  68 }
 69                                                    69 
 70 void G4OpenGLXmViewer::ResetView () {              70 void G4OpenGLXmViewer::ResetView () {
 71   // reset global parameters                       71   // reset global parameters
 72   G4OpenGLViewer::ResetView();                     72   G4OpenGLViewer::ResetView();
 73                                                    73 
 74   //reset Xm parameteres                           74   //reset Xm parameteres
 75   zoom_high  = fVP.GetZoomFactor() * 10.0;         75   zoom_high  = fVP.GetZoomFactor() * 10.0;
 76   zoom_low = fVP.GetZoomFactor() / 10.0;           76   zoom_low = fVP.GetZoomFactor() / 10.0;
 77   rot_sens_limit = 90.;                            77   rot_sens_limit = 90.;
 78   wob_low = 0.;                                    78   wob_low = 0.;
 79   wob_high = 50.;                                  79   wob_high = 50.;
 80   wob_sens = 20.;                                  80   wob_sens = 20.;
 81                                                    81   
 82   bool firstInit = true;                           82   bool firstInit = true;
 83   if (GetSceneHandler() != NULL) {                 83   if (GetSceneHandler() != NULL) {
 84     if (GetSceneHandler()->GetScene() != NULL)     84     if (GetSceneHandler()->GetScene() != NULL) {
 85       firstInit = false;                           85       firstInit = false;
 86     }                                              86     }
 87   }                                                87   }
 88   if (firstInit) {                                 88   if (firstInit) {
 89     pan_sens_limit = 100.;                         89     pan_sens_limit = 100.;
 90     fPan_sens = pan_sens_limit / 10.0;             90     fPan_sens = pan_sens_limit / 10.0;
 91     dolly_low  = fVP.GetDolly() - 1000.0;          91     dolly_low  = fVP.GetDolly() - 1000.0;
 92     dolly_high = fVP.GetDolly() + 1000.0;          92     dolly_high = fVP.GetDolly() + 1000.0;
 93   } else {                                         93   } else {
 94     fPan_sens = GetSceneHandler()->GetScene()-     94     fPan_sens = GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius() / 10.0;
 95     pan_sens_limit = GetSceneHandler()->GetSce     95     pan_sens_limit = GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius();
 96                                                    96     
 97     dolly_high = GetSceneHandler()->GetScene()     97     dolly_high = GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius();
 98     dolly_low = -(GetSceneHandler()->GetScene(     98     dolly_low = -(GetSceneHandler()->GetScene()->GetExtent().GetExtentRadius());
 99   }                                                99   }
100                                                   100 
101   UpdateControlPanel ();                          101   UpdateControlPanel ();
102                                                   102 
103                                                   103 
104   // FIXME : L.Garnier 12 Oct 2011                104   // FIXME : L.Garnier 12 Oct 2011
105   // Has also to change the Camera/Object, but    105   // Has also to change the Camera/Object, but tricky to do...  
106                                                   106 
107 }                                                 107 }
108                                                   108 
109                                                   109 
110 void G4OpenGLXmViewer::GetXmConnection () {       110 void G4OpenGLXmViewer::GetXmConnection () {
111                                                   111   
112   G4Xt* interactorManager = G4Xt::getInstance     112   G4Xt* interactorManager = G4Xt::getInstance ();
113   toplevel = (Widget)interactorManager->GetMai    113   toplevel = (Widget)interactorManager->GetMainInteractor();
114   app      = XtWidgetToApplicationContext(topl    114   app      = XtWidgetToApplicationContext(toplevel);
115                                                   115 
116   if (!toplevel) {                                116   if (!toplevel) {
117     fViewId = -1;  // This flags an error.        117     fViewId = -1;  // This flags an error.
118     G4cerr << "G4OpenGLXmViewer::GetXmConnecti    118     G4cerr << "G4OpenGLXmViewer::GetXmConnection unable to Initialize"
119       " application context." << G4endl;          119       " application context." << G4endl;
120     return;                                       120     return;
121   }                                               121   }
122                                                   122 
123   // Better to put this in an X11 resource fil    123   // Better to put this in an X11 resource file !!!
124   std::ostringstream oss;                         124   std::ostringstream oss;
125   oss <<                                          125   oss <<
126     "*glxarea*width: " << fVP.GetWindowSizeHin    126     "*glxarea*width: " << fVP.GetWindowSizeHintX() << "\n"
127     "*glxarea*height: " << fVP.GetWindowSizeHi    127     "*glxarea*height: " << fVP.GetWindowSizeHintY() << "\n"
128     /*                                            128     /*
129     // Tried this as a replacement for the abo    129     // Tried this as a replacement for the above two lines, but
130     // sub-windows (rotation, etc.) came same     130     // sub-windows (rotation, etc.) came same size!!
131     "*geometry: " << fVP.GetXGeometryString()     131     "*geometry: " << fVP.GetXGeometryString() << "\n"
132     */                                            132     */
133     "*frame*x: 10\n"                              133     "*frame*x: 10\n"
134     "*frame*y: 10\n"                              134     "*frame*y: 10\n"
135     "*frame*topOffset: 10\n"                      135     "*frame*topOffset: 10\n"
136     "*frame*bottomOffset: 10\n"                   136     "*frame*bottomOffset: 10\n"
137     "*frame*rightOffset: 10\n"                    137     "*frame*rightOffset: 10\n"
138     "*frame*leftOffset: 10\n"                     138     "*frame*leftOffset: 10\n"
139     "*frame*shadowType: SHADOW_IN\n"              139     "*frame*shadowType: SHADOW_IN\n"
140     "*frame*useColorObj: False\n"                 140     "*frame*useColorObj: False\n"
141     "*frame*primaryColorSetId: 3\n"               141     "*frame*primaryColorSetId: 3\n"
142     "*frame*secondaryColorSetId: 3\n"             142     "*frame*secondaryColorSetId: 3\n"
143     "*menubar*useColorObj: False\n"               143     "*menubar*useColorObj: False\n"
144     "*menubar*primaryColorSetId: 3\n"             144     "*menubar*primaryColorSetId: 3\n"
145     "*menubar*secondaryColorSetId: 3\n"           145     "*menubar*secondaryColorSetId: 3\n"
146     "*toplevel*useColorObj: False\n"              146     "*toplevel*useColorObj: False\n"
147     "*toplevel*primaryColorSetId: 3\n"            147     "*toplevel*primaryColorSetId: 3\n"
148     "*toplevel*secondaryColorSetId: 3\n";         148     "*toplevel*secondaryColorSetId: 3\n";
149   interactorManager->PutStringInResourceDataba    149   interactorManager->PutStringInResourceDatabase ((char*)oss.str().c_str());
150                                                   150 
151   //  interactorManager->AddSecondaryLoopPostA    151   //  interactorManager->AddSecondaryLoopPostAction ((G4SecondaryLoopAction)G4OpenGLXmViewerSecondaryLoopPostAction);
152                                                   152   
153   shell = XtAppCreateShell ((String)fName.data    153   shell = XtAppCreateShell ((String)fName.data(),(String)fName.data(),topLevelShellWidgetClass,XtDisplay(toplevel),NULL,0); 
154   interactorManager->AddShell (shell);            154   interactorManager->AddShell (shell);
155                                                   155 
156   dpy = XtDisplay (shell);                        156   dpy = XtDisplay (shell);
157                                                   157 
158   if (!dpy) {                                     158   if (!dpy) {
159     fViewId = -1;  // This flags an error.        159     fViewId = -1;  // This flags an error.
160     G4cerr << "G4OpenGLXmViewer::GetXmConnecti    160     G4cerr << "G4OpenGLXmViewer::GetXmConnection unable to connect to display."
161    << G4endl;                                     161    << G4endl;
162     return;                                       162     return;
163   }                                               163   }
164                                                   164 
165   if (!glXQueryExtension (dpy, &errorBase, &ev    165   if (!glXQueryExtension (dpy, &errorBase, &eventBase)) {
166     fViewId = -1;  // This flags an error.        166     fViewId = -1;  // This flags an error.
167     G4cerr << "G4OpenGLXmViewer::GetXmConnecti    167     G4cerr << "G4OpenGLXmViewer::GetXmConnection. X Server has no GLX extension."
168    << G4endl;;                                    168    << G4endl;;
169     return;                                       169     return;
170   }                                               170   }
171 }                                                 171 }
172                                                   172 
173 void G4OpenGLXmViewer::CreateMainWindow () {      173 void G4OpenGLXmViewer::CreateMainWindow () {
174                                                   174 
175   bgnd = XWhitePixelOfScreen (XtScreen(shell))    175   bgnd = XWhitePixelOfScreen (XtScreen(shell));
176   borcol = XBlackPixelOfScreen (XtScreen(shell    176   borcol = XBlackPixelOfScreen (XtScreen(shell));
177                                                   177   
178   ResizeWindow(fVP.GetWindowSizeHintX(),fVP.Ge    178   ResizeWindow(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
179                                                   179 
180   G4int x_origin = fVP.GetWindowAbsoluteLocati    180   G4int x_origin = fVP.GetWindowAbsoluteLocationHintX(DisplayWidth(dpy, vi -> screen));
181                                                   181 
182   // FIXME,  screen size != window size on MAC    182   // FIXME,  screen size != window size on MAC, but I don't know have to get the menuBar
183   // size on MAC. L.Garnier 01/2009               183   // size on MAC. L.Garnier 01/2009
184   G4int y_origin = fVP.GetWindowAbsoluteLocati    184   G4int y_origin = fVP.GetWindowAbsoluteLocationHintY(DisplayHeight(dpy, vi -> screen));
185                                                   185 
186   if (fVP.IsWindowSizeHintX () && fVP.IsWindow    186   if (fVP.IsWindowSizeHintX () && fVP.IsWindowLocationHintX () && fVP.IsWindowLocationHintY ()) {
187     XtVaSetValues (shell,                         187     XtVaSetValues (shell, 
188                    XtNvisual, vi -> visual,       188                    XtNvisual, vi -> visual, 
189                    XtNdepth, vi -> depth,         189                    XtNdepth, vi -> depth,
190                    XtNcolormap, cmap,             190                    XtNcolormap, cmap, 
191                    XtNwidth, getWinWidth(),       191                    XtNwidth, getWinWidth(),
192                    XtNheight, getWinHeight(),     192                    XtNheight, getWinHeight(),
193                    XtNx, x_origin,                193                    XtNx, x_origin,
194                    XtNy, y_origin,                194                    XtNy, y_origin,
195                    XtNborderColor, &borcol,       195                    XtNborderColor, &borcol,
196                    XtNbackground, &bgnd,          196                    XtNbackground, &bgnd,
197                    XmNtitle, fName.data(),        197                    XmNtitle, fName.data(),
198                    NULL);                         198                    NULL);
199   } else if (fVP.IsWindowSizeHintX () && !(fVP    199   } else if (fVP.IsWindowSizeHintX () && !(fVP.IsWindowLocationHintX () || fVP.IsWindowLocationHintY ())) {
200     XtVaSetValues (shell,                         200     XtVaSetValues (shell, 
201                    XtNvisual, vi -> visual,       201                    XtNvisual, vi -> visual, 
202                    XtNdepth, vi -> depth,         202                    XtNdepth, vi -> depth,
203                    XtNcolormap, cmap,             203                    XtNcolormap, cmap, 
204                    XtNwidth, getWinWidth(),       204                    XtNwidth, getWinWidth(),
205                    XtNheight, getWinHeight(),     205                    XtNheight, getWinHeight(),
206                    XtNborderColor, &borcol,       206                    XtNborderColor, &borcol,
207                    XtNbackground, &bgnd,          207                    XtNbackground, &bgnd,
208                    XmNtitle, fName.data(),        208                    XmNtitle, fName.data(),
209                    NULL);                         209                    NULL);
210   } else if ((!fVP.IsWindowSizeHintX ()) && fV    210   } else if ((!fVP.IsWindowSizeHintX ()) && fVP.IsWindowLocationHintX () && fVP.IsWindowLocationHintY ()) {
211     XtVaSetValues (shell,                         211     XtVaSetValues (shell, 
212                    XtNvisual, vi -> visual,       212                    XtNvisual, vi -> visual, 
213                    XtNdepth, vi -> depth,         213                    XtNdepth, vi -> depth,
214                    XtNcolormap, cmap,             214                    XtNcolormap, cmap, 
215                    XtNx, x_origin,                215                    XtNx, x_origin,
216                    XtNy, y_origin,                216                    XtNy, y_origin,
217                    XtNborderColor, &borcol,       217                    XtNborderColor, &borcol,
218                    XtNbackground, &bgnd,          218                    XtNbackground, &bgnd,
219                    XmNtitle, fName.data(),        219                    XmNtitle, fName.data(),
220                    NULL);                         220                    NULL);
221   } else {                                        221   } else {
222     XtVaSetValues (shell,                         222     XtVaSetValues (shell, 
223                    XtNvisual, vi -> visual,       223                    XtNvisual, vi -> visual, 
224                    XtNdepth, vi -> depth,         224                    XtNdepth, vi -> depth,
225                    XtNcolormap, cmap,             225                    XtNcolormap, cmap, 
226                    XtNborderColor, &borcol,       226                    XtNborderColor, &borcol,
227                    XtNbackground, &bgnd,          227                    XtNbackground, &bgnd,
228                    XmNtitle, fName.data(),        228                    XmNtitle, fName.data(),
229                    NULL);                         229                    NULL);
230   }                                               230   }
231                                                   231 
232                                                   232 
233   main_win = XtVaCreateManagedWidget ("main_wi    233   main_win = XtVaCreateManagedWidget ("main_win", 
234               xmMainWindowWidgetClass,            234               xmMainWindowWidgetClass,
235               shell,                              235               shell,
236               XtNvisual, vi -> visual,            236               XtNvisual, vi -> visual, 
237               XtNdepth, vi -> depth,              237               XtNdepth, vi -> depth, 
238               XtNcolormap, cmap,                  238               XtNcolormap, cmap, 
239               XtNborderColor, borcol,             239               XtNborderColor, borcol,
240               XtNbackground, bgnd,                240               XtNbackground, bgnd,
241               NULL);                              241               NULL);
242                                                   242 
243   //*********Create a menu bar for the window*    243   //*********Create a menu bar for the window********
244   style_str = XmStringCreateLocalized ((char*)    244   style_str = XmStringCreateLocalized ((char*)menu_str[0].c_str());
245   actions_str = XmStringCreateLocalized ((char    245   actions_str = XmStringCreateLocalized ((char*)menu_str[2].c_str());
246   misc_str = XmStringCreateLocalized ((char*)m    246   misc_str = XmStringCreateLocalized ((char*)menu_str[4].c_str());
247   spec_str = XmStringCreateLocalized ((char*)m    247   spec_str = XmStringCreateLocalized ((char*)menu_str[6].c_str());
248                                                   248 
249   menubar = XmVaCreateSimpleMenuBar (main_win,    249   menubar = XmVaCreateSimpleMenuBar (main_win,
250              (char*)menu_str[8].c_str(),          250              (char*)menu_str[8].c_str(),
251              XmVaCASCADEBUTTON, style_str,   (    251              XmVaCASCADEBUTTON, style_str,   (KeySym)XK_S,  /*G.Barrand : cast to KeySym and use XK_*/
252              XmVaCASCADEBUTTON, actions_str, (    252              XmVaCASCADEBUTTON, actions_str, (KeySym)XK_A,
253              XmVaCASCADEBUTTON, misc_str,    (    253              XmVaCASCADEBUTTON, misc_str,    (KeySym)XK_M,
254              XmVaCASCADEBUTTON, spec_str,    (    254              XmVaCASCADEBUTTON, spec_str,    (KeySym)XK_p,
255              XtNvisual, vi -> visual,             255              XtNvisual, vi -> visual, 
256              XtNdepth, vi -> depth,               256              XtNdepth, vi -> depth, 
257              XtNcolormap, cmap,                   257              XtNcolormap, cmap, 
258              XtNborderColor, borcol,              258              XtNborderColor, borcol,
259              XtNbackground, bgnd,                 259              XtNbackground, bgnd,
260              NULL);                               260              NULL);
261                                                   261 
262   XmStringFree (style_str);                       262   XmStringFree (style_str);
263   XmStringFree (actions_str);                     263   XmStringFree (actions_str);
264   XmStringFree (misc_str);                        264   XmStringFree (misc_str);
265   XmStringFree (spec_str);                        265   XmStringFree (spec_str);
266                                                   266 
267   G4cout << "Created menubar" << G4endl;          267   G4cout << "Created menubar" << G4endl;
268                                                   268 
269                                                   269 
270   //*********Create style pulldown menu on men    270   //*********Create style pulldown menu on menubar*********
271   draw_str = XmStringCreateLocalized ((char*)m    271   draw_str = XmStringCreateLocalized ((char*)menu_str[9].c_str());
272   bgnd_str = XmStringCreateLocalized ((char*)m    272   bgnd_str = XmStringCreateLocalized ((char*)menu_str[10].c_str());
273                                                   273 
274   style_cascade = XmVaCreateSimplePulldownMenu    274   style_cascade = XmVaCreateSimplePulldownMenu
275     (menubar,                                     275     (menubar,
276      (char*)menu_str[1].c_str(),                  276      (char*)menu_str[1].c_str(),
277      0,                                           277      0,
278      NULL,                                        278      NULL,
279      XmVaCASCADEBUTTON, draw_str, (KeySym)XK_D    279      XmVaCASCADEBUTTON, draw_str, (KeySym)XK_D,
280      XmVaCASCADEBUTTON, bgnd_str, (KeySym)XK_B    280      XmVaCASCADEBUTTON, bgnd_str, (KeySym)XK_B,
281      XtNvisual, vi -> visual,                     281      XtNvisual, vi -> visual, 
282      XtNdepth, vi -> depth,                       282      XtNdepth, vi -> depth, 
283      XtNcolormap, cmap,                           283      XtNcolormap, cmap, 
284      XtNborderColor, borcol,                      284      XtNborderColor, borcol,
285      XtNbackground, bgnd,                         285      XtNbackground, bgnd,
286      NULL);                                       286      NULL);
287                                                   287   
288   XmStringFree (draw_str);                        288   XmStringFree (draw_str);
289   XmStringFree (bgnd_str);                        289   XmStringFree (bgnd_str);
290                                                   290 
291   //  G4cout << "Created Style pulldown menu"     291   //  G4cout << "Created Style pulldown menu" << G4endl;
292                                                   292 
293   //Add Drawing pullright menu to style cascad    293   //Add Drawing pullright menu to style cascade...
294   wireframe_str = XmStringCreateLocalized ((ch    294   wireframe_str = XmStringCreateLocalized ((char*)menu_str[11].c_str());
295   hlr_str = XmStringCreateLocalized ((char*)me    295   hlr_str = XmStringCreateLocalized ((char*)menu_str[12].c_str());
296   hsr_str = XmStringCreateLocalized ((char*)me    296   hsr_str = XmStringCreateLocalized ((char*)menu_str[13].c_str());
297   hlhsr_str = XmStringCreateLocalized ((char*)    297   hlhsr_str = XmStringCreateLocalized ((char*)menu_str[14].c_str());
298                                                   298 
299   drawing_style_pullright = XmVaCreateSimplePu    299   drawing_style_pullright = XmVaCreateSimplePulldownMenu 
300     (style_cascade,                               300     (style_cascade,
301      (char*)menu_str[15].c_str(),                 301      (char*)menu_str[15].c_str(),
302      1,                                           302      1,
303      drawing_style_callback,                      303      drawing_style_callback,
304      XmVaRADIOBUTTON, wireframe_str, (KeySym)X    304      XmVaRADIOBUTTON, wireframe_str, (KeySym)XK_W, NULL, NULL,
305      XmVaRADIOBUTTON, hlr_str,       (KeySym)X    305      XmVaRADIOBUTTON, hlr_str,       (KeySym)XK_L, NULL, NULL,
306      XmVaRADIOBUTTON, hsr_str,       (KeySym)X    306      XmVaRADIOBUTTON, hsr_str,       (KeySym)XK_S, NULL, NULL,
307      XmVaRADIOBUTTON, hlhsr_str,     (KeySym)X    307      XmVaRADIOBUTTON, hlhsr_str,     (KeySym)XK_H, NULL, NULL,
308      XmNradioBehavior, True,                      308      XmNradioBehavior, True, 
309      XmNradioAlwaysOne, True,                     309      XmNradioAlwaysOne, True, 
310      XmNuserData, this,                           310      XmNuserData, this,
311      XtNvisual, vi -> visual,                     311      XtNvisual, vi -> visual, 
312      XtNdepth, vi -> depth,                       312      XtNdepth, vi -> depth, 
313      XtNcolormap, cmap,                           313      XtNcolormap, cmap, 
314      XtNborderColor, borcol,                      314      XtNborderColor, borcol,
315      XtNbackground, bgnd,                         315      XtNbackground, bgnd,
316      NULL);                                       316      NULL);
317                                                   317   
318   Widget special_widget;                          318   Widget special_widget;
319                                                   319 
320   G4ViewParameters::DrawingStyle d_style;         320   G4ViewParameters::DrawingStyle d_style;
321   d_style = fVP.GetDrawingStyle();                321   d_style = fVP.GetDrawingStyle();
322                                                   322   
323   if (d_style == G4ViewParameters::wireframe)     323   if (d_style == G4ViewParameters::wireframe) {
324     special_widget = XtNameToWidget(drawing_st    324     special_widget = XtNameToWidget(drawing_style_pullright, "button_0");
325     if(special_widget) {                          325     if(special_widget) {
326       XtVaSetValues (special_widget, XmNset, T    326       XtVaSetValues (special_widget, XmNset, True, NULL);
327     }                                             327     }
328   } else if (d_style == G4ViewParameters::hlr)    328   } else if (d_style == G4ViewParameters::hlr) {
329     special_widget = XtNameToWidget(drawing_st    329     special_widget = XtNameToWidget(drawing_style_pullright, "button_1");
330     if(special_widget) {                          330     if(special_widget) {
331       XtVaSetValues (special_widget, XmNset, T    331       XtVaSetValues (special_widget, XmNset, True, NULL);
332     }                                             332     }
333   } else if (d_style == G4ViewParameters::hsr)    333   } else if (d_style == G4ViewParameters::hsr) {
334     special_widget = XtNameToWidget(drawing_st    334     special_widget = XtNameToWidget(drawing_style_pullright, "button_2");
335     if(special_widget) {                          335     if(special_widget) {
336       XtVaSetValues (special_widget, XmNset, T    336       XtVaSetValues (special_widget, XmNset, True, NULL);
337     }                                             337     }
338   } else if (d_style == G4ViewParameters::hlhs    338   } else if (d_style == G4ViewParameters::hlhsr) {
339     special_widget = XtNameToWidget(drawing_st    339     special_widget = XtNameToWidget(drawing_style_pullright, "button_3");
340     if(special_widget) {                          340     if(special_widget) {
341       XtVaSetValues (special_widget, XmNset, T    341       XtVaSetValues (special_widget, XmNset, True, NULL);
342     }                                             342     }
343   } else {                                        343   } else {
344     G4Exception                                   344     G4Exception
345       ("G4OpenGLXmViewer::CreateMainWindow",      345       ("G4OpenGLXmViewer::CreateMainWindow",
346        "opengl2015", FatalException,              346        "opengl2015", FatalException,
347        "Invalid Drawing style in G4OpenGLXmVie    347        "Invalid Drawing style in G4OpenGLXmViewer::CreateContext");
348   }                                               348   }
349                                                   349 
350   XmStringFree (wireframe_str);                   350   XmStringFree (wireframe_str);
351   XmStringFree (hlr_str);                         351   XmStringFree (hlr_str);
352   XmStringFree (hsr_str);                         352   XmStringFree (hsr_str);
353   XmStringFree (hlhsr_str);                       353   XmStringFree (hlhsr_str);
354                                                   354 
355   //  G4cout << "Created Drawing pullright men    355   //  G4cout << "Created Drawing pullright menu" << G4endl;
356                                                   356 
357   //Add Drawing pullright menu to style cascad    357   //Add Drawing pullright menu to style cascade...
358   white_str = XmStringCreateLocalized ((char*)    358   white_str = XmStringCreateLocalized ((char*)menu_str[16].c_str());
359   black_str = XmStringCreateLocalized ((char*)    359   black_str = XmStringCreateLocalized ((char*)menu_str[17].c_str());
360                                                   360 
361   background_color_pullright = XmVaCreateSimpl    361   background_color_pullright = XmVaCreateSimplePulldownMenu 
362     (style_cascade,                               362     (style_cascade,
363      (char*)menu_str[18].c_str(),                 363      (char*)menu_str[18].c_str(),
364      2,                                           364      2,
365      background_color_callback,                   365      background_color_callback,
366      XmVaRADIOBUTTON, white_str, (KeySym)XK_W,    366      XmVaRADIOBUTTON, white_str, (KeySym)XK_W, NULL, NULL,
367      XmVaRADIOBUTTON, black_str, (KeySym)XK_B,    367      XmVaRADIOBUTTON, black_str, (KeySym)XK_B, NULL, NULL,
368      XmNradioBehavior, True,                      368      XmNradioBehavior, True, 
369      XmNradioAlwaysOne, True,                     369      XmNradioAlwaysOne, True, 
370      XmNuserData, this,                           370      XmNuserData, this,
371      XtNvisual, vi -> visual,                     371      XtNvisual, vi -> visual, 
372      XtNdepth, vi -> depth,                       372      XtNdepth, vi -> depth, 
373      XtNcolormap, cmap,                           373      XtNcolormap, cmap, 
374      XtNborderColor, borcol,                      374      XtNborderColor, borcol,
375      XtNbackground, bgnd,                         375      XtNbackground, bgnd,
376      NULL);                                       376      NULL);
377                                                   377   
378   if (background.GetRed() == 1. &&                378   if (background.GetRed() == 1. &&
379       background.GetGreen() == 1. &&              379       background.GetGreen() == 1. &&
380       background.GetBlue() == 1.) {               380       background.GetBlue() == 1.) {
381     special_widget = XtNameToWidget(background    381     special_widget = XtNameToWidget(background_color_pullright, "button_0");
382     if(special_widget) {                          382     if(special_widget) {
383       XtVaSetValues (special_widget, XmNset, T    383       XtVaSetValues (special_widget, XmNset, True, NULL);
384     }                                             384     }
385   } else {                                        385   } else {
386     special_widget = XtNameToWidget(background    386     special_widget = XtNameToWidget(background_color_pullright, "button_1");
387     if(special_widget) {                          387     if(special_widget) {
388       XtVaSetValues (special_widget, XmNset, T    388       XtVaSetValues (special_widget, XmNset, True, NULL);
389     }                                             389     }
390   }                                               390   }
391                                                   391 
392   XmStringFree (white_str);                       392   XmStringFree (white_str);
393   XmStringFree (black_str);                       393   XmStringFree (black_str);
394                                                   394 
395   //  G4cout << "Created Background color pull    395   //  G4cout << "Created Background color pullright menu" << G4endl;
396                                                   396 
397   //*********Create actions pulldown menu on m    397   //*********Create actions pulldown menu on menubar*********
398   rot_str = XmStringCreateLocalized ((char*)me    398   rot_str = XmStringCreateLocalized ((char*)menu_str[19].c_str());
399   pan_str = XmStringCreateLocalized ((char*)me    399   pan_str = XmStringCreateLocalized ((char*)menu_str[20].c_str());
400   set_str = XmStringCreateLocalized ((char*)me    400   set_str = XmStringCreateLocalized ((char*)menu_str[21].c_str());
401                                                   401 
402   actions_cascade = XmVaCreateSimplePulldownMe    402   actions_cascade = XmVaCreateSimplePulldownMenu
403     (menubar,                                     403     (menubar,
404      (char*)menu_str[3].c_str(),                  404      (char*)menu_str[3].c_str(),
405      1,                                           405      1,
406      actions_callback,                            406      actions_callback,
407      XmVaPUSHBUTTON, rot_str, (KeySym)XK_R, NU    407      XmVaPUSHBUTTON, rot_str, (KeySym)XK_R, NULL, NULL,
408      XmVaPUSHBUTTON, pan_str, (KeySym)XK_P, NU    408      XmVaPUSHBUTTON, pan_str, (KeySym)XK_P, NULL, NULL,
409      XmVaPUSHBUTTON, set_str, (KeySym)XK_S, NU    409      XmVaPUSHBUTTON, set_str, (KeySym)XK_S, NULL, NULL,
410      XmNuserData, this,                           410      XmNuserData, this, 
411      XtNvisual, vi -> visual,                     411      XtNvisual, vi -> visual, 
412      XtNdepth, vi -> depth,                       412      XtNdepth, vi -> depth, 
413      XtNcolormap, cmap,                           413      XtNcolormap, cmap, 
414      XtNborderColor, borcol,                      414      XtNborderColor, borcol,
415      XtNbackground, bgnd,                         415      XtNbackground, bgnd,
416      NULL);                                       416      NULL);
417                                                   417   
418   XmStringFree (rot_str);                         418   XmStringFree (rot_str);
419   XmStringFree (pan_str);                         419   XmStringFree (pan_str);
420   XmStringFree (set_str);                         420   XmStringFree (set_str);
421   G4cout << "Created Actions pulldown menu" <<    421   G4cout << "Created Actions pulldown menu" << G4endl;
422                                                   422 
423   misc_str = XmStringCreateLocalized ((char*)m    423   misc_str = XmStringCreateLocalized ((char*)menu_str[22].c_str());
424   exit_str = XmStringCreateLocalized ((char*)m    424   exit_str = XmStringCreateLocalized ((char*)menu_str[23].c_str());
425   print_str = XmStringCreateLocalized ((char*)    425   print_str = XmStringCreateLocalized ((char*)menu_str[24].c_str());
426                                                   426 
427   //*********Create miscellany pulldown menu o    427   //*********Create miscellany pulldown menu on menubar*********
428   misc_cascade = XmVaCreateSimplePulldownMenu     428   misc_cascade = XmVaCreateSimplePulldownMenu
429     (menubar,                                     429     (menubar,
430      (char*)menu_str[5].c_str(),                  430      (char*)menu_str[5].c_str(),
431      2,                                           431      2,
432      misc_callback,                               432      misc_callback,
433      XmVaPUSHBUTTON, misc_str,  (KeySym)XK_M,     433      XmVaPUSHBUTTON, misc_str,  (KeySym)XK_M, NULL, NULL,
434      XmVaPUSHBUTTON, exit_str,  (KeySym)XK_E,     434      XmVaPUSHBUTTON, exit_str,  (KeySym)XK_E, NULL, NULL,
435      XmVaPUSHBUTTON, print_str, (KeySym)XK_P,     435      XmVaPUSHBUTTON, print_str, (KeySym)XK_P, NULL, NULL,
436      XmNuserData, this,                           436      XmNuserData, this,
437      XtNvisual, vi -> visual,                     437      XtNvisual, vi -> visual, 
438      XtNdepth, vi -> depth,                       438      XtNdepth, vi -> depth, 
439      XtNcolormap, cmap,                           439      XtNcolormap, cmap, 
440      XtNborderColor, borcol,                      440      XtNborderColor, borcol,
441      XtNbackground, bgnd,                         441      XtNbackground, bgnd,
442      NULL);                                       442      NULL);
443                                                   443   
444   XmStringFree (misc_str);                        444   XmStringFree (misc_str);
445   XmStringFree (exit_str);                        445   XmStringFree (exit_str);
446   XmStringFree (print_str);                       446   XmStringFree (print_str);
447   G4cout << "Created Miscellany pulldown menu"    447   G4cout << "Created Miscellany pulldown menu" << G4endl;
448                                                   448 
449   trans_str = XmStringCreateLocalized ((char*)    449   trans_str = XmStringCreateLocalized ((char*)menu_str[25].c_str());
450   anti_str = XmStringCreateLocalized ((char*)m    450   anti_str = XmStringCreateLocalized ((char*)menu_str[27].c_str());
451   halo_str = XmStringCreateLocalized ((char*)m    451   halo_str = XmStringCreateLocalized ((char*)menu_str[29].c_str());
452   aux_edge_str = XmStringCreateLocalized ((cha    452   aux_edge_str = XmStringCreateLocalized ((char*)menu_str[31].c_str());
453                                                   453 
454   //*********Create special pulldown menu on m    454   //*********Create special pulldown menu on menubar*********
455   spec_cascade = XmVaCreateSimplePulldownMenu     455   spec_cascade = XmVaCreateSimplePulldownMenu
456     (menubar,                                     456     (menubar,
457      (char*)menu_str[7].c_str(),                  457      (char*)menu_str[7].c_str(),
458      3,                                           458      3,
459      NULL,                                        459      NULL,
460      XmVaCASCADEBUTTON, trans_str,    (KeySym)    460      XmVaCASCADEBUTTON, trans_str,    (KeySym)XK_T,
461      XmVaCASCADEBUTTON, anti_str,     (KeySym)    461      XmVaCASCADEBUTTON, anti_str,     (KeySym)XK_A,
462      XmVaCASCADEBUTTON, halo_str,     (KeySym)    462      XmVaCASCADEBUTTON, halo_str,     (KeySym)XK_H,
463      XmVaCASCADEBUTTON, aux_edge_str, (KeySym)    463      XmVaCASCADEBUTTON, aux_edge_str, (KeySym)XK_E,
464      XtNvisual, vi -> visual,                     464      XtNvisual, vi -> visual, 
465      XtNdepth, vi -> depth,                       465      XtNdepth, vi -> depth, 
466      XtNcolormap, cmap,                           466      XtNcolormap, cmap, 
467      XtNborderColor, borcol,                      467      XtNborderColor, borcol,
468      XtNbackground, bgnd,                         468      XtNbackground, bgnd,
469      NULL);                                       469      NULL);
470                                                   470   
471   XmStringFree (trans_str);                       471   XmStringFree (trans_str);
472   XmStringFree (anti_str);                        472   XmStringFree (anti_str);
473   XmStringFree (halo_str);                        473   XmStringFree (halo_str);
474   XmStringFree (aux_edge_str);                    474   XmStringFree (aux_edge_str);
475                                                   475 
476   //  G4cout << "Created Special pulldown menu    476   //  G4cout << "Created Special pulldown menu" << G4endl;
477                                                   477 
478   //Add Transparency pullright menu to special    478   //Add Transparency pullright menu to special cascade...
479   off_str = XmStringCreateLocalized ((char*)me    479   off_str = XmStringCreateLocalized ((char*)menu_str[33].c_str());
480   on_str = XmStringCreateLocalized ((char*)men    480   on_str = XmStringCreateLocalized ((char*)menu_str[34].c_str());
481                                                   481 
482   transparency_pullright = XmVaCreateSimplePul    482   transparency_pullright = XmVaCreateSimplePulldownMenu 
483     (spec_cascade,                                483     (spec_cascade,
484      (char*)menu_str[26].c_str(),                 484      (char*)menu_str[26].c_str(),
485      0,                                           485      0,
486      transparency_callback,                       486      transparency_callback,
487      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, N    487      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, NULL, NULL,
488      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, N    488      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, NULL, NULL,
489      XmNradioBehavior, True,                      489      XmNradioBehavior, True, 
490      XmNradioAlwaysOne, True,                     490      XmNradioAlwaysOne, True, 
491      XmNuserData, this,                           491      XmNuserData, this,
492      XtNvisual, vi -> visual,                     492      XtNvisual, vi -> visual, 
493      XtNdepth, vi -> depth,                       493      XtNdepth, vi -> depth, 
494      XtNcolormap, cmap,                           494      XtNcolormap, cmap, 
495      XtNborderColor, borcol,                      495      XtNborderColor, borcol,
496      XtNbackground, bgnd,                         496      XtNbackground, bgnd,
497      NULL);                                       497      NULL);
498                                                   498   
499   if (transparency_enabled == false) {            499   if (transparency_enabled == false) {
500     special_widget = XtNameToWidget(transparen    500     special_widget = XtNameToWidget(transparency_pullright, "button_0");
501     if(special_widget) {                          501     if(special_widget) {
502       XtVaSetValues (special_widget, XmNset, T    502       XtVaSetValues (special_widget, XmNset, True, NULL);
503     }                                             503     }
504   } else if (transparency_enabled == true) {      504   } else if (transparency_enabled == true) {
505     special_widget = XtNameToWidget(transparen    505     special_widget = XtNameToWidget(transparency_pullright, "button_1");
506     if(special_widget) {                          506     if(special_widget) {
507       XtVaSetValues (special_widget, XmNset, T    507       XtVaSetValues (special_widget, XmNset, True, NULL);
508     }                                             508     }
509   } else {                                        509   } else {
510     G4Exception                                   510     G4Exception
511       ("G4OpenGLXmViewer::CreateMainWindow",      511       ("G4OpenGLXmViewer::CreateMainWindow",
512        "opengl2016", FatalException,              512        "opengl2016", FatalException,
513        "transparency_enabled in G4OpenGLXmView    513        "transparency_enabled in G4OpenGLXmViewer is neither true nor false!!");
514   }                                               514   }
515                                                   515 
516   //Add antialias pullright menu to special ca    516   //Add antialias pullright menu to special cascade...
517   antialias_pullright = XmVaCreateSimplePulldo    517   antialias_pullright = XmVaCreateSimplePulldownMenu 
518     (spec_cascade,                                518     (spec_cascade,
519      (char*)menu_str[28].c_str(),                 519      (char*)menu_str[28].c_str(),
520      1,                                           520      1,
521      antialias_callback,                          521      antialias_callback,
522      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, N    522      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, NULL, NULL,
523      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, N    523      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, NULL, NULL,
524      XmNradioBehavior, True,                      524      XmNradioBehavior, True, 
525      XmNradioAlwaysOne, True,                     525      XmNradioAlwaysOne, True, 
526      XmNuserData, this,                           526      XmNuserData, this,
527      XtNvisual, vi -> visual,                     527      XtNvisual, vi -> visual, 
528      XtNdepth, vi -> depth,                       528      XtNdepth, vi -> depth, 
529      XtNcolormap, cmap,                           529      XtNcolormap, cmap, 
530      XtNborderColor, borcol,                      530      XtNborderColor, borcol,
531      XtNbackground, bgnd,                         531      XtNbackground, bgnd,
532      NULL);                                       532      NULL);
533                                                   533   
534   if (antialiasing_enabled == false) {            534   if (antialiasing_enabled == false) {
535     special_widget = XtNameToWidget(antialias_    535     special_widget = XtNameToWidget(antialias_pullright, "button_0");
536     if(special_widget) {                          536     if(special_widget) {
537       XtVaSetValues (special_widget, XmNset, T    537       XtVaSetValues (special_widget, XmNset, True, NULL);
538     }                                             538     }
539   } else if (antialiasing_enabled == true) {      539   } else if (antialiasing_enabled == true) {
540     special_widget = XtNameToWidget(antialias_    540     special_widget = XtNameToWidget(antialias_pullright, "button_1");
541     if(special_widget) {                          541     if(special_widget) {
542       XtVaSetValues (special_widget, XmNset, T    542       XtVaSetValues (special_widget, XmNset, True, NULL);
543     }                                             543     }
544   } else {                                        544   } else {
545     G4Exception                                   545     G4Exception
546       ("G4OpenGLXmViewer::CreateMainWindow",      546       ("G4OpenGLXmViewer::CreateMainWindow",
547        "opengl2017", FatalException,              547        "opengl2017", FatalException,
548        "antialiasing_enabled in G4OpenGLXmView    548        "antialiasing_enabled in G4OpenGLXmViewer is neither true nor false!!");
549   }                                               549   }
550                                                   550 
551   //Add Haloing pullright menu to special casc    551   //Add Haloing pullright menu to special cascade...
552   haloing_pullright = XmVaCreateSimplePulldown    552   haloing_pullright = XmVaCreateSimplePulldownMenu 
553     (spec_cascade,                                553     (spec_cascade,
554      (char*)menu_str[30].c_str(),                 554      (char*)menu_str[30].c_str(),
555      2,                                           555      2,
556      haloing_callback,                            556      haloing_callback,
557      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, N    557      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, NULL, NULL,
558      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, N    558      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, NULL, NULL,
559      XmNradioBehavior, True,                      559      XmNradioBehavior, True, 
560      XmNradioAlwaysOne, True,                     560      XmNradioAlwaysOne, True, 
561      XmNuserData, this,                           561      XmNuserData, this,
562      XtNvisual, vi -> visual,                     562      XtNvisual, vi -> visual, 
563      XtNdepth, vi -> depth,                       563      XtNdepth, vi -> depth, 
564      XtNcolormap, cmap,                           564      XtNcolormap, cmap, 
565      XtNborderColor, borcol,                      565      XtNborderColor, borcol,
566      XtNbackground, bgnd,                         566      XtNbackground, bgnd,
567      NULL);                                       567      NULL);
568                                                   568   
569   if (haloing_enabled == false) {                 569   if (haloing_enabled == false) {
570     special_widget = XtNameToWidget(haloing_pu    570     special_widget = XtNameToWidget(haloing_pullright, "button_0");
571     if(special_widget) {                          571     if(special_widget) {
572       XtVaSetValues (special_widget, XmNset, T    572       XtVaSetValues (special_widget, XmNset, True, NULL);
573     }                                             573     }
574   } else if (haloing_enabled == true) {           574   } else if (haloing_enabled == true) {
575     special_widget = XtNameToWidget(haloing_pu    575     special_widget = XtNameToWidget(haloing_pullright, "button_1");
576     if(special_widget) {                          576     if(special_widget) {
577       XtVaSetValues (special_widget, XmNset, T    577       XtVaSetValues (special_widget, XmNset, True, NULL);
578     }                                             578     }
579   } else {                                        579   } else {
580     G4Exception                                   580     G4Exception
581       ("G4OpenGLXmViewer::CreateMainWindow",      581       ("G4OpenGLXmViewer::CreateMainWindow",
582        "opengl2018", FatalException,              582        "opengl2018", FatalException,
583        "haloing_enabled in G4OpenGLXmViewer is    583        "haloing_enabled in G4OpenGLXmViewer is neither true nor false!!");
584   }                                               584   }
585                                                   585 
586   //Add Aux_Edge pullright menu to special cas    586   //Add Aux_Edge pullright menu to special cascade...
587   aux_edge_pullright = XmVaCreateSimplePulldow    587   aux_edge_pullright = XmVaCreateSimplePulldownMenu 
588     (spec_cascade,                                588     (spec_cascade,
589      (char*)menu_str[32].c_str(),                 589      (char*)menu_str[32].c_str(),
590      3,                                           590      3,
591      aux_edge_callback,                           591      aux_edge_callback,
592      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, N    592      XmVaRADIOBUTTON, off_str, (KeySym)XK_f, NULL, NULL,
593      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, N    593      XmVaRADIOBUTTON, on_str,  (KeySym)XK_n, NULL, NULL,
594      XmNradioBehavior, True,                      594      XmNradioBehavior, True, 
595      XmNradioAlwaysOne, True,                     595      XmNradioAlwaysOne, True, 
596      XmNuserData, this,                           596      XmNuserData, this,
597      XtNvisual, vi -> visual,                     597      XtNvisual, vi -> visual, 
598      XtNdepth, vi -> depth,                       598      XtNdepth, vi -> depth, 
599      XtNcolormap, cmap,                           599      XtNcolormap, cmap, 
600      XtNborderColor, borcol,                      600      XtNborderColor, borcol,
601      XtNbackground, bgnd,                         601      XtNbackground, bgnd,
602      NULL);                                       602      NULL);
603                                                   603   
604   if (!fVP.IsAuxEdgeVisible()) {                  604   if (!fVP.IsAuxEdgeVisible()) {
605     special_widget = XtNameToWidget(aux_edge_p    605     special_widget = XtNameToWidget(aux_edge_pullright, "button_0");
606     if(special_widget) {                          606     if(special_widget) {
607       XtVaSetValues (special_widget, XmNset, T    607       XtVaSetValues (special_widget, XmNset, True, NULL);
608     }                                             608     }
609   } else {                                        609   } else {
610     special_widget = XtNameToWidget(aux_edge_p    610     special_widget = XtNameToWidget(aux_edge_pullright, "button_1");
611     if(special_widget) {                          611     if(special_widget) {
612       XtVaSetValues (special_widget, XmNset, T    612       XtVaSetValues (special_widget, XmNset, True, NULL);
613     }                                             613     }
614   }                                               614   }
615                                                   615 
616   XtManageChild (menubar);                        616   XtManageChild (menubar);
617   frame = XtVaCreateManagedWidget ((char*)menu    617   frame = XtVaCreateManagedWidget ((char*)menu_str[35].c_str(),
618            xmFrameWidgetClass, main_win,          618            xmFrameWidgetClass, main_win,
619            XtNvisual, vi -> visual,               619            XtNvisual, vi -> visual, 
620            XtNdepth, vi -> depth,                 620            XtNdepth, vi -> depth, 
621            XtNcolormap, cmap,                     621            XtNcolormap, cmap, 
622            XtNborderColor, borcol,                622            XtNborderColor, borcol,
623            XtNbackground, bgnd,                   623            XtNbackground, bgnd,
624            NULL);                                 624            NULL);
625                                                   625 
626   glxarea = XtVaCreateManagedWidget ((char*)me    626   glxarea = XtVaCreateManagedWidget ((char*)menu_str[36].c_str(), 
627              xmDrawingAreaWidgetClass,            627              xmDrawingAreaWidgetClass,
628              frame,                               628              frame,
629              XtNvisual, vi -> visual,             629              XtNvisual, vi -> visual, 
630              XtNdepth, vi -> depth,               630              XtNdepth, vi -> depth, 
631              XtNcolormap, cmap,                   631              XtNcolormap, cmap, 
632              XtNborderColor, borcol,              632              XtNborderColor, borcol,
633              XtNbackground, bgnd,                 633              XtNbackground, bgnd,
634              NULL);                               634              NULL);
635                                                   635   
636                                                   636 
637   XmMainWindowSetAreas (main_win,  // main wid    637   XmMainWindowSetAreas (main_win,  // main widget, children are specified 
638       menubar,   // widget to use as menu bar     638       menubar,   // widget to use as menu bar
639       NULL,      // widget to use as command w    639       NULL,      // widget to use as command window
640       NULL,      // widget for horizontal scro    640       NULL,      // widget for horizontal scroll bar
641       NULL,      // widget for vertical scroll    641       NULL,      // widget for vertical scroll bar
642       frame      // widget to be used for work    642       frame      // widget to be used for work window
643       );                                          643       );
644                                                   644 
645   XtRealizeWidget(shell);                         645   XtRealizeWidget(shell);
646                                                   646   
647   // Once widget is realized (ie, associated w    647   // Once widget is realized (ie, associated with a created X window), we
648   // can bind the OpenGL rendering context to     648   // can bind the OpenGL rendering context to the window.
649                                                   649 
650   win = XtWindow (glxarea);                       650   win = XtWindow (glxarea);
651                                                   651 
652   glXMakeCurrent (dpy, win, cxMaster);            652   glXMakeCurrent (dpy, win, cxMaster);
653                                                   653 
654   // This should be add AFTER glXMakeCurrent d    654   // This should be add AFTER glXMakeCurrent done because it will fire a resizeCallback
655   XtAddCallback (glxarea,                         655   XtAddCallback (glxarea, 
656      XmNresizeCallback,                           656      XmNresizeCallback, 
657      resize_callback,                             657      resize_callback, 
658      this);                                       658      this);
659                                                   659 
660   XtAddCallback (glxarea,                         660   XtAddCallback (glxarea, 
661      XmNexposeCallback,                           661      XmNexposeCallback, 
662      expose_callback,                             662      expose_callback, 
663      this);                                       663      this);
664                                                   664 
665 }                                                 665 }
666                                                   666 
667 G4OpenGLXmViewer::G4OpenGLXmViewer (G4OpenGLSc    667 G4OpenGLXmViewer::G4OpenGLXmViewer (G4OpenGLSceneHandler& scene):
668 G4VViewer (scene, -1),                            668 G4VViewer (scene, -1),
669 G4OpenGLViewer (scene),                           669 G4OpenGLViewer (scene),
670 G4OpenGLXViewer (scene),                          670 G4OpenGLXViewer (scene),
671 toplevel (0),                                     671 toplevel (0),
672 shell (0),                                        672 shell (0),
673 main_win (0),                                     673 main_win (0),
674 menubar (0),                                      674 menubar (0),
675 style_cascade (0),                                675 style_cascade (0),
676 actions_cascade (0),                              676 actions_cascade (0),
677 misc_cascade (0),                                 677 misc_cascade (0),
678 spec_cascade (0),                                 678 spec_cascade (0),
679 drawing_style_pullright (0),                      679 drawing_style_pullright (0),
680 background_color_pullright (0),                   680 background_color_pullright (0),
681 transparency_pullright (0),                       681 transparency_pullright (0),
682 antialias_pullright (0),                          682 antialias_pullright (0),
683 haloing_pullright (0),                            683 haloing_pullright (0),
684 aux_edge_pullright (0),                           684 aux_edge_pullright (0),
685 frame (0),                                        685 frame (0),
686 glxarea (0),                                      686 glxarea (0),
687 style_str (0),                                    687 style_str (0),
688 actions_str (0),                                  688 actions_str (0),
689 misc_str (0),                                     689 misc_str (0),
690 spec_str (0),                                     690 spec_str (0),
691 draw_str (0),                                     691 draw_str (0),
692 polyhedron_str (0),                               692 polyhedron_str (0),
693 wireframe_str (0),                                693 wireframe_str (0),
694 hlr_str (0),                                      694 hlr_str (0),
695 hsr_str (0),                                      695 hsr_str (0),
696 hlhsr_str (0),                                    696 hlhsr_str (0),
697 set_str (0),                                      697 set_str (0),
698 rot_str (0),                                      698 rot_str (0),
699 pan_str (0),                                      699 pan_str (0),
700 exit_str (0),                                     700 exit_str (0),
701 quit_str (0),                                     701 quit_str (0),
702 print_str (0),                                    702 print_str (0),
703 white_str (0),                                    703 white_str (0),
704 black_str (0),                                    704 black_str (0),
705 anti_str (0),                                     705 anti_str (0),
706 trans_str (0),                                    706 trans_str (0),
707 halo_str (0),                                     707 halo_str (0),
708 aux_edge_str (0),                                 708 aux_edge_str (0),
709 bgnd_str (0),                                     709 bgnd_str (0),
710 off_str (0),                                      710 off_str (0),
711 on_str (0),                                       711 on_str (0),
712 zoom_high (0.0),                                  712 zoom_high (0.0),
713 zoom_low (0.0),                                   713 zoom_low (0.0),
714 pan_low (0.0),                                    714 pan_low (0.0),
715 pan_high (0.0),                                   715 pan_high (0.0),
716 dolly_low (0.0),                                  716 dolly_low (0.0),
717 dolly_high (0.0),                                 717 dolly_high (0.0),
718 fov (0.0),                                        718 fov (0.0),
719 rot_sens_limit (0.0),                             719 rot_sens_limit (0.0),
720 pan_sens_limit (0.0),                             720 pan_sens_limit (0.0),
721 wob_high (0.0),                                   721 wob_high (0.0),
722 wob_low (0.0),                                    722 wob_low (0.0),
723 wob_sens (0.0),                                   723 wob_sens (0.0),
724 pan_right (false),                                724 pan_right (false),
725 rotate_right (false),                             725 rotate_right (false),
726 pan_up (false),                                   726 pan_up (false),
727 rotate_up (false),                                727 rotate_up (false),
728 original_vp(fVP.GetViewpointDirection()),         728 original_vp(fVP.GetViewpointDirection()),
729 frameNo (0),                                      729 frameNo (0),
730 fprotation_top (0),                               730 fprotation_top (0),
731 fprotation_button_box (0),                        731 fprotation_button_box (0),
732 fprotation_button1 (0),                           732 fprotation_button1 (0),
733 fprotation_button2 (0),                           733 fprotation_button2 (0),
734 fprotation_slider_box (0),                        734 fprotation_slider_box (0),
735 fprotation_slider (0),                            735 fprotation_slider (0),
736 fprotation_arrow_box (0),                         736 fprotation_arrow_box (0),
737 fprotation_arrow (0),                             737 fprotation_arrow (0),
738 fppanning_top (0),                                738 fppanning_top (0),
739 fppanning_box (0),                                739 fppanning_box (0),
740 fppanning_arrows (0),                             740 fppanning_arrows (0),
741 fppanning_slider (0),                             741 fppanning_slider (0),
742 fpzoom_box (0),                                   742 fpzoom_box (0),
743 fpzoom_slider (0),                                743 fpzoom_slider (0),
744 fpdolly_box (0),                                  744 fpdolly_box (0),
745 fpdolly_slider (0),                               745 fpdolly_slider (0),
746 fpsetting_top (0),                                746 fpsetting_top (0),
747 fpsetting_box (0),                                747 fpsetting_box (0),
748 fppan_set (0),                                    748 fppan_set (0),
749 fprot_set (0),                                    749 fprot_set (0),
750 fpzoom_upper (0),                                 750 fpzoom_upper (0),
751 fpzoom_lower (0),                                 751 fpzoom_lower (0),
752 fpdolly_upper (0),                                752 fpdolly_upper (0),
753 fpdolly_lower (0),                                753 fpdolly_lower (0),
754 fpok_button (0),                                  754 fpok_button (0),
755 fpmiscellany_top (0),                             755 fpmiscellany_top (0),
756 fpwobble_box (0),                                 756 fpwobble_box (0),
757 fpwobble_button (0),                              757 fpwobble_button (0),
758 fpwobble_slider (0),                              758 fpwobble_slider (0),
759 fpreset_box (0),                                  759 fpreset_box (0),
760 fpreset_button (0),                               760 fpreset_button (0),
761 fpproj_style_box (0),                             761 fpproj_style_box (0),
762 fporthogonal_button (0),                          762 fporthogonal_button (0),
763 fpperspective_button (0),                         763 fpperspective_button (0),
764 fpfov_text (0),                                   764 fpfov_text (0),
765 fpprint_top (0),                                  765 fpprint_top (0),
766 fpprint_box (0),                                  766 fpprint_box (0),
767 fpprint_col_box (0),                              767 fpprint_col_box (0),
768 fpprint_style_box (0),                            768 fpprint_style_box (0),
769 fpprint_text (0),                                 769 fpprint_text (0),
770 fpprint_button (0),                               770 fpprint_button (0),
771 fpprint_line (0),                                 771 fpprint_line (0),
772 fpprint_col_radio1 (0),                           772 fpprint_col_radio1 (0),
773 fpprint_col_radio2 (0),                           773 fpprint_col_radio2 (0),
774 fpprint_style_radio1 (0),                         774 fpprint_style_radio1 (0),
775 fpprint_style_radio2 (0)                          775 fpprint_style_radio2 (0)
776 {                                                 776 {
777   GetXmConnection ();                             777   GetXmConnection ();
778   ResetView();                                    778   ResetView();
779   if (fViewId < 0) return;                        779   if (fViewId < 0) return;
780 }                                                 780 }
781                                                   781 
782                                                   782 
783 void G4OpenGLXmViewer::UpdateControlPanel () {    783 void G4OpenGLXmViewer::UpdateControlPanel () {
784                                                   784 
785   // set new values                               785   // set new values
786                                                   786 
787   if (fprotation_slider) {                        787   if (fprotation_slider) {
788     fprotation_slider->SetInitialValue(fRot_se    788     fprotation_slider->SetInitialValue(fRot_sens);
789     fprotation_slider->SetMaxValue(rot_sens_li    789     fprotation_slider->SetMaxValue(rot_sens_limit);
790     fprotation_slider->SetMinValue(0);            790     fprotation_slider->SetMinValue(0);
791   }                                               791   }
792   if (fppanning_slider) {                         792   if (fppanning_slider) {
793     fppanning_slider->SetInitialValue(fPan_sen    793     fppanning_slider->SetInitialValue(fPan_sens);
794     fppanning_slider->SetMaxValue(pan_sens_lim    794     fppanning_slider->SetMaxValue(pan_sens_limit);
795     fppanning_slider->SetMinValue(0);             795     fppanning_slider->SetMinValue(0);
796   }                                               796   }
797   if (fpzoom_slider) {                            797   if (fpzoom_slider) {
798     fpzoom_slider->SetInitialValue(fVP.GetZoom    798     fpzoom_slider->SetInitialValue(fVP.GetZoomFactor());
799     fpzoom_slider->SetMinValue(zoom_low);         799     fpzoom_slider->SetMinValue(zoom_low);
800     fpzoom_slider->SetMaxValue(zoom_high);        800     fpzoom_slider->SetMaxValue(zoom_high);
801   }                                               801   }
802   if (fpdolly_slider) {                           802   if (fpdolly_slider) {
803     fpdolly_slider->SetInitialValue(fVP.GetDol    803     fpdolly_slider->SetInitialValue(fVP.GetDolly());
804     fpdolly_slider->SetMinValue(dolly_low);       804     fpdolly_slider->SetMinValue(dolly_low);
805     fpdolly_slider->SetMaxValue(dolly_high);      805     fpdolly_slider->SetMaxValue(dolly_high);
806   }                                               806   }
807                                                   807 
808   if (fpwobble_slider) {                          808   if (fpwobble_slider) {
809     fpwobble_slider->SetInitialValue(fVP.GetDo    809     fpwobble_slider->SetInitialValue(fVP.GetDolly());
810   }                                               810   }
811                                                   811 
812   if (fppan_set) {                                812   if (fppan_set) {
813     fppan_set->SetValue(pan_sens_limit);          813     fppan_set->SetValue(pan_sens_limit);
814   }                                               814   }
815                                                   815 
816   if (fprot_set) {                                816   if (fprot_set) {
817     fprot_set->SetValue(rot_sens_limit);          817     fprot_set->SetValue(rot_sens_limit);
818   }                                               818   }
819                                                   819 
820   if (fpzoom_upper) {                             820   if (fpzoom_upper) {
821     fpzoom_upper->SetValue(zoom_high);            821     fpzoom_upper->SetValue(zoom_high);
822   }                                               822   }
823                                                   823 
824   if (fpzoom_lower) {                             824   if (fpzoom_lower) {
825     fpzoom_lower->SetValue(zoom_low);             825     fpzoom_lower->SetValue(zoom_low);
826   }                                               826   }
827   if (fpdolly_upper) {                            827   if (fpdolly_upper) {
828     fpdolly_upper->SetValue(dolly_high);          828     fpdolly_upper->SetValue(dolly_high);
829   }                                               829   }
830                                                   830 
831   if (fpdolly_lower) {                            831   if (fpdolly_lower) {
832     fpdolly_lower->SetValue(dolly_low);           832     fpdolly_lower->SetValue(dolly_low);
833   }                                               833   }
834                                                   834 
835                                                   835 
836 }                                                 836 }
837                                                   837 
838                                                   838 
839 G4OpenGLXmViewer::~G4OpenGLXmViewer ()            839 G4OpenGLXmViewer::~G4OpenGLXmViewer ()
840 {                                                 840 {
841   XtDestroyWidget  (shell);                       841   XtDestroyWidget  (shell);
842   win = 0; // ...to avoid XDestroyWindow in G4    842   win = 0; // ...to avoid XDestroyWindow in G4OpenGLXViewer base class
843   // because XtDestroyWidget has already destr    843   // because XtDestroyWidget has already destroyed it.
844   G4Xt::getInstance () ->RemoveShell (shell);     844   G4Xt::getInstance () ->RemoveShell (shell);
845                                                   845 
846 /******************************                   846 /******************************
847   if (fprotation_top) {                           847   if (fprotation_top) {
848     delete fprotation_top;                        848     delete fprotation_top;
849   }                                               849   }
850                                                   850 
851   if (fppanning_top) {                            851   if (fppanning_top) {
852     delete fppanning_top;                         852     delete fppanning_top;
853   }                                               853   }
854                                                   854 
855   if (fpsetting_top) {                            855   if (fpsetting_top) {
856     delete fpsetting_top;                         856     delete fpsetting_top;
857   }                                               857   }
858                                                   858 
859   if (fpmiscellany_top) {                         859   if (fpmiscellany_top) {
860     delete fpmiscellany_top;                      860     delete fpmiscellany_top;
861   }                                               861   }
862 ******************************/                   862 ******************************/
863                                                   863 
864 }                                                 864 }
865                                                   865