X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSession%2FSALOME_Session_Server.cxx;h=4d34b5e5822f4c08160cc49bb2b8ca8d13929900;hb=79bb613bc02da5864a9c4199f78c078cc77e78e2;hp=ef6412c691c4729539a922c49c7b821200d41949;hpb=bb8609caf7881d966fbb88dec0a7822736da93f5;p=modules%2Fgui.git diff --git a/src/Session/SALOME_Session_Server.cxx b/src/Session/SALOME_Session_Server.cxx index ef6412c69..4d34b5e58 100755 --- a/src/Session/SALOME_Session_Server.cxx +++ b/src/Session/SALOME_Session_Server.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -94,8 +94,6 @@ * - get session state */ -PyObject* salome_shared_modules_module = 0; - void MessageOutput( QtMsgType type, const char* msg ) { switch ( type ) @@ -112,29 +110,6 @@ void MessageOutput( QtMsgType type, const char* msg ) } } -/* XPM */ -static const char* pixmap_not_found_xpm[] = { -"16 16 3 1", -" c None", -". c #000000", -"+ c #A80000", -" ", -" ", -" . . ", -" .+. .+. ", -" .+++. .+++. ", -" .+++.+++. ", -" .+++++. ", -" .+++. ", -" .+++++. ", -" .+++.+++. ", -" .+++. .+++. ", -" .+. .+. ", -" . . ", -" ", -" ", -" "}; - QString salomeVersion() { return GUI_VERSION_STR; @@ -147,7 +122,6 @@ public: { setCurrentFormat( "xml" ); setOption( "translators", QString( "%P_msg_%L.qm|%P_icons.qm|%P_images.qm" ) ); - setDefaultPixmap( QPixmap( pixmap_not_found_xpm ) ); } static void initResourceMgr() { @@ -230,36 +204,10 @@ protected: // for backward compatibility we also check files prepended with "." with lower priority QRegExp exp( QString( "\\.?%1rc\\.([a-zA-Z0-9.]+)" ).arg( myExtAppName ) ); #endif - QRegExp vers_exp( "^([0-9]+)([A-Z]|RC)?([0-9]*)", Qt::CaseInsensitive ); - QString fname = QFileInfo( _fname ).fileName(); - if( exp.exactMatch( fname ) ) { - QStringList vers = exp.cap( 1 ).split( ".", QString::SkipEmptyParts ); - int major=0, minor=0; - int release = 0, dev1 = 0, dev2 = 0; - if ( vers.count() > 0 ) major = vers[0].toInt(); - if ( vers.count() > 1 ) minor = vers[1].toInt(); - if ( vers.count() > 2 ) { - if ( vers_exp.indexIn( vers[2] ) != -1 ) { - release = vers_exp.cap( 1 ).toInt(); - QString tag = vers_exp.cap( 2 ).toLower(); - if ( !tag.isEmpty() ) { - if ( tag == "rc" ) // release candidate - dev1 = 49; // 'rc'=49 - else // a, b, c, ... - dev1 = (int)( tag[ 0 ].toLatin1() ) - (int)( QChar('a').toLatin1() ) + 1; // 'a'=1, 'b'=2, ..., 'z'=26 - } - if ( !vers_exp.cap( 3 ).isEmpty() ) - dev2 = vers_exp.cap( 3 ).toInt(); - } - } - - int dev = dev1*100+dev2; - id = major; - id*=100; id+=minor; - id*=100; id+=release; - id*=10000; - if ( dev > 0 ) id-=dev; + if ( exp.exactMatch( fname ) ) { + long fid = Qtx::versionToId( exp.cap( 1 ) ); + if ( fid > 0 ) id = fid; } } return id; @@ -279,7 +227,7 @@ public: SALOME_Session() : SUIT_Session() {} virtual ~SALOME_Session() {} -protected: +public: virtual SUIT_ResourceMgr* createResourceMgr( const QString& appName ) const { SALOME_ResourceMgr::initResourceMgr(); @@ -311,19 +259,6 @@ public: virtual bool notify( QObject* receiver, QEvent* e ) { -#if OCC_VERSION_LARGE < 0x06010100 - // Disable GUI user actions while python command is executed - if (SUIT_Session::IsPythonExecuted()) { - // Disable mouse and keyboard events - QEvent::Type aType = e->type(); - if (aType == QEvent::MouseButtonPress || aType == QEvent::MouseButtonRelease || - aType == QEvent::MouseButtonDblClick || aType == QEvent::MouseMove || - aType == QEvent::Wheel || aType == QEvent::ContextMenu || - aType == QEvent::KeyPress || aType == QEvent::KeyRelease || - aType == QEvent::Accel || aType == QEvent::AccelOverride) - return false; - } -#endif #ifdef ENABLE_TESTRECORDER return myHandler ? myHandler->handle( receiver, e ) : @@ -403,12 +338,32 @@ int main( int argc, char **argv ) { // Install Qt debug messages handler qInstallMsgHandler( MessageOutput ); + + //Set a "native" graphic system in case if application runs on the remote host + QString remote(getenv("REMOTEHOST")); + QString client(getenv("SSH_CLIENT")); + if(remote.length() > 0 || client.length() > 0 ) { + QApplication::setGraphicsSystem(QLatin1String("native")); + } // add $QTDIR/plugins to the pluins search path for image plugins QString qtdir( ::getenv( "QTDIR" ) ); if ( !qtdir.isEmpty() ) QApplication::addLibraryPath( QDir( qtdir ).absoluteFilePath( "plugins" ) ); + { + SALOME_Session s; + QApplication::setApplicationName( "salome" ); + SUIT_ResourceMgr* resMgr = s.createResourceMgr( "SalomeApp" ); + bool isCloc = resMgr->booleanValue( "language", "locale", true ); + if ( isCloc ) { + QLocale::setDefault( QLocale::c() ); + } + else { + QLocale::setDefault( QLocale::system() ); + } + } + // Create Qt application instance; // this should be done the very first! SALOME_QApplication _qappl( argc, argv ); @@ -468,14 +423,6 @@ int main( int argc, char **argv ) int _argc = 1; char* _argv[] = {(char*)""}; KERNEL_PYTHON::init_python( _argc,_argv ); - PyEval_RestoreThread( KERNEL_PYTHON::_gtstate ); - if ( !KERNEL_PYTHON::salome_shared_modules_module ) // import only once - KERNEL_PYTHON::salome_shared_modules_module = PyImport_ImportModule( "salome_shared_modules" ); - if ( !KERNEL_PYTHON::salome_shared_modules_module ) { - INFOS( "salome_shared_modules_module == NULL" ); - PyErr_Print(); - } - PyEval_ReleaseThread( KERNEL_PYTHON::_gtstate ); // ...create ORB, get RootPOA object, NamingService, etc. ORB_INIT &init = *SINGLETON_::Instance(); @@ -624,28 +571,28 @@ int main( int argc, char **argv ) if ( splash ) splash->finish( aGUIApp->desktop() ); - + result = _qappl.exec(); splash = 0; - + if ( result == SUIT_Session::NORMAL ) { - // desktop is explicitly closed by user from GUI - // exit flags says if it's necessary to shutdown all servers - // all session server only + // desktop is explicitly closed by user from GUI + // exit flags says if it's necessary to shutdown all servers + // all session server only shutdownAll = aGUISession->exitFlags(); - } - else { - // desktop might be closed from: - // - StopSesion() /temporarily/ or - // - Shutdown() /permanently/ - stat = session->GetStatSession(); - shutdownSession = stat.state == SALOME::shutdown; - } - if ( shutdownAll || shutdownSession ) { - _SessionMutex.lock(); // lock mutex before leaving loop - it will be unlocked later - break; - } + } + else { + // desktop might be closed from: + // - StopSesion() /temporarily/ or + // - Shutdown() /permanently/ + stat = session->GetStatSession(); + shutdownSession = stat.state == SALOME::shutdown; + } + if ( shutdownAll || shutdownSession ) { + _SessionMutex.lock(); // lock mutex before leaving loop - it will be unlocked later + break; + } } delete aGUISession; @@ -694,12 +641,23 @@ int main( int argc, char **argv ) abort(); //abort program to avoid deadlock in destructors or atexit when shutdown has been interrupted } - PyGILState_Ensure(); - //Destroy orb from python (for chasing memory leaks) + //Destroy orb from python (for chasing memory leaks) //PyRun_SimpleString("from omniORB import CORBA"); //PyRun_SimpleString("orb=CORBA.ORB_init([''], CORBA.ORB_ID)"); //PyRun_SimpleString("orb.destroy()"); - Py_Finalize(); + + // Destroy the ORB: + MESSAGE("Explicitely destroying the ORB (hoping to kill omniORB threads ...)"); + ORB_INIT * init = SINGLETON_::Instance(); + if (init) + init->explicit_destroy(); + + // After ORB destruction + if(Py_IsInitialized()) + { + PyGILState_Ensure(); + Py_Finalize(); + } if ( shutdownAll ) killOmniNames();