Fixing issues of leaking window
authorEd Page <eopage@byu.net>
Thu, 13 May 2010 12:18:16 +0000 (07:18 -0500)
committerEd Page <eopage@byu.net>
Thu, 13 May 2010 12:18:16 +0000 (07:18 -0500)
src/mormonchannel_gtk.py
src/playcontrol.py
src/util/go_utils.py
src/windows.py

index 934e6e3..d86f226 100755 (executable)
@@ -7,7 +7,6 @@
 @todo Switch home icon color
 @todo Switch from swappping icons on press to the pressed version of icons
 @bug Fix presenter display
-@bug All connect's need disconnects or else we will leak a bunch of objects
 @todo Track recent
 @todo Favorites
 @todo Sequential playback
index 8576237..7cdab35 100644 (file)
@@ -5,6 +5,7 @@ import gtk
 
 import gtk_toolbox
 import hildonize
+import util.go_utils as go_utils
 import util.misc as misc_utils
 
 import presenter
@@ -13,7 +14,7 @@ import presenter
 _moduleLogger = logging.getLogger(__name__)
 
 
-class NavControl(gobject.GObject):
+class NavControl(gobject.GObject, go_utils.AutoSignal):
 
 
        __gsignals__ = {
@@ -34,10 +35,6 @@ class NavControl(gobject.GObject):
 
                self._store = store
 
-               self._player = player
-               self._player.connect("state-change", self._on_player_state_change)
-               self._player.connect("title-change", self._on_player_title_change)
-
                self._controlButton = store.get_image_from_store(store.STORE_LOOKUP["small_play"])
 
                self._controlBox = presenter.NavigationBox()
@@ -45,7 +42,7 @@ class NavControl(gobject.GObject):
                self._controlBox.connect("action", self._on_nav_action)
                self._controlBox.connect("navigating", self._on_navigating)
 
-               self._titleButton = gtk.Label(self._player.title)
+               self._titleButton = gtk.Label()
 
                self._displayBox = presenter.NavigationBox()
                self._displayBox.toplevel.add(self._titleButton)
@@ -53,8 +50,13 @@ class NavControl(gobject.GObject):
                self._displayBox.connect("navigating", self._on_navigating)
 
                self._layout = gtk.HBox()
+               go_utils.AutoSignal.__init__(self, self.toplevel)
                self._layout.pack_start(self._controlBox.toplevel, False, False)
                self._layout.pack_start(self._displayBox.toplevel, True, True)
+               self._player = player
+               self.connect_auto(self._player, "state-change", self._on_player_state_change)
+               self.connect_auto(self._player, "title-change", self._on_player_title_change)
+               self._titleButton.set_label(self._player.title)
 
        def refresh(self):
                self._titleButton.set_label(self._player.title)
index ba66f26..16bcf89 100644 (file)
@@ -248,6 +248,23 @@ class AsyncLinearExecution(object):
                        )
 
 
+class AutoSignal(object):
+
+       def __init__(self, toplevel):
+               self.__disconnectPool = []
+               toplevel.connect("destroy", self.__on_destroy)
+
+       def connect_auto(self, widget, *args):
+               id = widget.connect(*args)
+               self.__disconnectPool.append((widget, id))
+
+       @misc.log_exception(_moduleLogger)
+       def __on_destroy(self, widget):
+               for widget, id in self.__disconnectPool:
+                       widget.disconnect(id)
+               del self.__disconnectPool[:]
+
+
 def throttled(minDelay, queue):
        """
        Throttle the calls to a function by queueing all the calls that happen
index a31d1a2..38008a3 100644 (file)
@@ -10,6 +10,7 @@ import gtk
 import constants
 import hildonize
 import util.misc as misc_utils
+import util.go_utils as go_utils
 
 import stream_index
 import banners
@@ -20,7 +21,7 @@ import presenter
 _moduleLogger = logging.getLogger(__name__)
 
 
-class BasicWindow(gobject.GObject):
+class BasicWindow(gobject.GObject, go_utils.AutoSignal):
 
        __gsignals__ = {
                'quit' : (
@@ -66,6 +67,7 @@ class BasicWindow(gobject.GObject):
                self._layout.pack_start(self._errorBanner.toplevel, False, True)
 
                self._window = gtk.Window()
+               go_utils.AutoSignal.__init__(self, self.window)
                self._window.add(self._layout)
                self._window = hildonize.hildonize_window(self, self._window)
 
@@ -294,8 +296,8 @@ class RadioWindow(BasicWindow):
                self._node = node
                self._childNode = None
 
-               self._player.connect("state-change", self._on_player_state_change)
-               self._player.connect("title-change", self._on_player_title_change)
+               self.connect_auto(self._player, "state-change", self._on_player_state_change)
+               self.connect_auto(self._player, "title-change", self._on_player_title_change)
 
                self._loadingBanner = banners.GenericBanner()
 
@@ -852,9 +854,9 @@ class ConferenceTalkWindow(BasicWindow):
                BasicWindow.__init__(self, player, store)
                self._node = node
 
-               self._player.connect("state-change", self._on_player_state_change)
-               self._player.connect("title-change", self._on_player_title_change)
-               self._player.connect("error", self._on_player_error)
+               self.connect_auto(self._player, "state-change", self._on_player_state_change)
+               self.connect_auto(self._player, "title-change", self._on_player_title_change)
+               self.connect_auto(self._player, "error", self._on_player_error)
 
                self._loadingBanner = banners.GenericBanner()