Salome HOME
Copyright update 2022
[modules/gui.git] / src / SALOME_PYQT / SALOME_PYQT_GUI / SALOME_PYQT_Module.cxx
index 45f827b5033d966f53073e0bfc62c534502a3bed..55cad0f035526aa009653923a5f52b070d9475d2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2022  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
@@ -29,6 +29,8 @@
 #include <SALOME_LifeCycleCORBA.hxx>
 #include <Container_init_python.hxx>
 
+#include <QCoreApplication>
+
 //
 // NB: Python requests.
 // General rule for Python requests created by Python-based GUI modules
@@ -43,7 +45,7 @@
 // and to get C API from sip : sipBuildResult for example
 //
 
-#define INIT_FUNCTION initSalomePyQtGUILight
+#define INIT_FUNCTION PyInit_SalomePyQtGUILight
 #if defined(SIP_STATIC_MODULE)
 extern "C" void INIT_FUNCTION();
 #else
@@ -64,14 +66,13 @@ PyMODINIT_FUNC INIT_FUNCTION();
 extern "C" {
   SALOME_PYQT_EXPORT CAM_Module* createModule()
   {
-    static bool alreadyInitialized = false;
+    QCoreApplication* app = QCoreApplication::instance();
+    bool alreadyInitialized = app && app->property( "salome_pyqt_gui_light_initialized" ).toBool();
 
     if ( !alreadyInitialized ) {
-      // call only once (see comment above) !
-      PyEval_RestoreThread( KERNEL_PYTHON::_gtstate);
+      PyLockWrapper lck; // GIL acquisition
       INIT_FUNCTION();
-      PyEval_ReleaseThread( KERNEL_PYTHON::_gtstate);
-      alreadyInitialized = !alreadyInitialized;
+      if ( app ) app->setProperty( "salome_pyqt_gui_light_initialized", true );
     }
 
     return new SALOME_PYQT_Module();
@@ -107,24 +108,20 @@ SALOME_PYQT_Module::~SALOME_PYQT_Module()
   This function tries to get engine IOR from the Python module using engineIOR() function.
   That function can load module engine using appropriate container if required.
   If this function is not available in Python module, the default implementation
-  is used which loads engine to the default FactoryServerPy container.
+  is used which loads engine to the default FactoryServer container.
 */
 QString SALOME_PYQT_Module::engineIOR() const
 {
-  // call helper to get IOR from Python module
-  static QString ior;
+  // first call helper to get IOR from Python module
+  QString ior = myHelper->engineIOR();
 
+  // if IOR is still not specified, try default implementation
+  // which loads engine to the default FactoryServer container.
   if ( ior.isEmpty() ) {
-    // first call helper to get IOR from Python module
-    ior = myHelper->engineIOR();
-  }
-  if ( ior.isEmpty() ) {
-    // if IOR is still not specified, try default implementation
-    // which loads engine to the default FactoryServerPy container.
     Engines::EngineComponent_var comp;
     // temporary solution
     try {
-      comp = getApp()->lcc()->FindOrLoad_Component( "FactoryServerPy", name().toLatin1() );
+      comp = getApp()->lcc()->FindOrLoad_Component( "FactoryServer", name().toLatin1() );
     }
     catch (CORBA::Exception&) {
     }
@@ -245,6 +242,18 @@ void SALOME_PYQT_Module::preferencesChanged( const QString& section, const QStri
   myHelper->preferencesChanged( section, parameter );
 }
 
+/*!
+  \brief Called when study is closed
+  \param study study being closed
+  \sa PyModuleHelper::studyClosed()
+*/
+void SALOME_PYQT_Module::studyClosed( SUIT_Study* study )
+{
+  // call helper
+  myHelper->modelClosed( study );
+  SalomeApp_Module::studyClosed( study );
+}
+
 /*!
   \brief Test if object \a what can be dragged by the user.
   \param what data object being tested