aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@novell.com>2010-03-14 03:48:21 +0800
committerMichael Meeks <michael.meeks@novell.com>2010-03-14 04:54:14 +0800
commitf767cb847bebc3b9935137076d7e43f44f029029 (patch)
tree05be3c4fc9a57d87856be19982d007cc10b09c85
parent13dd2b58d5adf127e609af25757c53637f4add07 (diff)
downloadgsoc2013-evolution-f767cb847bebc3b9935137076d7e43f44f029029.tar.gz
gsoc2013-evolution-f767cb847bebc3b9935137076d7e43f44f029029.tar.zst
gsoc2013-evolution-f767cb847bebc3b9935137076d7e43f44f029029.zip
Fix GnomeCalendar lifecycle; not being a widget meant we didn't
get a gtk_widget_destroy invocation, which meant we left some callbacks registered, long after our child 'views' were destroyed causing sudden death in update_marcus_bains_line_cb, manipulating views.
-rw-r--r--calendar/gui/gnome-cal.c20
-rw-r--r--calendar/gui/gnome-cal.h5
-rw-r--r--modules/calendar/e-cal-shell-content.c4
3 files changed, 15 insertions, 14 deletions
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index 8c48b8eafb..a8afeff7fc 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -151,7 +151,7 @@ enum {
static guint signals[LAST_SIGNAL];
-static void gnome_calendar_destroy (GtkObject *object);
+static void gnome_calendar_do_dispose (GObject *object);
static void gnome_calendar_goto_date (GnomeCalendar *gcal,
GnomeCalendarGotoDateType goto_date);
@@ -195,7 +195,7 @@ message_push (Message *msg)
g_thread_pool_push ((GThreadPool *) once.retval, msg, NULL);
}
-G_DEFINE_TYPE (GnomeCalendar, gnome_calendar, GTK_TYPE_VBOX)
+G_DEFINE_TYPE (GnomeCalendar, gnome_calendar, G_TYPE_OBJECT)
static void
gcal_update_status_message (GnomeCalendar *gcal, const gchar *message, gdouble percent)
@@ -482,16 +482,13 @@ static void
gnome_calendar_class_init (GnomeCalendarClass *class)
{
GObjectClass *object_class;
- GtkObjectClass *gtk_object_class;
GtkBindingSet *binding_set;
object_class = G_OBJECT_CLASS (class);
object_class->set_property = gnome_calendar_set_property;
object_class->get_property = gnome_calendar_get_property;
object_class->constructed = gnome_calendar_constructed;
-
- gtk_object_class = GTK_OBJECT_CLASS (class);
- gtk_object_class->destroy = gnome_calendar_destroy;
+ object_class->dispose = gnome_calendar_do_dispose;
class->dates_shown_changed = NULL;
class->calendar_selection_changed = NULL;
@@ -1384,7 +1381,7 @@ gnome_calendar_init (GnomeCalendar *gcal)
}
static void
-gnome_calendar_destroy (GtkObject *object)
+gnome_calendar_do_dispose (GObject *object)
{
GnomeCalendar *gcal;
GnomeCalendarPrivate *priv;
@@ -1454,8 +1451,13 @@ gnome_calendar_destroy (GtkObject *object)
gcal->priv = NULL;
}
- if (GTK_OBJECT_CLASS (gnome_calendar_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (gnome_calendar_parent_class)->destroy) (object);
+ G_OBJECT_CLASS (gnome_calendar_parent_class)->dispose (object);
+}
+
+void
+gnome_calendar_dispose (GnomeCalendar *gcal)
+{
+ g_object_run_dispose (G_OBJECT (gcal));
}
static void
diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h
index 91d80f0c20..b24648e2bc 100644
--- a/calendar/gui/gnome-cal.h
+++ b/calendar/gui/gnome-cal.h
@@ -85,12 +85,12 @@ typedef enum {
} GnomeCalendarGotoDateType;
struct _GnomeCalendar {
- GtkVBox vbox;
+ GObject parent;
GnomeCalendarPrivate *priv;
};
struct _GnomeCalendarClass {
- GtkVBoxClass parent_class;
+ GObjectClass parent_class;
/* Notification signals */
void (*dates_shown_changed) (GnomeCalendar *gcal);
@@ -114,6 +114,7 @@ struct _GnomeCalendarClass {
GType gnome_calendar_get_type (void);
GtkWidget * gnome_calendar_new (EShellSettings *shell_settings);
+void gnome_calendar_dispose (GnomeCalendar *gcal);
EShellSettings *gnome_calendar_get_shell_settings
(GnomeCalendar *gcal);
ECalendar * gnome_calendar_get_date_navigator
diff --git a/modules/calendar/e-cal-shell-content.c b/modules/calendar/e-cal-shell-content.c
index 67081ce978..bffa39a35e 100644
--- a/modules/calendar/e-cal-shell-content.c
+++ b/modules/calendar/e-cal-shell-content.c
@@ -204,6 +204,7 @@ cal_shell_content_dispose (GObject *object)
}
if (priv->calendar != NULL) {
+ gnome_calendar_dispose (priv->calendar);
g_object_unref (priv->calendar);
priv->calendar = NULL;
}
@@ -324,10 +325,7 @@ cal_shell_content_constructed (GObject *object)
/* Add views in the order defined by GnomeCalendarViewType, such
* that the notebook page number corresponds to the view type. */
- /* XXX GnomeCalendar is a widget, but we don't pack it.
- * Maybe it should just be a GObject instead? */
priv->calendar = gnome_calendar_new (shell_settings);
- g_object_ref_sink (priv->calendar);
calendar = GNOME_CALENDAR (priv->calendar);
for (ii = 0; ii < GNOME_CAL_LAST_VIEW; ii++) {