source: trunk/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc @ 914

Last change on this file since 914 was 914, checked in by garnier, 16 years ago

test avec des predefined headers...mais +10% de temps de compilation....

  • Property svn:mime-type set to text/cpp
File size: 22.3 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: G4OpenGLXmViewer.cc,v 1.29 2009/01/22 15:39:55 lgarnier Exp $
28// GEANT4 tag $Name:  $
29//
30//
31// Andrew Walkden  10th February 1997
32// G4OpenGLXmViewer : Class derived from G4OpenGLXViewer, to provide
33//                  (Motif) widget OpenGL functionality for GEANT4.
34
35#ifdef G4VIS_BUILD_OPENGLXM_DRIVER
36
37#include "globals.hh"
38
39#include "G4OpenGLXmViewer.hh"
40#include "G4OpenGLSceneHandler.hh"
41
42#include "G4VisExtent.hh"
43#include "G4LogicalVolume.hh"
44#include "G4VSolid.hh"
45#include "G4Point3D.hh"
46#include "G4Normal3D.hh"
47
48#include "G4OpenGLXmSliderBar.hh"
49
50#include "G4Xt.hh"
51#include <X11/Shell.h>
52
53#include <sstream>
54
55void G4OpenGLXmViewer::ShowView () {
56
57  G4Xt::getInstance () -> SecondaryLoop ();
58
59}
60
61void G4OpenGLXmViewer::GetXmConnection () {
62 
63  G4Xt* interactorManager = G4Xt::getInstance ();
64  toplevel = (Widget)interactorManager->GetMainInteractor();
65  app      = XtWidgetToApplicationContext(toplevel);
66
67  if (!toplevel) {
68    fViewId = -1;  // This flags an error.
69    G4cerr << "G4OpenGLXmViewer::GetXmConnection unable to Initialize"
70      " application context." << G4endl;
71    return;
72  }
73
74  // Better to put this in an X11 resource file !!!
75  std::ostringstream oss;
76  oss <<
77    "*glxarea*width: " << fVP.GetWindowSizeHintX() << "\n"
78    "*glxarea*height: " << fVP.GetWindowSizeHintY() << "\n"
79    /*
80    // Tried this as a replacement for the above two lines, but
81    // sub-windows (rotation, etc.) came same size!!
82    "*geometry: " << fVP.GetXGeometryString() << "\n"
83    */
84    "*frame*x: 10\n"
85    "*frame*y: 10\n"
86    "*frame*topOffset: 10\n"
87    "*frame*bottomOffset: 10\n"
88    "*frame*rightOffset: 10\n"
89    "*frame*leftOffset: 10\n"
90    "*frame*shadowType: SHADOW_IN\n"
91    "*frame*useColorObj: False\n"
92    "*frame*primaryColorSetId: 3\n"
93    "*frame*secondaryColorSetId: 3\n"
94    "*menubar*useColorObj: False\n"
95    "*menubar*primaryColorSetId: 3\n"
96    "*menubar*secondaryColorSetId: 3\n"
97    "*toplevel*useColorObj: False\n"
98    "*toplevel*primaryColorSetId: 3\n"
99    "*toplevel*secondaryColorSetId: 3\n";
100  interactorManager->PutStringInResourceDatabase ((char*)oss.str().c_str());
101
102  //  interactorManager->AddSecondaryLoopPostAction ((G4SecondaryLoopAction)G4OpenGLXmViewerSecondaryLoopPostAction);
103 
104  shell = XtAppCreateShell ((String)fName.data(),(String)fName.data(),topLevelShellWidgetClass,XtDisplay(toplevel),NULL,0);
105  interactorManager->AddShell (shell);
106
107  dpy = XtDisplay (shell);
108
109  if (!dpy) {
110    fViewId = -1;  // This flags an error.
111    G4cerr << "G4OpenGLXmViewer::GetXmConnection unable to connect to display."
112         << G4endl;
113    return;
114  }
115
116  if (!glXQueryExtension (dpy, &errorBase, &eventBase)) {
117    fViewId = -1;  // This flags an error.
118    G4cerr << "G4OpenGLXmViewer::GetXmConnection. X Server has no GLX extension."
119         << G4endl;;
120    return;
121  }
122}
123
124void G4OpenGLXmViewer::CreateMainWindow () {
125
126  bgnd = XWhitePixelOfScreen (XtScreen(shell));
127  borcol = XBlackPixelOfScreen (XtScreen(shell));
128 
129  fWinSize_x = fVP.GetWindowSizeHintX();
130  fWinSize_y = fVP.GetWindowSizeHintY();
131  G4int x_origin = fVP.GetWindowAbsoluteLocationHintX(DisplayWidth(dpy, vi -> screen));
132
133  // FIXME,  screen size != window size on MAC, but I don't know have to get the menuBar
134  // size on MAC. L.Garnier 01/2009
135  G4int y_origin = fVP.GetWindowAbsoluteLocationHintY(DisplayHeight(dpy, vi -> screen));
136
137  if (fVP.IsWindowSizeHintX () && fVP.IsWindowLocationHintX () && fVP.IsWindowLocationHintY ()) {
138    XtVaSetValues (shell,
139                   XtNvisual, vi -> visual,
140                   XtNdepth, vi -> depth,
141                   XtNcolormap, cmap,
142                   XtNwidth, fWinSize_x,
143                   XtNheight, fWinSize_y,
144                   XtNx, x_origin,
145                   XtNy, y_origin,
146                   XtNborderColor, &borcol,
147                   XtNbackground, &bgnd,
148                   XmNtitle, fName.data(),
149                   NULL);
150  } else if (fVP.IsWindowSizeHintX () && !(fVP.IsWindowLocationHintX () || fVP.IsWindowLocationHintY ())) {
151    XtVaSetValues (shell,
152                   XtNvisual, vi -> visual,
153                   XtNdepth, vi -> depth,
154                   XtNcolormap, cmap,
155                   XtNwidth, fWinSize_x,
156                   XtNheight, fWinSize_y,
157                   XtNborderColor, &borcol,
158                   XtNbackground, &bgnd,
159                   XmNtitle, fName.data(),
160                   NULL);
161  } else if ((!fVP.IsWindowSizeHintX ()) && fVP.IsWindowLocationHintX () && fVP.IsWindowLocationHintY ()) {
162    XtVaSetValues (shell,
163                   XtNvisual, vi -> visual,
164                   XtNdepth, vi -> depth,
165                   XtNcolormap, cmap,
166                   XtNx, x_origin,
167                   XtNy, y_origin,
168                   XtNborderColor, &borcol,
169                   XtNbackground, &bgnd,
170                   XmNtitle, fName.data(),
171                   NULL);
172  } else {
173    XtVaSetValues (shell,
174                   XtNvisual, vi -> visual,
175                   XtNdepth, vi -> depth,
176                   XtNcolormap, cmap,
177                   XtNborderColor, &borcol,
178                   XtNbackground, &bgnd,
179                   XmNtitle, fName.data(),
180                   NULL);
181  }
182
183
184  main_win = XtVaCreateManagedWidget ("main_win",
185                                      xmMainWindowWidgetClass,
186                                      shell,
187                                      XtNvisual, vi -> visual,
188                                      XtNdepth, vi -> depth,
189                                      XtNcolormap, cmap,
190                                      XtNborderColor, borcol,
191                                      XtNbackground, bgnd,
192                                      NULL);
193
194  //*********Create a menu bar for the window********
195  style_str = XmStringCreateLocalized ((char*)"Style");
196  actions_str = XmStringCreateLocalized ((char*)"Actions");
197  misc_str = XmStringCreateLocalized ((char*)"Miscellany");
198  spec_str = XmStringCreateLocalized ((char*)"Special");
199
200  menubar = XmVaCreateSimpleMenuBar (main_win,
201                                     (char*)"menubar",
202                                     XmVaCASCADEBUTTON, style_str, 'S',
203                                     XmVaCASCADEBUTTON, actions_str, 'A',
204                                     XmVaCASCADEBUTTON, misc_str, 'M',
205                                     XmVaCASCADEBUTTON, spec_str, 'p',
206                                     XtNvisual, vi -> visual,
207                                     XtNdepth, vi -> depth,
208                                     XtNcolormap, cmap,
209                                     XtNborderColor, borcol,
210                                     XtNbackground, bgnd,
211                                     NULL);
212
213  XmStringFree (style_str);
214  XmStringFree (actions_str);
215  XmStringFree (misc_str);
216  XmStringFree (spec_str);
217
218  G4cout << "Created menubar" << G4endl;
219
220
221  //*********Create style pulldown menu on menubar*********
222  rep_str = XmStringCreateLocalized ((char*)"Representation");
223  draw_str = XmStringCreateLocalized ((char*)"Drawing");
224  bgnd_str = XmStringCreateLocalized ((char*)"Background color");
225
226  style_cascade = XmVaCreateSimplePulldownMenu
227    (menubar,
228     (char*)"style",
229     0,
230     NULL,
231     XmVaCASCADEBUTTON, rep_str, 'R',
232     XmVaCASCADEBUTTON, draw_str, 'D',
233     XmVaCASCADEBUTTON, bgnd_str, 'B',
234     XtNvisual, vi -> visual,
235     XtNdepth, vi -> depth,
236     XtNcolormap, cmap,
237     XtNborderColor, borcol,
238     XtNbackground, bgnd,
239     NULL);
240 
241  XmStringFree (rep_str);
242  XmStringFree (draw_str);
243  XmStringFree (bgnd_str);
244
245  //  G4cout << "Created Style pulldown menu" << G4endl;
246
247  //Add Representation pullright menu to style cascade...
248  polyhedron_str = XmStringCreateLocalized ((char*)"Polyhedron");
249  nurbs_str = XmStringCreateLocalized ((char*)"NURBS");
250
251  rep_style_pullright = XmVaCreateSimplePulldownMenu
252    (style_cascade,
253     (char*)"rep_style",
254     0,
255     rep_style_callback,
256     XmVaRADIOBUTTON, polyhedron_str, 'P', NULL, NULL,
257     XmVaRADIOBUTTON, nurbs_str, 'N', NULL, NULL,
258     XmNradioBehavior, True,
259     XmNradioAlwaysOne, True,
260     XmNuserData, this,
261     XtNvisual, vi -> visual,
262     XtNdepth, vi -> depth,
263     XtNcolormap, cmap,
264     XtNborderColor, borcol,
265     XtNbackground, bgnd,
266     NULL);
267 
268  Widget special_widget;
269
270  G4ViewParameters::RepStyle style;
271  style = fVP.GetRepStyle();
272 
273  if (style == G4ViewParameters::polyhedron) {
274    special_widget = XtNameToWidget(rep_style_pullright, "button_0");
275    if(special_widget) {
276      XtVaSetValues (special_widget, XmNset, True, NULL);
277    }
278  } else if (style == G4ViewParameters::nurbs) {
279    special_widget = XtNameToWidget(rep_style_pullright, "button_1");
280    if(special_widget) {
281      XtVaSetValues (special_widget, XmNset, True, NULL);
282    }
283  } else {
284    G4Exception("Invalid Representation style in G4OpenGLXmViewer::CreateContext");
285  }
286  XmStringFree (polyhedron_str);
287  XmStringFree (nurbs_str);
288 
289  //  G4cout << "Created Representation pulldown menu" << G4endl;
290
291  //Add Drawing pullright menu to style cascade...
292  wireframe_str = XmStringCreateLocalized ((char*)"Wireframe");
293  hlr_str = XmStringCreateLocalized ((char*)"Hidden line removal");
294  hsr_str = XmStringCreateLocalized ((char*)"Hidden surface removal");
295  hlhsr_str = XmStringCreateLocalized ((char*)"Hidden line and surface removal");
296
297  drawing_style_pullright = XmVaCreateSimplePulldownMenu
298    (style_cascade,
299     (char*)"drawing_style",
300     1,
301     drawing_style_callback,
302     XmVaRADIOBUTTON, wireframe_str, 'W', NULL, NULL,
303     XmVaRADIOBUTTON, hlr_str, 'L', NULL, NULL,
304     XmVaRADIOBUTTON, hsr_str, 'S', NULL, NULL,
305     XmVaRADIOBUTTON, hlhsr_str, 'H', NULL, NULL,
306     XmNradioBehavior, True,
307     XmNradioAlwaysOne, True,
308     XmNuserData, this,
309     XtNvisual, vi -> visual,
310     XtNdepth, vi -> depth,
311     XtNcolormap, cmap,
312     XtNborderColor, borcol,
313     XtNbackground, bgnd,
314     NULL);
315 
316  G4ViewParameters::DrawingStyle d_style;
317  d_style = fVP.GetDrawingStyle();
318 
319  if (d_style == G4ViewParameters::wireframe) {
320    special_widget = XtNameToWidget(drawing_style_pullright, "button_0");
321    if(special_widget) {
322      XtVaSetValues (special_widget, XmNset, True, NULL);
323    }
324  } else if (d_style == G4ViewParameters::hlr) {
325    special_widget = XtNameToWidget(drawing_style_pullright, "button_1");
326    if(special_widget) {
327      XtVaSetValues (special_widget, XmNset, True, NULL);
328    }
329  } else if (d_style == G4ViewParameters::hsr) {
330    special_widget = XtNameToWidget(drawing_style_pullright, "button_2");
331    if(special_widget) {
332      XtVaSetValues (special_widget, XmNset, True, NULL);
333    }
334  } else if (d_style == G4ViewParameters::hlhsr) {
335    special_widget = XtNameToWidget(drawing_style_pullright, "button_3");
336    if(special_widget) {
337      XtVaSetValues (special_widget, XmNset, True, NULL);
338    }
339  } else {
340    G4Exception("Invalid Drawing style in G4OpenGLXmViewer::CreateContext");
341  }
342
343  XmStringFree (wireframe_str);
344  XmStringFree (hlr_str);
345  XmStringFree (hsr_str);
346  XmStringFree (hlhsr_str);
347
348  //  G4cout << "Created Drawing pullright menu" << G4endl;
349
350  //Add Drawing pullright menu to style cascade...
351  white_str = XmStringCreateLocalized ((char*)"White");
352  black_str = XmStringCreateLocalized ((char*)"Black");
353
354  background_color_pullright = XmVaCreateSimplePulldownMenu
355    (style_cascade,
356     (char*)"background_color",
357     2,
358     background_color_callback,
359     XmVaRADIOBUTTON, white_str, 'W', NULL, NULL,
360     XmVaRADIOBUTTON, black_str, 'B', NULL, NULL,
361     XmNradioBehavior, True,
362     XmNradioAlwaysOne, True,
363     XmNuserData, this,
364     XtNvisual, vi -> visual,
365     XtNdepth, vi -> depth,
366     XtNcolormap, cmap,
367     XtNborderColor, borcol,
368     XtNbackground, bgnd,
369     NULL);
370 
371  if (background.GetRed() == 1. &&
372      background.GetGreen() == 1. &&
373      background.GetBlue() == 1.) {
374    special_widget = XtNameToWidget(background_color_pullright, "button_0");
375    if(special_widget) {
376      XtVaSetValues (special_widget, XmNset, True, NULL);
377    }
378  } else {
379    special_widget = XtNameToWidget(background_color_pullright, "button_1");
380    if(special_widget) {
381      XtVaSetValues (special_widget, XmNset, True, NULL);
382    }
383  }
384
385  XmStringFree (white_str);
386  XmStringFree (black_str);
387
388  //  G4cout << "Created Background color pullright menu" << G4endl;
389
390  //*********Create actions pulldown menu on menubar*********
391  rot_str = XmStringCreateLocalized ((char*)"Rotation control panel");
392  pan_str = XmStringCreateLocalized ((char*)"Panning control panel");
393  set_str = XmStringCreateLocalized ((char*)"Set control panel limits");
394
395  actions_cascade = XmVaCreateSimplePulldownMenu
396    (menubar,
397     (char*)"actions",
398     1,
399     actions_callback,
400     XmVaPUSHBUTTON, rot_str, 'R', NULL, NULL,
401     XmVaPUSHBUTTON, pan_str, 'P', NULL, NULL,
402     XmVaPUSHBUTTON, set_str, 'S', NULL, NULL,
403     XmNuserData, this,
404     XtNvisual, vi -> visual,
405     XtNdepth, vi -> depth,
406     XtNcolormap, cmap,
407     XtNborderColor, borcol,
408     XtNbackground, bgnd,
409     NULL);
410 
411  XmStringFree (rot_str);
412  XmStringFree (pan_str);
413  XmStringFree (set_str);
414  G4cout << "Created Actions pulldown menu" << G4endl;
415
416  misc_str = XmStringCreateLocalized ((char*)"Miscellany control panel");
417  exit_str = XmStringCreateLocalized ((char*)"Exit to G4Vis>");
418  print_str = XmStringCreateLocalized ((char*)"Create .eps file");
419
420  //*********Create miscellany pulldown menu on menubar*********
421  misc_cascade = XmVaCreateSimplePulldownMenu
422    (menubar,
423     (char*)"miscellany",
424     2,
425     misc_callback,
426     XmVaPUSHBUTTON, misc_str, 'M', NULL, NULL,
427     XmVaPUSHBUTTON, exit_str, 'E', NULL, NULL,
428     XmVaPUSHBUTTON, print_str, 'P', NULL, NULL,
429     XmNuserData, this,
430     XtNvisual, vi -> visual,
431     XtNdepth, vi -> depth,
432     XtNcolormap, cmap,
433     XtNborderColor, borcol,
434     XtNbackground, bgnd,
435     NULL);
436 
437  XmStringFree (misc_str);
438  XmStringFree (exit_str);
439  XmStringFree (print_str);
440  G4cout << "Created Miscellany pulldown menu" << G4endl;
441
442  trans_str = XmStringCreateLocalized ((char*)"Transparency");
443  anti_str = XmStringCreateLocalized ((char*)"Antialiasing");
444  halo_str = XmStringCreateLocalized ((char*)"Haloing");
445  aux_edge_str = XmStringCreateLocalized ((char*)"Auxiliary edges");
446
447  //*********Create special pulldown menu on menubar*********
448  spec_cascade = XmVaCreateSimplePulldownMenu
449    (menubar,
450     (char*)"special",
451     3,
452     NULL,
453     XmVaCASCADEBUTTON, trans_str, 'T',
454     XmVaCASCADEBUTTON, anti_str, 'A',
455     XmVaCASCADEBUTTON, halo_str, 'H',
456     XmVaCASCADEBUTTON, aux_edge_str, 'E',
457     XtNvisual, vi -> visual,
458     XtNdepth, vi -> depth,
459     XtNcolormap, cmap,
460     XtNborderColor, borcol,
461     XtNbackground, bgnd,
462     NULL);
463 
464  XmStringFree (trans_str);
465  XmStringFree (anti_str);
466  XmStringFree (halo_str);
467  XmStringFree (aux_edge_str);
468
469  //  G4cout << "Created Special pulldown menu" << G4endl;
470
471  //Add Transparency pullright menu to special cascade...
472  off_str = XmStringCreateLocalized ((char*)"Off");
473  on_str = XmStringCreateLocalized ((char*)"On");
474
475  transparency_pullright = XmVaCreateSimplePulldownMenu
476    (spec_cascade,
477     (char*)"transparency",
478     0,
479     transparency_callback,
480     XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
481     XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
482     XmNradioBehavior, True,
483     XmNradioAlwaysOne, True,
484     XmNuserData, this,
485     XtNvisual, vi -> visual,
486     XtNdepth, vi -> depth,
487     XtNcolormap, cmap,
488     XtNborderColor, borcol,
489     XtNbackground, bgnd,
490     NULL);
491 
492  if (transparency_enabled == false) {
493    special_widget = XtNameToWidget(transparency_pullright, "button_0");
494    if(special_widget) {
495      XtVaSetValues (special_widget, XmNset, True, NULL);
496    }
497  } else if (transparency_enabled == true) {
498    special_widget = XtNameToWidget(transparency_pullright, "button_1");
499    if(special_widget) {
500      XtVaSetValues (special_widget, XmNset, True, NULL);
501    }
502  } else {
503    G4Exception("transparency_enabled in G4OpenGLXmViewer is neither true nor false!!");
504  }
505
506  //Add antialias pullright menu to special cascade...
507  antialias_pullright = XmVaCreateSimplePulldownMenu
508    (spec_cascade,
509     (char*)"antialias",
510     1,
511     antialias_callback,
512     XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
513     XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
514     XmNradioBehavior, True,
515     XmNradioAlwaysOne, True,
516     XmNuserData, this,
517     XtNvisual, vi -> visual,
518     XtNdepth, vi -> depth,
519     XtNcolormap, cmap,
520     XtNborderColor, borcol,
521     XtNbackground, bgnd,
522     NULL);
523 
524  if (antialiasing_enabled == false) {
525    special_widget = XtNameToWidget(antialias_pullright, "button_0");
526    if(special_widget) {
527      XtVaSetValues (special_widget, XmNset, True, NULL);
528    }
529  } else if (antialiasing_enabled == true) {
530    special_widget = XtNameToWidget(antialias_pullright, "button_1");
531    if(special_widget) {
532      XtVaSetValues (special_widget, XmNset, True, NULL);
533    }
534  } else {
535    G4Exception("antialiasing_enabled in G4OpenGLXmViewer is neither true nor false!!");
536  }
537
538  //Add Haloing pullright menu to special cascade...
539  haloing_pullright = XmVaCreateSimplePulldownMenu
540    (spec_cascade,
541     (char*)"haloing",
542     2,
543     haloing_callback,
544     XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
545     XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
546     XmNradioBehavior, True,
547     XmNradioAlwaysOne, True,
548     XmNuserData, this,
549     XtNvisual, vi -> visual,
550     XtNdepth, vi -> depth,
551     XtNcolormap, cmap,
552     XtNborderColor, borcol,
553     XtNbackground, bgnd,
554     NULL);
555 
556  if (haloing_enabled == false) {
557    special_widget = XtNameToWidget(haloing_pullright, "button_0");
558    if(special_widget) {
559      XtVaSetValues (special_widget, XmNset, True, NULL);
560    }
561  } else if (haloing_enabled == true) {
562    special_widget = XtNameToWidget(haloing_pullright, "button_1");
563    if(special_widget) {
564      XtVaSetValues (special_widget, XmNset, True, NULL);
565    }
566  } else {
567    G4Exception("haloing_enabled in G4OpenGLXmViewer is neither true nor false!!");
568  }
569
570  //Add Aux_Edge pullright menu to special cascade...
571  aux_edge_pullright = XmVaCreateSimplePulldownMenu
572    (spec_cascade,
573     (char*)"aux_edge",
574     3,
575     aux_edge_callback,
576     XmVaRADIOBUTTON, off_str, 'f', NULL, NULL,
577     XmVaRADIOBUTTON, on_str, 'n', NULL, NULL,
578     XmNradioBehavior, True,
579     XmNradioAlwaysOne, True,
580     XmNuserData, this,
581     XtNvisual, vi -> visual,
582     XtNdepth, vi -> depth,
583     XtNcolormap, cmap,
584     XtNborderColor, borcol,
585     XtNbackground, bgnd,
586     NULL);
587 
588  if (!fVP.IsAuxEdgeVisible()) {
589    special_widget = XtNameToWidget(aux_edge_pullright, "button_0");
590    if(special_widget) {
591      XtVaSetValues (special_widget, XmNset, True, NULL);
592    }
593  } else {
594    special_widget = XtNameToWidget(aux_edge_pullright, "button_1");
595    if(special_widget) {
596      XtVaSetValues (special_widget, XmNset, True, NULL);
597    }
598  }
599
600  XtManageChild (menubar);
601  frame = XtVaCreateManagedWidget ((char*)"frame",
602                                   xmFrameWidgetClass, main_win,
603                                   XtNvisual, vi -> visual,
604                                   XtNdepth, vi -> depth,
605                                   XtNcolormap, cmap,
606                                   XtNborderColor, borcol,
607                                   XtNbackground, bgnd,
608                                   NULL);
609
610  glxarea = XtVaCreateManagedWidget ((char*)"glxarea",
611                                     xmDrawingAreaWidgetClass,
612                                     frame,
613                                     XtNvisual, vi -> visual,
614                                     XtNdepth, vi -> depth,
615                                     XtNcolormap, cmap,
616                                     XtNborderColor, borcol,
617                                     XtNbackground, bgnd,
618                                     NULL);
619 
620
621  XmMainWindowSetAreas (main_win,  // main widget, children are specified
622                        menubar,   // widget to use as menu bar
623                        NULL,      // widget to use as command window
624                        NULL,      // widget for horizontal scroll bar
625                        NULL,      // widget for vertical scroll bar
626                        frame      // widget to be used for work window
627                        );
628
629  XtRealizeWidget(shell);
630 
631  // Once widget is realized (ie, associated with a created X window), we
632  // can bind the OpenGL rendering context to the window.
633
634  win = XtWindow (glxarea);
635
636  glXMakeCurrent (dpy, win, cx);
637
638  // This should be add AFTER glXMakeCurrent done because it will fire a resizeCallback
639  XtAddCallback (glxarea,
640                 XmNresizeCallback,
641                 resize_callback,
642                 this);
643
644  XtAddCallback (glxarea,
645                 XmNexposeCallback,
646                 expose_callback,
647                 this);
648
649}
650
651G4OpenGLXmViewer::G4OpenGLXmViewer (G4OpenGLSceneHandler& scene):
652G4VViewer (scene, -1),
653G4OpenGLViewer (scene),
654G4OpenGLXViewer (scene),
655zoom_high (fVP.GetZoomFactor() * 10.0),
656zoom_low (fVP.GetZoomFactor() / 10.0),
657dolly_low (fVP.GetDolly() - 1000.0),
658dolly_high (fVP.GetDolly() + 1000.0),
659fov (0.0),
660rot_sens_limit (90.),
661pan_sens_limit (100.),
662rot_sens (1.),
663wob_sens (20.),
664original_vp(fVP.GetViewpointDirection()),
665frameNo (0),
666fprotation_top (0),
667fprotation_slider (0),
668fppanning_top (0),
669fppanning_slider (0),
670fpzoom_slider (0),
671fpdolly_slider (0),
672fpsetting_top (0),
673fpmiscellany_top (0),
674fpprint_top (0)
675{
676  GetXmConnection ();
677  if (fViewId < 0) return;
678}
679
680G4OpenGLXmViewer::~G4OpenGLXmViewer ()
681{
682  XtDestroyWidget  (shell);
683  win = 0; // ...to avoid XDestroyWindow in G4OpenGLXViewer base class
684  // because XtDestroyWidget has already destroyed it.
685  G4Xt::getInstance () ->RemoveShell (shell);
686
687/******************************
688  if (fprotation_top) {
689    delete fprotation_top;
690  }
691
692  if (fppanning_top) {
693    delete fppanning_top;
694  }
695
696  if (fpsetting_top) {
697    delete fpsetting_top;
698  }
699
700  if (fpmiscellany_top) {
701    delete fpmiscellany_top;
702  }
703******************************/
704
705}
706
707#endif
Note: See TracBrowser for help on using the repository browser.