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.0.p3,)


** Warning: Cannot open xref database.

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