Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: 366d4ddc by lovetox at 2021-02-27T16:49:55+01:00 Destroy roster correctly - - - - - 4 changed files: - gajim/common/helpers.py - gajim/groupchat_control.py - gajim/gtk/groupchat_roster.py - gajim/gtk/util.py Changes: ===================================== gajim/common/helpers.py ===================================== @@ -1286,11 +1286,11 @@ def disconnect_signals(self): def disconnect(self, object_): for signal_name, qualifiers in self._callbacks.items(): - for handlers in qualifiers.values(): + for qualifier, handlers in qualifiers.items(): for handler in list(handlers): func = handler() if func is None or func.__self__ == object_: - self._callbacks[signal_name][qualifiers].remove(handler) + self._callbacks[signal_name][qualifier].remove(handler) def connect(self, signal_name, func, qualifiers=None): if inspect.ismethod(func): ===================================== gajim/groupchat_control.py ===================================== @@ -144,9 +144,6 @@ def __init__(self, parent_win, jid, muc_data, acct): self.roster.connect('row-activated', self._on_roster_row_activated) if parent_win is not None: - # On AutoJoin with minimize Groupchats are created without parent - # Tooltip Window and Actions have to be created with parent - self.roster.enable_tooltips() self.add_actions() GLib.idle_add(self.update_actions) self.scale_factor = parent_win.window.get_scale_factor() ===================================== gajim/gtk/groupchat_roster.py ===================================== @@ -74,7 +74,6 @@ def __init__(self, account, room_jid, control): self._control = control self._control_id = control.control_id self._show_roles = True - self._handler_ids = {} self._tooltip = GCTooltip() self._group_chat_contact = control.contact self._group_chat_contact.connect('user-avatar-update', @@ -102,6 +101,8 @@ def __init__(self, account, room_jid, control): self._roster = self._ui.roster_treeview self._roster.set_search_equal_func(self._search_func) + self._roster.set_has_tooltip(True) + self._roster.connect('query-tooltip', self._query_tooltip) self._ui.contact_column.set_fixed_width( app.settings.get('groupchat_roster_width')) @@ -125,14 +126,6 @@ def set_model(self): def set_show_roles(self, enabled): self._show_roles = enabled - def enable_tooltips(self): - if self._roster.get_tooltip_window(): - return - - self._roster.set_has_tooltip(True) - id_ = self._roster.connect('query-tooltip', self._query_tooltip) - self._handler_ids[id_] = self._roster - def _query_tooltip(self, widget, x_pos, y_pos, _keyboard_mode, tooltip): try: row = self._roster.get_path_at_pos(x_pos, y_pos)[0] @@ -479,10 +472,7 @@ def clear(self): self._store.clear() def _on_destroy(self, _roster): - for id_ in list(self._handler_ids.keys()): - if self._handler_ids[id_].handler_is_connected(id_): - self._handler_ids[id_].disconnect(id_) - del self._handler_ids[id_] + self._group_chat_contact.disconnect(self) self._contact_refs = {} self._group_refs = {} @@ -490,6 +480,8 @@ def _on_destroy(self, _roster): self._roster.set_model(None) self._roster = None self._store.clear() + # Store keeps a ref on the object if we dont unset the sort func + self._store.set_sort_func(Column.TEXT, print) self._store = None self._tooltip.destroy() self._tooltip = None ===================================== gajim/gtk/util.py ===================================== @@ -20,6 +20,7 @@ from typing import Tuple from typing import Optional +import gc import sys import weakref import logging @@ -855,7 +856,28 @@ def _destroy(*args): def check_finalize(obj, name): - weakref.finalize(obj, print, f'{name} has been finalized') + finalizer = weakref.finalize(obj, log.info, f'{name} has been finalized') + + def is_finalizer_ref(ref): + try: + return isinstance(ref[2][0], str) + except Exception: + return False + + def check_finalized(): + tup = finalizer.peek() + if tup is None: + return + + gc.collect() + log.warning('%s not finalized', name) + log.warning('References:') + for ref in gc.get_referrers(tup[0]): + if is_finalizer_ref(ref): + continue + log.warning(ref) + + GLib.timeout_add_seconds(2, check_finalized) def _connect_destroy(sender, func, detailed_signal, handler, *args, **kwargs): View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/366d4ddcfed7efad3854455e13e37a4e02c9fa6d -- View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/366d4ddcfed7efad3854455e13e37a4e02c9fa6d You're receiving this email because of your account on dev.gajim.org.
_______________________________________________ Commits mailing list Commits@gajim.org https://lists.gajim.org/cgi-bin/listinfo/commits