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;