diff --git a/linphone-desktop/assets/languages/en.ts b/linphone-desktop/assets/languages/en.ts
index 231317ab2..e3aa1a4ce 100644
--- a/linphone-desktop/assets/languages/en.ts
+++ b/linphone-desktop/assets/languages/en.ts
@@ -219,6 +219,10 @@
callsTitle
Calls
+
+ acceptClosingDescription
+ Are you sure you want to terminate all calls?
+
Chat
diff --git a/linphone-desktop/assets/languages/fr.ts b/linphone-desktop/assets/languages/fr.ts
index deb9f1af2..074e4ba8b 100644
--- a/linphone-desktop/assets/languages/fr.ts
+++ b/linphone-desktop/assets/languages/fr.ts
@@ -219,6 +219,10 @@
callsTitle
Appels
+
+ acceptClosingDescription
+ Voulez-vous vraiment quitter tous vos appels en cours ?
+
Chat
diff --git a/linphone-desktop/resources.qrc b/linphone-desktop/resources.qrc
index 2b4a968de..dab3d93d3 100644
--- a/linphone-desktop/resources.qrc
+++ b/linphone-desktop/resources.qrc
@@ -311,6 +311,7 @@
ui/scripts/Utils/uri-tools.js
ui/scripts/Utils/utils.js
ui/views/App/Calls/AbstractStartingCall.qml
+ ui/views/App/Calls/CallsWindow.js
ui/views/App/Calls/CallsWindow.qml
ui/views/App/Calls/IncallFullscreenWindow.qml
ui/views/App/Calls/Incall.js
diff --git a/linphone-desktop/src/components/calls/CallsListModel.cpp b/linphone-desktop/src/components/calls/CallsListModel.cpp
index 3e90d16cc..f6ba884b2 100644
--- a/linphone-desktop/src/components/calls/CallsListModel.cpp
+++ b/linphone-desktop/src/components/calls/CallsListModel.cpp
@@ -138,6 +138,16 @@ void CallsListModel::launchVideoCall (const QString &sip_uri) const {
// -----------------------------------------------------------------------------
+int CallsListModel::getRunningCallsNumber () const {
+ return CoreManager::getInstance()->getCore()->getCallsNb();
+}
+
+void CallsListModel::terminateAllCalls () const {
+ CoreManager::getInstance()->getCore()->terminateAllCalls();
+}
+
+// -----------------------------------------------------------------------------
+
bool CallsListModel::removeRow (int row, const QModelIndex &parent) {
return removeRows(row, 1, parent);
}
diff --git a/linphone-desktop/src/components/calls/CallsListModel.hpp b/linphone-desktop/src/components/calls/CallsListModel.hpp
index d5decabb3..e9126aabb 100644
--- a/linphone-desktop/src/components/calls/CallsListModel.hpp
+++ b/linphone-desktop/src/components/calls/CallsListModel.hpp
@@ -48,6 +48,10 @@ public:
Q_INVOKABLE void launchAudioCall (const QString &sip_uri) const;
Q_INVOKABLE void launchVideoCall (const QString &sip_uri) const;
+ Q_INVOKABLE int getRunningCallsNumber () const;
+
+ Q_INVOKABLE void terminateAllCalls () const;
+
signals:
void callRunning (int index, CallModel *call);
diff --git a/linphone-desktop/ui/views/App/Calls/CallsWindow.js b/linphone-desktop/ui/views/App/Calls/CallsWindow.js
new file mode 100644
index 000000000..7c63f9e67
--- /dev/null
+++ b/linphone-desktop/ui/views/App/Calls/CallsWindow.js
@@ -0,0 +1,30 @@
+// =============================================================================
+// `CallsWindow.qml` Logic.
+// =============================================================================
+
+.import Linphone 1.0 as Linphone
+
+.import 'qrc:/ui/scripts/Utils/utils.js' as Utils
+
+// =============================================================================
+
+var forceClose = false
+
+function handleClosing (close) {
+ var callsList = Linphone.CallsListModel
+ if (forceClose || callsList.getRunningCallsNumber() === 0) {
+ callsList.terminateAllCalls()
+ return
+ }
+
+ window.attachVirtualWindow(Utils.buildDialogUri('ConfirmDialog'), {
+ descriptionText: qsTr('acceptClosingDescription'),
+ }, function (status) {
+ if (status) {
+ forceClose = true
+ window.close()
+ }
+ })
+
+ close.accepted = false
+}
diff --git a/linphone-desktop/ui/views/App/Calls/CallsWindow.qml b/linphone-desktop/ui/views/App/Calls/CallsWindow.qml
index b08e01a4c..15ce203d7 100644
--- a/linphone-desktop/ui/views/App/Calls/CallsWindow.qml
+++ b/linphone-desktop/ui/views/App/Calls/CallsWindow.qml
@@ -8,6 +8,8 @@ import Linphone 1.0
import App.Styles 1.0
+import 'CallsWindow.js' as Logic
+
// =============================================================================
Window {
@@ -36,6 +38,12 @@ Window {
minimumWidth: CallsWindowStyle.minimumWidth
title: qsTr('callsTitle')
+ // ---------------------------------------------------------------------------
+
+ onClosing: Logic.handleClosing(close)
+
+ // ---------------------------------------------------------------------------
+
Paned {
anchors.fill: parent
defaultChildAWidth: CallsWindowStyle.callsList.defaultWidth