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