diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2013-07-20 02:40:19 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2013-07-20 02:40:19 +0800 |
commit | 61845e6667c0069460ce2df633c33e0f0989f733 (patch) | |
tree | d30c2e03abe6212fb77c0d53acf342b2e7e0d809 | |
parent | 8a0bb568238483e65ba0e053ddca0e47fb01040f (diff) | |
download | gsoc2013-evolution-61845e6667c0069460ce2df633c33e0f0989f733.tar.gz gsoc2013-evolution-61845e6667c0069460ce2df633c33e0f0989f733.tar.zst gsoc2013-evolution-61845e6667c0069460ce2df633c33e0f0989f733.zip |
EDayView: Follow up on a FIXME comment.
Avoid disconnecting signal handlers through searches since we can't be
sure what else it might disconnect.
-rw-r--r-- | calendar/gui/e-day-view.c | 554 |
1 files changed, 485 insertions, 69 deletions
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 3c0b462faa..e8a36869c4 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -97,6 +97,52 @@ struct _EDayViewPrivate { ECalModel *model; + gulong notify_work_day_monday_handler_id; + gulong notify_work_day_tuesday_handler_id; + gulong notify_work_day_wednesday_handler_id; + gulong notify_work_day_thursday_handler_id; + gulong notify_work_day_friday_handler_id; + gulong notify_work_day_saturday_handler_id; + gulong notify_work_day_sunday_handler_id; + gulong notify_week_start_day_handler_id; + gulong notify_work_day_start_hour_handler_id; + gulong notify_work_day_start_minute_handler_id; + gulong notify_work_day_end_hour_handler_id; + gulong notify_work_day_end_minute_handler_id; + gulong time_range_changed_handler_id; + gulong model_row_changed_handler_id; + gulong model_cell_changed_handler_id; + gulong model_rows_inserted_handler_id; + gulong comps_deleted_handler_id; + gulong timezone_changed_handler_id; + + /* "top_canvas" signal handlers */ + gulong top_canvas_button_press_event_handler_id; + gulong top_canvas_button_release_event_handler_id; + gulong top_canvas_scroll_event_handler_id; + gulong top_canvas_motion_notify_event_handler_id; + gulong top_canvas_drag_motion_handler_id; + gulong top_canvas_drag_leave_handler_id; + gulong top_canvas_drag_begin_handler_id; + gulong top_canvas_drag_end_handler_id; + gulong top_canvas_drag_data_get_handler_id; + gulong top_canvas_drag_data_received_handler_id; + + /* "main_canvas" signal handlers */ + gulong main_canvas_realize_handler_id; + gulong main_canvas_button_press_event_handler_id; + gulong main_canvas_button_release_event_handler_id; + gulong main_canvas_scroll_event_handler_id; + gulong main_canvas_motion_notify_event_handler_id; + gulong main_canvas_drag_motion_handler_id; + gulong main_canvas_drag_leave_handler_id; + gulong main_canvas_drag_begin_handler_id; + gulong main_canvas_drag_end_handler_id; + gulong main_canvas_drag_data_get_handler_id; + gulong main_canvas_drag_data_received_handler_id; + + /* "time_canvas" signal handlers */ + gulong time_canvas_scroll_event_handler_id; /* Whether we are showing the work-week view. */ gboolean work_week_view; @@ -819,11 +865,289 @@ day_view_dispose (GObject *object) day_view->grabbed_pointer = NULL; } - if (day_view->priv->model) { - g_signal_handlers_disconnect_by_data (day_view->priv->model, day_view); - g_signal_handlers_disconnect_by_data (day_view->priv->model, day_view->main_canvas); + if (day_view->priv->notify_work_day_monday_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_monday_handler_id); + day_view->priv->notify_work_day_monday_handler_id = 0; } + if (day_view->priv->notify_work_day_tuesday_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_tuesday_handler_id); + day_view->priv->notify_work_day_tuesday_handler_id = 0; + } + + if (day_view->priv->notify_work_day_wednesday_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_wednesday_handler_id); + day_view->priv->notify_work_day_wednesday_handler_id = 0; + } + + if (day_view->priv->notify_work_day_thursday_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_thursday_handler_id); + day_view->priv->notify_work_day_thursday_handler_id = 0; + } + + if (day_view->priv->notify_work_day_friday_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_friday_handler_id); + day_view->priv->notify_work_day_friday_handler_id = 0; + } + + if (day_view->priv->notify_work_day_saturday_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_saturday_handler_id); + day_view->priv->notify_work_day_saturday_handler_id = 0; + } + + if (day_view->priv->notify_work_day_sunday_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_sunday_handler_id); + day_view->priv->notify_work_day_sunday_handler_id = 0; + } + + if (day_view->priv->notify_week_start_day_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_week_start_day_handler_id); + day_view->priv->notify_week_start_day_handler_id = 0; + } + + if (day_view->priv->notify_work_day_start_hour_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_start_hour_handler_id); + day_view->priv->notify_work_day_start_hour_handler_id = 0; + } + + if (day_view->priv->notify_work_day_start_minute_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_start_minute_handler_id); + day_view->priv->notify_work_day_start_minute_handler_id = 0; + } + + if (day_view->priv->notify_work_day_end_hour_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_end_hour_handler_id); + day_view->priv->notify_work_day_end_hour_handler_id = 0; + } + + if (day_view->priv->notify_work_day_end_minute_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->notify_work_day_end_minute_handler_id); + day_view->priv->notify_work_day_end_minute_handler_id = 0; + } + + if (day_view->priv->time_range_changed_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->time_range_changed_handler_id); + day_view->priv->time_range_changed_handler_id = 0; + } + + if (day_view->priv->model_row_changed_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->model_row_changed_handler_id); + day_view->priv->model_row_changed_handler_id = 0; + } + + if (day_view->priv->model_cell_changed_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->model_cell_changed_handler_id); + day_view->priv->model_cell_changed_handler_id = 0; + } + + if (day_view->priv->model_rows_inserted_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->model_rows_inserted_handler_id); + day_view->priv->model_rows_inserted_handler_id = 0; + } + + if (day_view->priv->comps_deleted_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->comps_deleted_handler_id); + day_view->priv->comps_deleted_handler_id = 0; + } + + if (day_view->priv->timezone_changed_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->priv->model, + day_view->priv->timezone_changed_handler_id); + day_view->priv->timezone_changed_handler_id = 0; + } + + if (day_view->priv->top_canvas_button_press_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_button_press_event_handler_id); + day_view->priv->top_canvas_button_press_event_handler_id = 0; + } + + if (day_view->priv->top_canvas_button_release_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_button_release_event_handler_id); + day_view->priv->top_canvas_button_release_event_handler_id = 0; + } + + if (day_view->priv->top_canvas_scroll_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_scroll_event_handler_id); + day_view->priv->top_canvas_scroll_event_handler_id = 0; + } + + if (day_view->priv->top_canvas_motion_notify_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_motion_notify_event_handler_id); + day_view->priv->top_canvas_motion_notify_event_handler_id = 0; + } + + if (day_view->priv->top_canvas_drag_motion_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_drag_motion_handler_id); + day_view->priv->top_canvas_drag_motion_handler_id = 0; + } + + if (day_view->priv->top_canvas_drag_leave_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_drag_leave_handler_id); + day_view->priv->top_canvas_drag_leave_handler_id = 0; + } + + if (day_view->priv->top_canvas_drag_begin_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_drag_begin_handler_id); + day_view->priv->top_canvas_drag_begin_handler_id = 0; + } + + if (day_view->priv->top_canvas_drag_end_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_drag_end_handler_id); + day_view->priv->top_canvas_drag_end_handler_id = 0; + } + + if (day_view->priv->top_canvas_drag_data_get_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_drag_data_get_handler_id); + day_view->priv->top_canvas_drag_data_get_handler_id = 0; + } + + if (day_view->priv->top_canvas_drag_data_received_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->top_canvas, + day_view->priv->top_canvas_drag_data_received_handler_id); + day_view->priv->top_canvas_drag_data_received_handler_id = 0; + } + + if (day_view->priv->main_canvas_realize_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_realize_handler_id); + day_view->priv->main_canvas_realize_handler_id = 0; + } + + if (day_view->priv->main_canvas_button_press_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_button_press_event_handler_id); + day_view->priv->main_canvas_button_press_event_handler_id = 0; + } + + if (day_view->priv->main_canvas_button_release_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_button_release_event_handler_id); + day_view->priv->main_canvas_button_release_event_handler_id = 0; + } + + if (day_view->priv->main_canvas_scroll_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_scroll_event_handler_id); + day_view->priv->main_canvas_scroll_event_handler_id = 0; + } + + if (day_view->priv->main_canvas_motion_notify_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_motion_notify_event_handler_id); + day_view->priv->main_canvas_motion_notify_event_handler_id = 0; + } + + if (day_view->priv->main_canvas_drag_motion_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_drag_motion_handler_id); + day_view->priv->main_canvas_drag_motion_handler_id = 0; + } + + if (day_view->priv->main_canvas_drag_leave_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_drag_leave_handler_id); + day_view->priv->main_canvas_drag_leave_handler_id = 0; + } + + if (day_view->priv->main_canvas_drag_begin_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_drag_begin_handler_id); + day_view->priv->main_canvas_drag_begin_handler_id = 0; + } + + if (day_view->priv->main_canvas_drag_end_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_drag_end_handler_id); + day_view->priv->main_canvas_drag_end_handler_id = 0; + } + + if (day_view->priv->main_canvas_drag_data_get_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_drag_data_get_handler_id); + day_view->priv->main_canvas_drag_data_get_handler_id = 0; + } + + if (day_view->priv->main_canvas_drag_data_received_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->main_canvas, + day_view->priv->main_canvas_drag_data_received_handler_id); + day_view->priv->main_canvas_drag_data_received_handler_id = 0; + } + + if (day_view->priv->time_canvas_scroll_event_handler_id > 0) { + g_signal_handler_disconnect ( + day_view->time_canvas, + day_view->priv->time_canvas_scroll_event_handler_id); + day_view->priv->time_canvas_scroll_event_handler_id = 0; + } + + g_clear_object (&day_view->top_canvas); + g_clear_object (&day_view->main_canvas); + g_clear_object (&day_view->time_canvas); g_clear_object (&day_view->priv->model); /* Chain up to parent's dispose() method. */ @@ -831,10 +1155,22 @@ day_view_dispose (GObject *object) } static void +day_view_notify (GObject *object, + GParamSpec *pspec) +{ + /* Don't chain up. None of our parent classes, not + * even GObjectClass itself, implements this method. */ + + if (g_str_equal (pspec->name, "time-divisions")) + day_view_notify_time_divisions_cb (E_DAY_VIEW (object)); +} + +static void day_view_constructed (GObject *object) { EDayView *day_view; ECalModel *model; + gulong handler_id; day_view = E_DAY_VIEW (object); @@ -847,57 +1183,65 @@ day_view_constructed (GObject *object) * disconnect signal handlers in dispose(). */ day_view->priv->model = g_object_ref (model); - g_signal_connect ( + handler_id = g_signal_connect ( model, "notify::work-day-monday", G_CALLBACK (day_view_notify_work_day_cb), day_view); + day_view->priv->notify_work_day_monday_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( model, "notify::work-day-tuesday", G_CALLBACK (day_view_notify_work_day_cb), day_view); + day_view->priv->notify_work_day_tuesday_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( model, "notify::work-day-wednesday", G_CALLBACK (day_view_notify_work_day_cb), day_view); + day_view->priv->notify_work_day_wednesday_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( model, "notify::work-day-thursday", G_CALLBACK (day_view_notify_work_day_cb), day_view); + day_view->priv->notify_work_day_thursday_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( model, "notify::work-day-friday", G_CALLBACK (day_view_notify_work_day_cb), day_view); + day_view->priv->notify_work_day_friday_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( model, "notify::work-day-saturday", G_CALLBACK (day_view_notify_work_day_cb), day_view); + day_view->priv->notify_work_day_saturday_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( model, "notify::work-day-sunday", G_CALLBACK (day_view_notify_work_day_cb), day_view); + day_view->priv->notify_work_day_sunday_handler_id = handler_id; - g_signal_connect_swapped ( - day_view, "notify::time-divisions", - G_CALLBACK (day_view_notify_time_divisions_cb), day_view); - - g_signal_connect_swapped ( + handler_id = g_signal_connect_swapped ( model, "notify::week-start-day", G_CALLBACK (day_view_notify_week_start_day_cb), day_view); + day_view->priv->notify_week_start_day_handler_id = handler_id; - g_signal_connect_swapped ( + handler_id = g_signal_connect_swapped ( model, "notify::work-day-start-hour", G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas); + day_view->priv->notify_work_day_start_hour_handler_id = handler_id; - g_signal_connect_swapped ( + handler_id = g_signal_connect_swapped ( model, "notify::work-day-start-minute", G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas); + day_view->priv->notify_work_day_start_minute_handler_id = handler_id; - g_signal_connect_swapped ( + handler_id = g_signal_connect_swapped ( model, "notify::work-day-end-hour", G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas); + day_view->priv->notify_work_day_end_hour_handler_id = handler_id; - g_signal_connect_swapped ( + handler_id = g_signal_connect_swapped ( model, "notify::work-day-end-minute", G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas); + day_view->priv->notify_work_day_end_minute_handler_id = handler_id; } static void @@ -1485,6 +1829,7 @@ e_day_view_class_init (EDayViewClass *class) object_class->get_property = day_view_get_property; object_class->constructed = day_view_constructed; object_class->dispose = day_view_dispose; + object_class->notify = day_view_notify; widget_class = GTK_WIDGET_CLASS (class); widget_class->realize = day_view_realize; @@ -1556,7 +1901,9 @@ e_day_view_init (EDayView *day_view) GnomeCanvasGroup *canvas_group; GtkAdjustment *adjustment; GtkScrollable *scrollable; - GtkWidget *w; + GtkWidget *container; + GtkWidget *widget; + gulong handler_id; day_view->priv = E_DAY_VIEW_GET_PRIVATE (day_view); @@ -1642,55 +1989,84 @@ e_day_view_init (EDayView *day_view) day_view->before_click_dtstart = 0; day_view->before_click_dtend = 0; - day_view->week_number_label = gtk_label_new (""); - gtk_table_attach (GTK_TABLE (day_view), day_view->week_number_label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); + widget = gtk_label_new (""); + gtk_table_attach ( + GTK_TABLE (day_view), widget, + 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); + day_view->week_number_label = widget; /* * Top Canvas */ - w = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - - day_view->top_dates_canvas = e_canvas_new (); - gtk_box_pack_start (GTK_BOX (w), day_view->top_dates_canvas, TRUE, TRUE, 0); - day_view->top_canvas = e_canvas_new (); - gtk_box_pack_end (GTK_BOX (w), day_view->top_canvas, TRUE, TRUE, 0); - + widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_table_attach ( - GTK_TABLE (day_view), w, + GTK_TABLE (day_view), widget, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show_all (w); + gtk_widget_show (widget); - g_signal_connect_after ( + container = widget; + + widget = e_canvas_new (); + gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); + day_view->top_dates_canvas = widget; + gtk_widget_show (widget); + + /* Keep our own canvas reference so we can + * disconnect signal handlers in dispose(). */ + widget = e_canvas_new (); + gtk_box_pack_end (GTK_BOX (container), widget, TRUE, TRUE, 0); + day_view->top_canvas = g_object_ref (widget); + gtk_widget_show (widget); + + handler_id = g_signal_connect_after ( day_view->top_canvas, "button_press_event", G_CALLBACK (e_day_view_on_top_canvas_button_press), day_view); - g_signal_connect ( + day_view->priv->top_canvas_button_press_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "button_release_event", G_CALLBACK (e_day_view_on_top_canvas_button_release), day_view); - g_signal_connect ( + day_view->priv->top_canvas_button_release_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "scroll_event", G_CALLBACK (e_day_view_on_top_canvas_scroll), day_view); - g_signal_connect ( + day_view->priv->top_canvas_scroll_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "motion_notify_event", G_CALLBACK (e_day_view_on_top_canvas_motion), day_view); - g_signal_connect ( + day_view->priv->top_canvas_motion_notify_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "drag_motion", G_CALLBACK (e_day_view_on_top_canvas_drag_motion), day_view); - g_signal_connect ( + day_view->priv->top_canvas_drag_motion_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "drag_leave", G_CALLBACK (e_day_view_on_top_canvas_drag_leave), day_view); + day_view->priv->top_canvas_drag_leave_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( day_view->top_canvas, "drag_begin", G_CALLBACK (e_day_view_on_drag_begin), day_view); - g_signal_connect ( + day_view->priv->top_canvas_drag_begin_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "drag_end", G_CALLBACK (e_day_view_on_drag_end), day_view); - g_signal_connect ( + day_view->priv->top_canvas_drag_end_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "drag_data_get", G_CALLBACK (e_day_view_on_drag_data_get), day_view); - g_signal_connect ( + day_view->priv->top_canvas_drag_data_get_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->top_canvas, "drag_data_received", G_CALLBACK (e_day_view_on_top_canvas_drag_data_received), day_view); + day_view->priv->top_canvas_drag_data_received_handler_id = handler_id; canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->top_dates_canvas)->root); @@ -1736,48 +2112,71 @@ e_day_view_init (EDayView *day_view) /* * Main Canvas */ - day_view->main_canvas = e_canvas_new (); + + /* Keep our own canvas reference so we can + * disconnect signal handlers in dispose(). */ + widget = e_canvas_new (); gtk_table_attach ( - GTK_TABLE (day_view), day_view->main_canvas, - 1, 2, 1, 2, + GTK_TABLE (day_view), widget, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - gtk_widget_show (day_view->main_canvas); - g_signal_connect ( + day_view->main_canvas = g_object_ref (widget); + gtk_widget_show (widget); + + handler_id = g_signal_connect ( day_view->main_canvas, "realize", G_CALLBACK (e_day_view_on_canvas_realized), day_view); + day_view->priv->main_canvas_realize_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( day_view->main_canvas, "button_press_event", G_CALLBACK (e_day_view_on_main_canvas_button_press), day_view); - g_signal_connect ( + day_view->priv->main_canvas_button_press_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "button_release_event", G_CALLBACK (e_day_view_on_main_canvas_button_release), day_view); - g_signal_connect ( + day_view->priv->main_canvas_button_release_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "scroll_event", G_CALLBACK (e_day_view_on_main_canvas_scroll), day_view); - g_signal_connect ( + day_view->priv->main_canvas_scroll_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "motion_notify_event", G_CALLBACK (e_day_view_on_main_canvas_motion), day_view); - g_signal_connect ( + day_view->priv->main_canvas_motion_notify_event_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "drag_motion", G_CALLBACK (e_day_view_on_main_canvas_drag_motion), day_view); - g_signal_connect ( + day_view->priv->main_canvas_drag_motion_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "drag_leave", G_CALLBACK (e_day_view_on_main_canvas_drag_leave), day_view); + day_view->priv->main_canvas_drag_leave_handler_id = handler_id; - g_signal_connect ( + handler_id = g_signal_connect ( day_view->main_canvas, "drag_begin", G_CALLBACK (e_day_view_on_drag_begin), day_view); - g_signal_connect ( + day_view->priv->main_canvas_drag_begin_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "drag_end", G_CALLBACK (e_day_view_on_drag_end), day_view); - g_signal_connect ( + day_view->priv->main_canvas_drag_end_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "drag_data_get", G_CALLBACK (e_day_view_on_drag_data_get), day_view); - g_signal_connect ( + day_view->priv->main_canvas_drag_data_get_handler_id = handler_id; + + handler_id = g_signal_connect ( day_view->main_canvas, "drag_data_received", G_CALLBACK (e_day_view_on_main_canvas_drag_data_received), day_view); + day_view->priv->main_canvas_drag_data_received_handler_id = handler_id; canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root); @@ -1818,19 +2217,24 @@ e_day_view_init (EDayView *day_view) /* * Times Canvas */ - day_view->time_canvas = e_canvas_new (); + + /* Keep our own canvas reference so we can + * disconnect signal handlers in dispose(). */ + widget = e_canvas_new (); scrollable = GTK_SCROLLABLE (day_view->main_canvas); adjustment = gtk_scrollable_get_vadjustment (scrollable); - scrollable = GTK_SCROLLABLE (day_view->time_canvas); + scrollable = GTK_SCROLLABLE (widget); gtk_scrollable_set_vadjustment (scrollable, adjustment); gtk_table_attach ( - GTK_TABLE (day_view), day_view->time_canvas, - 0, 1, 1, 2, + GTK_TABLE (day_view), widget, 0, 1, 1, 2, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - gtk_widget_show (day_view->time_canvas); - g_signal_connect_after ( + day_view->time_canvas = g_object_ref (widget); + gtk_widget_show (widget); + + handler_id = g_signal_connect_after ( day_view->time_canvas, "scroll_event", G_CALLBACK (e_day_view_on_time_canvas_scroll), day_view); + day_view->priv->time_canvas_scroll_event_handler_id = handler_id; canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->time_canvas)->root); @@ -2174,25 +2578,37 @@ static void init_model (EDayView *day_view, ECalModel *model) { - /* connect to ECalModel's signals */ - g_signal_connect ( + gulong handler_id; + + handler_id = g_signal_connect ( model, "time_range_changed", G_CALLBACK (time_range_changed_cb), day_view); - g_signal_connect ( + day_view->priv->time_range_changed_handler_id = handler_id; + + handler_id = g_signal_connect ( model, "model_row_changed", G_CALLBACK (model_row_changed_cb), day_view); - g_signal_connect ( + day_view->priv->model_row_changed_handler_id = handler_id; + + handler_id = g_signal_connect ( model, "model_cell_changed", G_CALLBACK (model_cell_changed_cb), day_view); - g_signal_connect ( + day_view->priv->model_cell_changed_handler_id = handler_id; + + handler_id = g_signal_connect ( model, "model_rows_inserted", G_CALLBACK (model_rows_inserted_cb), day_view); - g_signal_connect ( + day_view->priv->model_rows_inserted_handler_id = handler_id; + + handler_id = g_signal_connect ( model, "comps_deleted", G_CALLBACK (model_comps_deleted_cb), day_view); - g_signal_connect ( + day_view->priv->comps_deleted_handler_id = handler_id; + + handler_id = g_signal_connect ( model, "timezone_changed", G_CALLBACK (timezone_changed_cb), day_view); + day_view->priv->timezone_changed_handler_id = handler_id; } /* Turn off the background of the canvas windows. This reduces flicker |