diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-01-09 20:21:06 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-01-09 20:21:06 (GMT) |
commit | 83353f3c72684f493063246cb7b272d7eeca029f (patch) | |
tree | 65ced586e3a06eed0c3f01a94efd9b5a91d16b91 /shell | |
parent | 86b943b2445f42ee42ee07d3258abe695739e65e (diff) |
#5532: Fix memory leak when a buddy disappears.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/view/BuddyMenu.py | 63 | ||||
-rw-r--r-- | shell/view/home/MeshBox.py | 4 |
2 files changed, 22 insertions, 45 deletions
diff --git a/shell/view/BuddyMenu.py b/shell/view/BuddyMenu.py index a31f623..7f2501d 100644 --- a/shell/view/BuddyMenu.py +++ b/shell/view/BuddyMenu.py @@ -16,7 +16,6 @@ from gettext import gettext as _ import logging -#import gtk import gobject import hippo @@ -31,55 +30,31 @@ class BuddyMenu(Palette): self._shell = shell Palette.__init__(self, buddy.get_nick()) - -# FIXME: re-enable when buddy avatars are re-enabled -# pixbuf = None -# try: -# pixbuf = self._get_buddy_icon_pixbuf() -# except gobject.GError, e: -# pass -# if pixbuf: -# scaled_pixbuf = pixbuf.scale_simple(units.grid_to_pixels(1), -# units.grid_to_pixels(1), -# gtk.gdk.INTERP_BILINEAR) -# del pixbuf -# image = gtk.Image() -# image.set_from_pixbuf(scaled_pixbuf) -# self.set_content(image) -# image.show() + self._active_activity_changed_hid = None + self.connect('destroy', self.__destroy_cb) self._buddy.connect('icon-changed', self._buddy_icon_changed_cb) self._buddy.connect('nick-changed', self._buddy_nick_changed_cb) - owner = shell.get_model().get_owner() + owner = self._get_shell_model().get_owner() if buddy.get_nick() != owner.get_nick(): self._add_items() -# FIXME: re-enable when buddy avatars are re-enabled -# def _get_buddy_icon_pixbuf(self): -# buddy_object = self._buddy.get_buddy() -# if not buddy_object: -# return None -# -# icon_data = buddy_object.props.icon -# if not icon_data: -# return None -# pbl = gtk.gdk.PixbufLoader() -# pbl.write(icon_data) -# pixbuf = None -# try: -# pbl.close() -# pixbuf = pbl.get_pixbuf() -# except gobject.GError: -# pass -# del pbl -# return pixbuf + def _get_shell_model(self): + return self._shell.get_model() + + def _get_home_model(self): + return self._get_shell_model().get_home() + + def __destroy_cb(self, menu): + if self._active_activity_changed_hid is not None: + home_model = self._get_home_model() + home_model.disconnect(self._active_activity_changed_hid) def _add_items(self): - shell_model = self._shell.get_model() pservice = presenceservice.get_instance() - friends = shell_model.get_friends() + friends = self._get_shell_model().get_friends() if friends.has_buddy(self._buddy): menu_item = MenuItem(_('Remove friend'), 'list-remove') menu_item.connect('activate', self._remove_friend_cb) @@ -94,9 +69,9 @@ class BuddyMenu(Palette): self._invite_menu.connect('activate', self._invite_friend_cb) self.menu.append(self._invite_menu) - home_model = shell_model.get_home() - home_model.connect('active-activity-changed', - self._cur_activity_changed_cb) + home_model = self._get_home_model() + self._active_activity_changed_hid = home_model.connect( + 'active-activity-changed', self._cur_activity_changed_cb) activity = home_model.get_active_activity() self._update_invite_menu(activity) @@ -125,11 +100,11 @@ class BuddyMenu(Palette): self.set_primary_text(nick) def _make_friend_cb(self, menuitem): - friends = self._shell.get_model().get_friends() + friends = self._get_shell_model().get_friends() friends.make_friend(self._buddy) def _remove_friend_cb(self, menuitem): - friends = self._shell.get_model().get_friends() + friends = self._get_shell_model().get_friends() friends.remove(self._buddy) def _invite_friend_cb(self, menuitem): diff --git a/shell/view/home/MeshBox.py b/shell/view/home/MeshBox.py index a13aeba..00ca782 100644 --- a/shell/view/home/MeshBox.py +++ b/shell/view/home/MeshBox.py @@ -317,8 +317,8 @@ class ActivityView(hippo.CanvasBox): def remove_buddy_icon(self, key): icon = self._icons[key] - self.remove(icon) del self._icons[key] + icon.destroy() def _clicked_cb(self, item): bundle_id = self._model.get_bundle_id() @@ -535,6 +535,7 @@ class MeshBox(hippo.CanvasBox): icon = self._buddies[buddy_model.get_key()] self._layout.remove(icon) del self._buddies[buddy_model.get_key()] + icon.destroy() def _remove_buddy(self, buddy_model): key = buddy_model.get_key() @@ -575,6 +576,7 @@ class MeshBox(hippo.CanvasBox): icon = self._activities[activity_model.get_id()] self._layout.remove(icon) del self._activities[activity_model.get_id()] + icon.destroy() def _add_access_point(self, ap_model): meshdev = self._model.get_mesh() |