diff --git a/main/src/ui/add_conversation/chat/roster_list.vala b/main/src/ui/add_conversation/chat/roster_list.vala index 3c324cf6..f4b42cc4 100644 --- a/main/src/ui/add_conversation/chat/roster_list.vala +++ b/main/src/ui/add_conversation/chat/roster_list.vala @@ -11,6 +11,7 @@ protected class RosterList : FilterableList { public signal void conversation_selected(Conversation? conversation); private StreamInteractor stream_interactor; private Gee.List accounts; + private ulong[] handler_ids = new ulong[0]; private HashMap> rows = new HashMap>(Account.hash_func, Account.equals_func); @@ -22,13 +23,18 @@ protected class RosterList : FilterableList { set_header_func(header); set_sort_func(sort); - stream_interactor.get_module(RosterManager.IDENTITY).removed_roster_item.connect( (account, jid, roster_item) => { - if (accounts.contains(account)) + handler_ids += stream_interactor.get_module(RosterManager.IDENTITY).removed_roster_item.connect( (account, jid, roster_item) => { + if (accounts.contains(account)) { Idle.add(() => { on_removed_roster_item(account, jid, roster_item); return false;}); + } }); - stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect( (account, jid, roster_item) => { - if (accounts.contains(account)) + handler_ids += stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect( (account, jid, roster_item) => { + if (accounts.contains(account)) { Idle.add(() => { on_updated_roster_item(account, jid, roster_item); return false;}); + } + }); + destroy.connect(() => { + foreach (ulong handler_id in handler_ids) stream_interactor.get_module(RosterManager.IDENTITY).disconnect(handler_id); }); foreach (Account a in accounts) fetch_roster_items(a); @@ -85,4 +91,4 @@ protected class RosterList : FilterableList { } } -} \ No newline at end of file +}