From ecdb5b2590cb9ced03e48d203994dc0029375f47 Mon Sep 17 00:00:00 2001
From: Nico Alt <nicoalt@posteo.org>
Date: Sun, 12 Apr 2020 13:00:01 +0000
Subject: [PATCH] Disconnect from socket listener signal when closing private
 chat

Fixes https://code.briarproject.org/briar/briar-gtk/issues/44
---
 briar-gtk/briar_gtk/containers/main_window.py |  4 ++--
 .../briar_gtk/containers/private_chat.py      | 20 ++++++++++++++++---
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/briar-gtk/briar_gtk/containers/main_window.py b/briar-gtk/briar_gtk/containers/main_window.py
index f471d4e..f94d18d 100644
--- a/briar-gtk/briar_gtk/containers/main_window.py
+++ b/briar-gtk/briar_gtk/containers/main_window.py
@@ -125,7 +125,7 @@ class MainWindowContainer(Container):
     def _clear_history_container(self):
         children = self.history_container.get_children()
         for child in children:
-            self.history_container.remove(child)
+            child.destroy()
 
     def _setup_view(self):
         self._add_from_resource(self.MENU_UI)
@@ -174,4 +174,4 @@ class MainWindowContainer(Container):
     def _clear_contact_list(self):
         contacts_list_box_children = self.contacts_list_box.get_children()
         for child in contacts_list_box_children:
-            self.contacts_list_box.remove(child)
+            child.destroy()
diff --git a/briar-gtk/briar_gtk/containers/private_chat.py b/briar-gtk/briar_gtk/containers/private_chat.py
index a2dbcb6..cac2453 100644
--- a/briar-gtk/briar_gtk/containers/private_chat.py
+++ b/briar-gtk/briar_gtk/containers/private_chat.py
@@ -23,6 +23,7 @@ class PrivateChatContainer(Container):
     def __init__(self, contact_name, contact_id):
         super().__init__()
 
+        self._signals = list()
         self._contact_name = contact_name
         self._contact_id = contact_id
 
@@ -70,6 +71,18 @@ class PrivateChatContainer(Container):
         self.add(messages_scroll)
 
         self.builder.connect_signals(self)
+        self._setup_destroy_listener()
+
+    def _setup_destroy_listener(self):
+        self.connect("destroy", self._on_destroy)
+
+    # pylint: disable=unused-argument
+    def _on_destroy(self, widget):
+        self._disconnect_signals()
+
+    def _disconnect_signals(self):
+        for signal in self._signals:
+            APP().api.socket_listener.disconnect(signal)
 
     def _load_content(self):
         private_chat = PrivateChat(APP().api, self._contact_id)
@@ -79,9 +92,10 @@ class PrivateChatContainer(Container):
             # Abusing idle_add function here because otherwise the message box
             # is too small and scrolling cuts out messages
             GLib.idle_add(self._add_message, message)
-        # TODO: Disconnect if no more needed
-        APP().api.socket_listener.connect("ConversationMessageReceivedEvent",
-                                          self._add_message_async)
+        socket_listener = APP().api.socket_listener
+        signal_id = socket_listener.connect("ConversationMessageReceivedEvent",
+                                            self._add_message_async)
+        self._signals.append(signal_id)
 
     def _add_message(self, message):
         message_widget = PrivateMessageWidget(self._contact_name, message)
-- 
GitLab