[Sugar-devel] Freeing resources when switching away from activity (was: Re: [Bugs] #2413 UNSP: Hovering over the new activity toolbar activity icon so that sub toolbar appears triggers focus_out_event)

Tomeu Vizoso tomeu at sugarlabs.org
Thu Oct 7 04:28:03 EDT 2010


On Wed, Oct 6, 2010 at 20:51, Sascha Silbe
<sascha-ml-reply-to-2010-3 at silbe.org> wrote:
> Excerpts from Sugar Labs Bugs's message of Wed Oct 06 18:16:49 UTC 2010:
>
>>  I decided to keep poking at this for Physics and there does seem to be an
>>  activity level fix. As per a long, long lost email from Tomeu (thanks
>>  Tomeu, only took me two years to re-investigate and take action). I'm
>>  connecting a callback to the visibility-notify-event and then testing if
>>  data.state == gtk.gdk.VISIBILITY_FULLY_OBSCURED. Took me ages to track
>>  this down, but seems to be working a treat, I'm about to test outside of
>>  my VM dev environment and onto an XO-1:
>
> FWIW, this is what I do in one of my activities (a simple "digital wall
> clock"):
>
> class BigDigiClockActivity(activity.Activity):
>
>    def __init__(self, handle):
> [...]
>        self.can_freeze = True
>        self._freeze_scheduled = False
> [...]
>        self.time_label.connect('size-allocate', self._size_allocate_cb)
>        self._unmap_cb_handler = None
>        self.time_label.connect('unmap-event', self._unmap_cb)
>        self.set_canvas(self.time_label)
>        self.time_label.show()
>
> [...]
>    # for debug output only
>    _vis_map = {
>        gtk.gdk.VISIBILITY_UNOBSCURED: 'unobscured',
>        gtk.gdk.VISIBILITY_PARTIAL: 'partial',
>        gtk.gdk.VISIBILITY_FULLY_OBSCURED: 'fully obscured',
>    }
>    def _visibility_cb(self, widget, event, *args):
>        """X window has changed."""
>        logging.debug('visibility = %r', self._vis_map.get(event.state, event.state))
>        self._set_may_freeze(event.state == gtk.gdk.VISIBILITY_UNOBSCURED)
>
>    def _unmap_cb(self, *args):
>        """X window has been unmapped (i.e. is invisible now)."""
>        logging.debug('unmap')
>        self._set_may_freeze(False)
>
>    def _size_allocate_cb(self, widget, allocation, *args):
>        """Size for self.time_label has been (re)set.
>
>        Recalculate font size if necessary."""
> [...]
>        if self._unmap_cb_handler is None:
>            window = self.time_label.get_parent()
>            self._unmap_cb_handler = window.connect('unmap-event',
>                self._unmap_cb)
>            window.connect('visibility-notify-event', self._visibility_cb)
>            window.add_events(gtk.gdk.VISIBILITY_NOTIFY_MASK)
>
> [...]
>    def _set_may_freeze(self, may_freeze):
>        self._hide_cursor(may_freeze)
>        self.may_freeze = may_freeze
>        if may_freeze:
>            self._schedule_freeze()
>        else:
>            self._set_dcon_freeze(False)
>
>
> For other activities there might be a better match than size-allocate
> for when to connect the callbacks to the window.
>
> Perhaps we could move some of this to sugar.activity.activity.Activity
> so activity authors could concentrate on the resource freeing part?
> Maybe even coupled with a timer to prevent us from slowing down quick
> activity switches (i.e. the user switching forth and back between two
> activities in quick succession).

Sounds like a very good idea to me.

Regards,

Tomeu

> Sascha
> --
> http://sascha.silbe.org/
> http://www.infra-silbe.de/
>
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel
>
>


More information about the Sugar-devel mailing list