diff --git a/linphone-app/assets/languages/fr_FR.ts b/linphone-app/assets/languages/fr_FR.ts index 047e34322..dbc1837a3 100644 --- a/linphone-app/assets/languages/fr_FR.ts +++ b/linphone-app/assets/languages/fr_FR.ts @@ -159,7 +159,7 @@ usernameStatusInvalidCharacters - Caractères invalides détectés (regex : `%1`). + Caractères invalides détectés (regex : `%1`). usernameStatusInvalid @@ -175,7 +175,7 @@ passwordStatusInvalidCharacters - Caractères invalides détectés (regex : `%1`). + Caractères invalides détectés (regex : `%1`). passwordStatusMissingCharacters @@ -1883,7 +1883,7 @@ Cliquez ici : <a href="%1">%1</a> serverTooltip - Serveur LDAP. ie : ldap:// pour un serveur local ou ldap://ldap.example.org/ + Serveur LDAP. ie : ldap:// pour un serveur local ou ldap://ldap.example.org/ bindDNLabel diff --git a/linphone-app/src/app/App.cpp b/linphone-app/src/app/App.cpp index ad266a6c8..dda1bf05b 100644 --- a/linphone-app/src/app/App.cpp +++ b/linphone-app/src/app/App.cpp @@ -697,6 +697,10 @@ void App::registerSharedToolTypes () { // ----------------------------------------------------------------------------- void App::setTrayIcon () { + if(mSystemTrayIcon){ + mSystemTrayIcon->hide(); + delete mSystemTrayIcon; + } QQuickWindow *root = getMainWindow(); QSystemTrayIcon *systemTrayIcon = new QSystemTrayIcon(mEngine); @@ -750,6 +754,7 @@ void App::setTrayIcon () { systemTrayIcon->setIcon(QIcon(Constants::WindowIconPath)); systemTrayIcon->setToolTip(APPLICATION_NAME); systemTrayIcon->show(); + mSystemTrayIcon = systemTrayIcon; if(!QSystemTrayIcon::isSystemTrayAvailable()) qInfo() << "System tray is not available"; diff --git a/linphone-app/src/components/core/CoreManager.cpp b/linphone-app/src/components/core/CoreManager.cpp index 24ca66518..0e08796b6 100644 --- a/linphone-app/src/components/core/CoreManager.cpp +++ b/linphone-app/src/components/core/CoreManager.cpp @@ -72,7 +72,6 @@ CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject::connect(coreHandlers, &CoreHandlers::coreStarting, this, &CoreManager::startIterate, Qt::QueuedConnection); QObject::connect(coreHandlers, &CoreHandlers::setLastRemoteProvisioningState, this, &CoreManager::setLastRemoteProvisioningState); QObject::connect(coreHandlers, &CoreHandlers::coreStarted, this, &CoreManager::initCoreManager, Qt::QueuedConnection); - QObject::connect(coreHandlers, &CoreHandlers::coreStopped, this, &CoreManager::stopIterate, Qt::QueuedConnection); QObject::connect(coreHandlers, &CoreHandlers::logsUploadStateChanged, this, &CoreManager::handleLogsUploadStateChanged); QTimer::singleShot(10, [this, configPath](){// Delay the creation in order to have the CoreManager instance set before createLinphoneCore(configPath); @@ -134,14 +133,12 @@ void CoreManager::init (QObject *parent, const QString &configPath) { void CoreManager::uninit () { if (mInstance) { connect(mInstance, &QObject::destroyed, []()mutable{ - mInstance = nullptr; qInfo() << "Core is correctly destroyed"; + mInstance = nullptr; }); QObject::connect(mInstance->getHandlers().get(), &CoreHandlers::coreStopped, mInstance, &QObject::deleteLater, Qt::QueuedConnection); // Delete data only when the core is Off + mInstance->stopIterate(); - mInstance->lockVideoRender();// Stop do iterations. We have to protect GUI. - mInstance->mCore->stop(); - mInstance->unlockVideoRender(); qInfo() << "Waiting for completion of stopping core"; QTest::qWaitFor([&]() {return mInstance == nullptr;},10000); if( mInstance){ @@ -348,17 +345,28 @@ void CoreManager::startIterate(){ } void CoreManager::stopIterate(){ - qInfo() << QStringLiteral("Stop iterate"); - mCbsTimer->stop(); - mCbsTimer->deleteLater();// allow the timer to continue its stuff - mCbsTimer = nullptr; + qInfo() << QStringLiteral("Stopping iterate"); + mCbsTimerStop = true; } void CoreManager::iterate () { - lockVideoRender(); - if(mCore) - mCore->iterate(); - unlockVideoRender(); + if( mCbsTimerStop){ + qInfo() << QStringLiteral("Stop iterate"); + mCbsTimerStop = false; + mCbsTimer->stop(); + mCbsTimer->deleteLater();// allow the timer to continue its stuff + mCbsTimer = nullptr; + qInfo() << "Stopping core"; + mCore->stop(); + }else{ + lockVideoRender(); + if(mCore){ + auto state = mCore->getGlobalState(); + if( state != linphone::GlobalState::Shutdown && state != linphone::GlobalState::Off) + mCore->iterate(); + } + unlockVideoRender(); + } } // ----------------------------------------------------------------------------- diff --git a/linphone-app/src/components/core/CoreManager.hpp b/linphone-app/src/components/core/CoreManager.hpp index df73546ae..8dfe0b41a 100644 --- a/linphone-app/src/components/core/CoreManager.hpp +++ b/linphone-app/src/components/core/CoreManager.hpp @@ -229,6 +229,7 @@ private: LdapListModel *mLdapListModel = nullptr; QTimer *mCbsTimer = nullptr; + bool mCbsTimerStop = false; QMutex mMutexVideoRender;