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

Reply via email to