diff options
author | Jonas Smedegaard <dr@jones.dk> | 2008-10-18 23:39:20 (GMT) |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2008-10-18 23:39:20 (GMT) |
commit | b93839e07925181d188b2061cb15ba71de7ff004 (patch) | |
tree | 690fafdeb9547316564c203ddeede60ee1c330d6 /src/sugar/graphics/palette.py | |
parent | d7cb0f34bfbec887072b0465ade35752dee6cba4 (diff) | |
parent | b3fde4a8e9a91425646bf9403dc27f00149a8980 (diff) |
Merge commit 'v0.82.11'
Diffstat (limited to 'src/sugar/graphics/palette.py')
-rw-r--r-- | src/sugar/graphics/palette.py | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/src/sugar/graphics/palette.py b/src/sugar/graphics/palette.py index 2c07389..c0a56fc 100644 --- a/src/sugar/graphics/palette.py +++ b/src/sugar/graphics/palette.py @@ -244,9 +244,7 @@ class Palette(gtk.Window): self._menu_box = None self._content = None self._palette_popup_sid = None - self._enter_invoker_hid = None - self._leave_invoker_hid = None - self._right_click_invoker_hid = None + self._invoker_hids = [] self.set_group_id("default") @@ -274,8 +272,12 @@ class Palette(gtk.Window): self._mouse_detector = MouseSpeedDetector(self, 200, 5) self._mouse_detector.connect('motion-slow', self._mouse_slow_cb) - def __destroy_cb(self, palette): + def __destroy_cb(self, palette): self.set_group_id(None) + + # Break the reference cycle. It looks like the gc is not able to free + # it, possibly because gtk.Menu memory handling is very special. + self.menu = None if self._palette_popup_sid is not None: _palette_observer.disconnect(self._palette_popup_sid) @@ -312,21 +314,27 @@ class Palette(gtk.Window): return gtk.gdk.Rectangle(x, y, width, height) def _set_invoker(self, invoker): - if self._invoker is not None: - self._invoker.disconnect(self._enter_invoker_hid) - self._invoker.disconnect(self._leave_invoker_hid) - self._invoker.disconnect(self._right_click_invoker_hid) + for hid in self._invoker_hids[:]: + self._invoker.disconnect(hid) + self._invoker_hids.remove(hid) self._invoker = invoker if invoker is not None: - self._enter_invoker_hid = self._invoker.connect( - 'mouse-enter', self._invoker_mouse_enter_cb) - self._leave_invoker_hid = self._invoker.connect( - 'mouse-leave', self._invoker_mouse_leave_cb) - self._right_click_invoker_hid = self._invoker.connect( - 'right-click', self._invoker_right_click_cb) + self._invoker_hids.append(self._invoker.connect( + 'mouse-enter', self._invoker_mouse_enter_cb)) + self._invoker_hids.append(self._invoker.connect( + 'mouse-leave', self._invoker_mouse_leave_cb)) + self._invoker_hids.append(self._invoker.connect( + 'right-click', self._invoker_right_click_cb)) if hasattr(invoker.props, 'widget'): - self._label.props.accel_widget = invoker.props.widget + self._update_accel_widget() + logging.debug(('Setup widget', invoker.props.widget)) + self._invoker_hids.append(self._invoker.connect( + 'notify::widget', self._invoker_widget_changed_cb)) + + def _update_accel_widget(self): + assert self.props.invoker is not None + self._label.props.accel_widget = self.props.invoker.props.widget def set_primary_text(self, label, accel_path=None): self._primary_text = label @@ -611,6 +619,9 @@ class Palette(gtk.Window): self.popup(immediate=immediate) + def _invoker_widget_changed_cb(self, invoker, spec): + self._update_accel_widget() + def _invoker_mouse_enter_cb(self, invoker): self._mouse_detector.start() @@ -750,6 +761,9 @@ class Invoker(gobject.GObject): def detach(self): self.parent = None + if self._palette is not None: + self._palette.destroy() + self._palette = None def _get_position_for_alignment(self, alignment, palette_dim): palette_halign = alignment[0] @@ -939,6 +953,8 @@ class WidgetInvoker(Invoker): else: self._widget = parent + self.notify('widget') + self._enter_hid = self._widget.connect('enter-notify-event', self.__enter_notify_event_cb) self._leave_hid = self._widget.connect('leave-notify-event', |