Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 3 4 #ifndef toolx_Xt_session 5 #define toolx_Xt_session 6 7 #include <X11/Intrinsic.h> 8 #include <X11/Shell.h> 9 #include <X11/StringDefs.h> 10 11 #include <ostream> 12 13 namespace toolx { 14 namespace Xt { 15 16 class session { 17 public: 18 session(std::ostream& a_out) 19 :m_out(a_out),m_app_context(0),m_app_widget(0),m_app_owner(false) 20 {} 21 session(std::ostream& a_out,XtAppContext a_app_context,Widget a_app_widget) 22 :m_out(a_out),m_app_context(a_app_context),m_app_widget(a_app_widget),m_app_owner(false) 23 {} 24 session(std::ostream& a_out,int& a_argc,char** a_argv) 25 :m_out(a_out),m_app_context(0),m_app_widget(0),m_app_owner(false) 26 { 27 //LookDSM_Problem(); 28 Arg args[1]; 29 XtSetArg(args[0],XtNgeometry,XtNewString("100x100")); 30 m_app_widget = ::XtAppInitialize(&m_app_context,"toolx::Xt::session",NULL,(Cardinal)0,&a_argc,a_argv,NULL,args,1); 31 if(!m_app_context || !m_app_widget) { 32 m_app_context = 0; 33 m_app_widget = 0; 34 m_app_owner = false; 35 return; 36 } 37 m_app_owner = true; 38 } 39 virtual ~session() { 40 if(m_app_owner) { 41 if(m_app_widget) {::XtDestroyWidget(m_app_widget);m_app_widget = 0;} 42 if(m_app_context) {::XtDestroyApplicationContext(m_app_context);m_app_context = 0;} 43 } 44 } 45 protected: 46 session(const session& a_from) 47 :m_out(a_from.m_out),m_app_context(0),m_app_widget(0),m_app_owner(false) 48 {} 49 session& operator=(const session&){return *this;} 50 public: 51 std::ostream& out() const {return m_out;} 52 bool is_valid() {return m_app_context && m_app_widget?true:false;} 53 bool steer() { 54 if(!m_app_context) return false; 55 while(true) { 56 XEvent event; 57 ::XtAppNextEvent(m_app_context,&event); 58 ::XtDispatchEvent(&event); 59 //if(m_exit) break; 60 } 61 return true; 62 } 63 bool sync() { 64 //if(!m_app_widget) return false; 65 //Display* display = XtDisplay(m_app_widget); 66 //::XSync(display,False); 67 if(!m_app_context) return false; 68 while(true) { 69 XtInputMask input = ::XtAppPending(m_app_context); 70 if(input==0) break; 71 XEvent event; 72 ::XtAppNextEvent(m_app_context,&event); 73 ::XtDispatchEvent(&event); 74 } 75 return true; 76 } 77 public: 78 Widget get_app_widget() {return m_app_widget;} 79 protected: 80 std::ostream& m_out; 81 XtAppContext m_app_context; 82 Widget m_app_widget; 83 bool m_app_owner; 84 }; 85 86 }} 87 88 89 #endif