Deallocate call notification dialog objects when closed
authorClaudio Cambra <claudio.cambra@gmail.com>
Wed, 14 Sep 2022 10:25:56 +0000 (12:25 +0200)
committerClaudio Cambra <claudio.cambra@gmail.com>
Wed, 14 Sep 2022 10:34:47 +0000 (12:34 +0200)
Signed-off-by: Claudio Cambra <claudio.cambra@gmail.com>
src/gui/systray.cpp
src/gui/systray.h
src/gui/tray/CallNotificationDialog.qml

index 6f6189dd17c65f89bee2dc8d1de66d0c5ee5ad17..238406474058ebe88d05d8cb9db70d85ac930238 100644 (file)
@@ -205,6 +205,12 @@ void Systray::setupContextMenu()
     });
 }
 
+void Systray::destroyDialog(QQuickWindow *dialog) const
+{
+    dialog->destroy();
+    dialog->deleteLater();
+}
+
 void Systray::createCallDialog(const Activity &callNotification, const AccountStatePtr accountState)
 {
     qCDebug(lcSystray) << "Starting a new call dialog for notification with id: " << callNotification._id << "with text: " << callNotification._subject;
@@ -244,6 +250,8 @@ void Systray::createCallDialog(const Activity &callNotification, const AccountSt
             return;
         }
 
+        // This call dialog gets deallocated on close conditions
+        // by a call from the QML side to the destroyDialog slot
         callDialog->createWithInitialProperties(initialProperties);
         _callsAlreadyNotified.insert(callNotification._id);
     }
index 945f5999be491e01361693dd19806f640b104180..2b1db4ce2ad219f9743b20fc24697d0580991068 100644 (file)
@@ -118,6 +118,10 @@ public slots:
     void positionWindowAtScreenCenter(QQuickWindow *window) const;
     void positionNotificationWindow(QQuickWindow *window) const;
 
+    // Do not use this for QQuickWindow components managed by the QML engine,
+    // only for those managed by the C++ engine
+    void destroyDialog(QQuickWindow *window) const;
+
     void showWindow(WindowPosition position = WindowPosition::Default);
     void hideWindow();
 
index 23d9e2bc8659e396c0e06d3b20cc537cc025863a..37929e824f3b452a915d35b33cf3113f95263e27 100644 (file)
@@ -48,6 +48,8 @@ Window {
         callStateChecker.checking = false;
         ringSound.stop();
         root.close();
+
+        Systray.destroyDialog(root);
     }
 
     width: root.windowWidth