diff options
author | Marco Pesenti Gritti <mpg@redhat.com> | 2005-05-10 09:33:33 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <marco@src.gnome.org> | 2005-05-10 09:33:33 (GMT) |
commit | d58f069362465e0bd50814853b86ab5341beba79 (patch) | |
tree | 30ab28f0c2e201934d1824cfc7e6ae06919089eb /shell/ev-page-action.c | |
parent | 43f12b7663328557c87c4d579a21e37e520ebdb3 (diff) |
Keep a weak reference on proxy->page_cache so that we dont try to
2005-05-10 Marco Pesenti Gritti <mpg@redhat.com>
* shell/ev-page-action.c: (ev_page_action_widget_set_page_cache),
(ev_page_action_widget_finalize),
(ev_page_action_widget_class_init), (update_page_cache):
Keep a weak reference on proxy->page_cache so that we
dont try to disconnect the signal if the object is already
gone. Maybe there is a better way to cleanup reference handling
in page action though...
Diffstat (limited to 'shell/ev-page-action.c')
-rw-r--r-- | shell/ev-page-action.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/shell/ev-page-action.c b/shell/ev-page-action.c index deb9b77..57b9bfc 100644 --- a/shell/ev-page-action.c +++ b/shell/ev-page-action.c @@ -63,6 +63,9 @@ static GType ev_page_action_widget_get_type (void); static void ev_page_action_widget_init (EvPageActionWidget *action_widget); static void ev_page_action_widget_class_init (EvPageActionWidgetClass *action_widget); +#define EV_TYPE_PAGE_ACTION_WIDGET (ev_page_action_widget_get_type ()) +#define EV_PAGE_ACTION_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EV_TYPE_PAGE_ACTION_WIDGET, EvPageActionWidget)) + G_DEFINE_TYPE (EvPageActionWidget, ev_page_action_widget, GTK_TYPE_TOOL_ITEM) static void @@ -72,11 +75,37 @@ ev_page_action_widget_init (EvPageActionWidget *action_widget) } static void -ev_page_action_widget_class_init (EvPageActionWidgetClass *action_widget) +ev_page_action_widget_set_page_cache (EvPageActionWidget *action_widget, + EvPageCache *page_cache) +{ + if (action_widget->page_cache != NULL) { + g_object_remove_weak_pointer (G_OBJECT (action_widget->page_cache), + (gpointer *)&action_widget->page_cache); + action_widget->page_cache = NULL; + } + + if (page_cache != NULL) { + action_widget->page_cache = page_cache; + g_object_add_weak_pointer (G_OBJECT (page_cache), + (gpointer *)&action_widget->page_cache); + } +} + +static void +ev_page_action_widget_finalize (GObject *object) { + EvPageActionWidget *action_widget = EV_PAGE_ACTION_WIDGET (object); + + ev_page_action_widget_set_page_cache (action_widget, NULL); } +static void +ev_page_action_widget_class_init (EvPageActionWidgetClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + object_class->finalize = ev_page_action_widget_finalize; +} static void ev_page_action_init (EvPageAction *action); static void ev_page_action_class_init (EvPageActionClass *class); @@ -210,7 +239,7 @@ update_page_cache (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *pr signal_id = 0; page_changed_cb (NULL, 0, proxy); } - proxy->page_cache = page_cache; + ev_page_action_widget_set_page_cache (proxy, page_cache); proxy->signal_id = signal_id; } |