Blame SOURCES/evolution-3.8.5-labels-gsettings-busy-loop.patch

b1a0e4
diff -up evolution-3.8.5/addressbook/gui/contact-editor/e-contact-editor.c.labels-gsettings-busy-loop evolution-3.8.5/addressbook/gui/contact-editor/e-contact-editor.c
b1a0e4
--- evolution-3.8.5/addressbook/gui/contact-editor/e-contact-editor.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.380256027 +0200
b1a0e4
+++ evolution-3.8.5/addressbook/gui/contact-editor/e-contact-editor.c	2014-06-05 12:50:44.137250570 +0200
b1a0e4
@@ -4428,7 +4428,7 @@ e_contact_editor_set_property (GObject *
b1a0e4
 			editor->target_client = editor->source_client;
b1a0e4
 			g_object_ref (editor->target_client);
b1a0e4
 
b1a0e4
-			editor->target_editable_id = g_signal_connect (
b1a0e4
+			editor->target_editable_id = e_signal_connect_notify (
b1a0e4
 				editor->target_client, "notify::readonly",
b1a0e4
 				G_CALLBACK (notify_readonly_cb), editor);
b1a0e4
 
b1a0e4
@@ -4475,7 +4475,7 @@ e_contact_editor_set_property (GObject *
b1a0e4
 		editor->target_client = target_client;
b1a0e4
 		g_object_ref (editor->target_client);
b1a0e4
 
b1a0e4
-		editor->target_editable_id = g_signal_connect (
b1a0e4
+		editor->target_editable_id = e_signal_connect_notify (
b1a0e4
 			editor->target_client, "notify::readonly",
b1a0e4
 			G_CALLBACK (notify_readonly_cb), editor);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/addressbook/gui/contact-list-editor/e-contact-list-editor.c.labels-gsettings-busy-loop evolution-3.8.5/addressbook/gui/contact-list-editor/e-contact-list-editor.c
b1a0e4
--- evolution-3.8.5/addressbook/gui/contact-list-editor/e-contact-list-editor.c.labels-gsettings-busy-loop	2013-08-10 23:38:42.000000000 +0200
b1a0e4
+++ evolution-3.8.5/addressbook/gui/contact-list-editor/e-contact-list-editor.c	2014-06-05 12:50:44.138250560 +0200
b1a0e4
@@ -1474,10 +1474,10 @@ contact_list_editor_constructed (GObject
b1a0e4
 		e_name_selector_peek_model (editor->priv->name_selector),
b1a0e4
 		"Members", _("_Members"), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		editor, "notify::book",
b1a0e4
 		G_CALLBACK (contact_list_editor_notify_cb), NULL);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		editor, "notify::editable",
b1a0e4
 		G_CALLBACK (contact_list_editor_notify_cb), NULL);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/addressbook/gui/widgets/eab-contact-display.c.labels-gsettings-busy-loop evolution-3.8.5/addressbook/gui/widgets/eab-contact-display.c
b1a0e4
--- evolution-3.8.5/addressbook/gui/widgets/eab-contact-display.c.labels-gsettings-busy-loop	2013-07-23 14:52:21.000000000 +0200
b1a0e4
+++ evolution-3.8.5/addressbook/gui/widgets/eab-contact-display.c	2014-06-05 12:50:44.138250560 +0200
b1a0e4
@@ -514,7 +514,7 @@ eab_contact_display_init (EABContactDisp
b1a0e4
 		web_view, "create-plugin-widget",
b1a0e4
 		G_CALLBACK (contact_display_object_requested), display);
b1a0e4
 #endif
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		web_view, "notify::load-status",
b1a0e4
 		G_CALLBACK (contact_display_load_status_changed), NULL);
b1a0e4
 	g_signal_connect (
b1a0e4
diff -up evolution-3.8.5/addressbook/gui/widgets/e-contact-map-window.c.labels-gsettings-busy-loop evolution-3.8.5/addressbook/gui/widgets/e-contact-map-window.c
b1a0e4
--- evolution-3.8.5/addressbook/gui/widgets/e-contact-map-window.c.labels-gsettings-busy-loop	2013-07-23 14:52:22.000000000 +0200
b1a0e4
+++ evolution-3.8.5/addressbook/gui/widgets/e-contact-map-window.c	2014-06-05 12:50:44.138250560 +0200
b1a0e4
@@ -370,7 +370,7 @@ e_contact_map_window_init (EContactMapWi
b1a0e4
 	view = e_contact_map_get_view (E_CONTACT_MAP (map));
b1a0e4
 	champlain_view_set_zoom_level (view, 2);
b1a0e4
 	priv->map = E_CONTACT_MAP (map);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		view, "notify::zoom-level",
b1a0e4
 		G_CALLBACK (zoom_level_changed_cb), window);
b1a0e4
 	g_signal_connect (
b1a0e4
diff -up evolution-3.8.5/addressbook/gui/widgets/e-contact-marker.c.labels-gsettings-busy-loop evolution-3.8.5/addressbook/gui/widgets/e-contact-marker.c
b1a0e4
--- evolution-3.8.5/addressbook/gui/widgets/e-contact-marker.c.labels-gsettings-busy-loop	2013-07-23 14:52:21.000000000 +0200
b1a0e4
+++ evolution-3.8.5/addressbook/gui/widgets/e-contact-marker.c	2014-06-05 12:50:44.138250560 +0200
b1a0e4
@@ -584,7 +584,7 @@ e_contact_marker_init (EContactMarker *m
b1a0e4
 	priv->total_width = 0;
b1a0e4
 	priv->total_height = 0;
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		marker, "notify::selected",
b1a0e4
 		G_CALLBACK (notify_selected), NULL);
b1a0e4
 	g_signal_connect (
b1a0e4
diff -up evolution-3.8.5/calendar/gui/dialogs/recurrence-page.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/dialogs/recurrence-page.c
b1a0e4
--- evolution-3.8.5/calendar/gui/dialogs/recurrence-page.c.labels-gsettings-busy-loop	2013-07-23 14:52:34.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/dialogs/recurrence-page.c	2014-06-05 12:50:44.139250548 +0200
b1a0e4
@@ -283,7 +283,7 @@ recurrence_page_constructor (GType type,
b1a0e4
 	/* Keep the calendar updated as the user twizzles widgets. */
b1a0e4
 	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (object));
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		editor, "notify::changed",
b1a0e4
 		G_CALLBACK (preview_recur), object);
b1a0e4
 
b1a0e4
@@ -2530,7 +2530,7 @@ recurrence_page_construct (RecurrencePag
b1a0e4
 
b1a0e4
 	init_widgets (rpage);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		editor, "notify::client",
b1a0e4
 		G_CALLBACK (sensitize_buttons), rpage);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/calendar/gui/dialogs/schedule-page.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/dialogs/schedule-page.c
b1a0e4
--- evolution-3.8.5/calendar/gui/dialogs/schedule-page.c.labels-gsettings-busy-loop	2013-07-23 14:52:34.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/dialogs/schedule-page.c	2014-06-05 12:50:44.139250548 +0200
b1a0e4
@@ -430,7 +430,7 @@ schedule_page_construct (SchedulePage *s
b1a0e4
 		return NULL;
b1a0e4
 	}
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		editor, "notify::client",
b1a0e4
 		G_CALLBACK (sensitize_widgets), spage);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/calendar/gui/dialogs/task-details-page.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/dialogs/task-details-page.c
b1a0e4
--- evolution-3.8.5/calendar/gui/dialogs/task-details-page.c.labels-gsettings-busy-loop	2013-07-23 14:52:32.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/dialogs/task-details-page.c	2014-06-05 12:50:44.139250548 +0200
b1a0e4
@@ -759,7 +759,7 @@ task_details_page_construct (TaskDetails
b1a0e4
 
b1a0e4
 	init_widgets (tdpage);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		editor, "notify::client",
b1a0e4
 		G_CALLBACK (sensitize_widgets), tdpage);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/calendar/gui/e-cal-list-view.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/e-cal-list-view.c
b1a0e4
--- evolution-3.8.5/calendar/gui/e-cal-list-view.c.labels-gsettings-busy-loop	2013-07-23 14:52:32.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/e-cal-list-view.c	2014-06-05 12:50:44.139250548 +0200
b1a0e4
@@ -339,7 +339,7 @@ setup_e_table (ECalListView *cal_list_vi
b1a0e4
 		cal_list_view->table, "cursor_change",
b1a0e4
 		G_CALLBACK (e_cal_list_view_cursor_change_cb),
b1a0e4
 		cal_list_view);
b1a0e4
-	g_signal_connect_after (
b1a0e4
+	e_signal_connect_notify_after (
b1a0e4
 		cal_list_view->table, "notify::is-editing",
b1a0e4
 		G_CALLBACK (e_cal_list_view_table_editing_changed_cb),
b1a0e4
 		cal_list_view);
b1a0e4
diff -up evolution-3.8.5/calendar/gui/e-day-view.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/e-day-view.c
b1a0e4
--- evolution-3.8.5/calendar/gui/e-day-view.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.912252173 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/e-day-view.c	2014-06-05 12:50:44.140250537 +0200
b1a0e4
@@ -92,7 +92,11 @@
b1a0e4
 #define E_DAY_VIEW_MAX_ROWS_AT_TOP     6
b1a0e4
 
b1a0e4
 struct _EDayViewPrivate {
b1a0e4
-	gint placeholder;
b1a0e4
+	gulong notify_week_start_day_id;
b1a0e4
+	gulong notify_work_day_start_hour_id;
b1a0e4
+	gulong notify_work_day_start_minute_id;
b1a0e4
+	gulong notify_work_day_end_hour_id;
b1a0e4
+	gulong notify_work_day_end_minute_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 typedef struct {
b1a0e4
@@ -749,6 +753,12 @@ day_view_dispose (GObject *object)
b1a0e4
 	if (model) {
b1a0e4
 		g_signal_handlers_disconnect_by_data (model, day_view);
b1a0e4
 		g_signal_handlers_disconnect_by_data (model, day_view->main_canvas);
b1a0e4
+
b1a0e4
+		e_signal_disconnect_notify_handler (model, &day_view->priv->notify_week_start_day_id);
b1a0e4
+		e_signal_disconnect_notify_handler (model, &day_view->priv->notify_work_day_start_hour_id);
b1a0e4
+		e_signal_disconnect_notify_handler (model, &day_view->priv->notify_work_day_start_minute_id);
b1a0e4
+		e_signal_disconnect_notify_handler (model, &day_view->priv->notify_work_day_end_hour_id);
b1a0e4
+		e_signal_disconnect_notify_handler (model, &day_view->priv->notify_work_day_end_minute_id);
b1a0e4
 	}
b1a0e4
 
b1a0e4
 	e_day_view_cancel_layout (day_view);
b1a0e4
@@ -826,27 +836,27 @@ day_view_constructed (GObject *object)
b1a0e4
 
b1a0e4
 	model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		day_view, "notify::time-divisions",
b1a0e4
 		G_CALLBACK (day_view_notify_time_divisions_cb), day_view);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	day_view->priv->notify_week_start_day_id = e_signal_connect_notify_swapped (
b1a0e4
 		model, "notify::week-start-day",
b1a0e4
 		G_CALLBACK (day_view_notify_week_start_day_cb), day_view);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	day_view->priv->notify_work_day_start_hour_id = e_signal_connect_notify_swapped (
b1a0e4
 		model, "notify::work-day-start-hour",
b1a0e4
 		G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	day_view->priv->notify_work_day_start_minute_id = e_signal_connect_notify_swapped (
b1a0e4
 		model, "notify::work-day-start-minute",
b1a0e4
 		G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	day_view->priv->notify_work_day_end_hour_id = e_signal_connect_notify_swapped (
b1a0e4
 		model, "notify::work-day-end-hour",
b1a0e4
 		G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	day_view->priv->notify_work_day_end_minute_id = e_signal_connect_notify_swapped (
b1a0e4
 		model, "notify::work-day-end-minute",
b1a0e4
 		G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/calendar/gui/e-day-view-time-item.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/e-day-view-time-item.c
b1a0e4
--- evolution-3.8.5/calendar/gui/e-day-view-time-item.c.labels-gsettings-busy-loop	2014-06-05 12:53:12.275165090 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/e-day-view-time-item.c	2014-06-05 12:53:23.107084998 +0200
b1a0e4
@@ -721,16 +721,21 @@ edvti_second_zone_changed_cb (GSettings
b1a0e4
 {
b1a0e4
 	EDayViewTimeItem *time_item = user_data;
b1a0e4
 	EDayView *day_view;
b1a0e4
+	icaltimezone *second_zone;
b1a0e4
 	gchar *location;
b1a0e4
 
b1a0e4
 	g_return_if_fail (user_data != NULL);
b1a0e4
 	g_return_if_fail (E_IS_DAY_VIEW_TIME_ITEM (time_item));
b1a0e4
 
b1a0e4
 	location = calendar_config_get_day_second_zone ();
b1a0e4
-	time_item->priv->second_zone =
b1a0e4
-		location ? icaltimezone_get_builtin_timezone (location) : NULL;
b1a0e4
+	second_zone = location ? icaltimezone_get_builtin_timezone (location) : NULL;
b1a0e4
 	g_free (location);
b1a0e4
 
b1a0e4
+	if (second_zone == time_item->priv->second_zone)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
+	time_item->priv->second_zone = second_zone;
b1a0e4
+
b1a0e4
 	day_view = e_day_view_time_item_get_day_view (time_item);
b1a0e4
 	gtk_widget_set_size_request (
b1a0e4
 		day_view->time_canvas,
b1a0e4
diff -up evolution-3.8.5/calendar/gui/e-meeting-time-sel.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/e-meeting-time-sel.c
b1a0e4
--- evolution-3.8.5/calendar/gui/e-meeting-time-sel.c.labels-gsettings-busy-loop	2013-08-01 14:12:40.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/e-meeting-time-sel.c	2014-06-05 12:50:44.141250520 +0200
b1a0e4
@@ -46,6 +46,7 @@
b1a0e4
 
b1a0e4
 struct _EMeetingTimeSelectorPrivate {
b1a0e4
 	gboolean use_24_hour_format;
b1a0e4
+	gulong notify_free_busy_template_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 /* An array of hour strings for 24 hour time, "0:00" .. "23:00". */
b1a0e4
@@ -250,6 +251,8 @@ meeting_time_selector_dispose (GObject *
b1a0e4
 		g_signal_handlers_disconnect_matched (
b1a0e4
 			mts->model, G_SIGNAL_MATCH_DATA,
b1a0e4
 			0, 0, NULL, NULL, mts);
b1a0e4
+		e_signal_disconnect_notify_handler (mts->model, &mts->priv->notify_free_busy_template_id);
b1a0e4
+
b1a0e4
 		g_object_unref (mts->model);
b1a0e4
 		mts->model = NULL;
b1a0e4
 	}
b1a0e4
@@ -395,7 +398,7 @@ e_meeting_time_selector_construct (EMeet
b1a0e4
 	if (mts->model)
b1a0e4
 		g_object_ref (mts->model);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	mts->priv->notify_free_busy_template_id = e_signal_connect_notify_swapped (
b1a0e4
 		mts->model, "notify::free-busy-template",
b1a0e4
 		G_CALLBACK (free_busy_template_changed_cb), mts);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/calendar/gui/e-task-table.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/e-task-table.c
b1a0e4
--- evolution-3.8.5/calendar/gui/e-task-table.c.labels-gsettings-busy-loop	2013-07-23 14:52:27.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/e-task-table.c	2014-06-05 12:50:44.141250520 +0200
b1a0e4
@@ -59,6 +59,11 @@ struct _ETaskTablePrivate {
b1a0e4
 
b1a0e4
 	GtkTargetList *copy_target_list;
b1a0e4
 	GtkTargetList *paste_target_list;
b1a0e4
+
b1a0e4
+	gulong notify_highlight_due_today_id;
b1a0e4
+	gulong notify_color_due_today_id;
b1a0e4
+	gulong notify_highlight_overdue_id;
b1a0e4
+	gulong notify_color_overdue_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 enum {
b1a0e4
@@ -316,26 +321,25 @@ task_table_set_model (ETaskTable *task_t
b1a0e4
 		task_table);
b1a0e4
 
b1a0e4
 	/* redraw on drawing options change */
b1a0e4
-	g_signal_connect (
b1a0e4
+	task_table->priv->notify_highlight_due_today_id = e_signal_connect_notify (
b1a0e4
 		model, "notify::highlight-due-today",
b1a0e4
 		G_CALLBACK (task_table_queue_draw_cb),
b1a0e4
 		task_table);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	task_table->priv->notify_color_due_today_id = e_signal_connect_notify (
b1a0e4
 		model, "notify::color-due-today",
b1a0e4
 		G_CALLBACK (task_table_queue_draw_cb),
b1a0e4
 		task_table);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	task_table->priv->notify_highlight_overdue_id = e_signal_connect_notify (
b1a0e4
 		model, "notify::highlight-overdue",
b1a0e4
 		G_CALLBACK (task_table_queue_draw_cb),
b1a0e4
 		task_table);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	task_table->priv->notify_color_overdue_id = e_signal_connect_notify (
b1a0e4
 		model, "notify::color-overdue",
b1a0e4
 		G_CALLBACK (task_table_queue_draw_cb),
b1a0e4
 		task_table);
b1a0e4
-
b1a0e4
 }
b1a0e4
 
b1a0e4
 static void
b1a0e4
@@ -429,7 +433,13 @@ task_table_dispose (GObject *object)
b1a0e4
 	}
b1a0e4
 
b1a0e4
 	if (priv->model != NULL) {
b1a0e4
-		g_signal_handlers_disconnect_by_func (priv->model, task_table_queue_draw_cb, object);
b1a0e4
+		g_signal_handlers_disconnect_by_data (priv->model, object);
b1a0e4
+
b1a0e4
+		e_signal_disconnect_notify_handler (priv->model, &priv->notify_highlight_due_today_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->model, &priv->notify_color_due_today_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->model, &priv->notify_highlight_overdue_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->model, &priv->notify_color_overdue_id);
b1a0e4
+
b1a0e4
 		g_object_unref (priv->model);
b1a0e4
 		priv->model = NULL;
b1a0e4
 	}
b1a0e4
diff -up evolution-3.8.5/calendar/gui/e-week-view.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/e-week-view.c
b1a0e4
--- evolution-3.8.5/calendar/gui/e-week-view.c.labels-gsettings-busy-loop	2013-07-23 14:52:36.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/e-week-view.c	2014-06-05 12:50:44.141250520 +0200
b1a0e4
@@ -78,7 +78,7 @@
b1a0e4
 #define E_WEEK_VIEW_LAYOUT_TIMEOUT	100
b1a0e4
 
b1a0e4
 struct _EWeekViewPrivate {
b1a0e4
-	gint placeholder;
b1a0e4
+	gulong notify_week_start_day_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 typedef struct {
b1a0e4
@@ -691,8 +691,10 @@ week_view_dispose (GObject *object)
b1a0e4
 
b1a0e4
 	e_week_view_cancel_layout (week_view);
b1a0e4
 
b1a0e4
-	if (model)
b1a0e4
+	if (model) {
b1a0e4
 		g_signal_handlers_disconnect_by_data (model, object);
b1a0e4
+		e_signal_disconnect_notify_handler (model, &week_view->priv->notify_week_start_day_id);
b1a0e4
+	}
b1a0e4
 
b1a0e4
 	if (week_view->events) {
b1a0e4
 		e_week_view_free_events (week_view);
b1a0e4
@@ -728,18 +730,20 @@ week_view_dispose (GObject *object)
b1a0e4
 static void
b1a0e4
 week_view_constructed (GObject *object)
b1a0e4
 {
b1a0e4
+	EWeekView *week_view;
b1a0e4
 	ECalModel *model;
b1a0e4
 	ECalendarView *calendar_view;
b1a0e4
 
b1a0e4
 	/* Chain up to parent's constructed() method. */
b1a0e4
 	G_OBJECT_CLASS (e_week_view_parent_class)->constructed (object);
b1a0e4
 
b1a0e4
+	week_view = E_WEEK_VIEW (object);
b1a0e4
 	calendar_view = E_CALENDAR_VIEW (object);
b1a0e4
 	model = e_calendar_view_get_model (calendar_view);
b1a0e4
 
b1a0e4
 	e_week_view_recalc_display_start_day (E_WEEK_VIEW (object));
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	week_view->priv->notify_week_start_day_id = e_signal_connect_notify_swapped (
b1a0e4
 		model, "notify::week-start-day",
b1a0e4
 		G_CALLBACK (week_view_notify_week_start_day_cb), object);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/calendar/gui/gnome-cal.c.labels-gsettings-busy-loop evolution-3.8.5/calendar/gui/gnome-cal.c
b1a0e4
--- evolution-3.8.5/calendar/gui/gnome-cal.c.labels-gsettings-busy-loop	2013-07-23 14:52:30.000000000 +0200
b1a0e4
+++ evolution-3.8.5/calendar/gui/gnome-cal.c	2014-06-05 12:50:44.142250506 +0200
b1a0e4
@@ -125,6 +125,8 @@ struct _GnomeCalendarPrivate {
b1a0e4
 	gboolean lview_select_daten_range;
b1a0e4
 
b1a0e4
 	GCancellable *cancellable;
b1a0e4
+
b1a0e4
+	gulong notify_week_start_day_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 struct _ViewData {
b1a0e4
@@ -540,7 +542,7 @@ gnome_calendar_constructed (GObject *obj
b1a0e4
 	gcal->priv->views[GNOME_CAL_WORK_WEEK_VIEW] = calendar_view;
b1a0e4
 	g_object_ref_sink (calendar_view);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		calendar_view, "notify::working-days",
b1a0e4
 		G_CALLBACK (gnome_calendar_update_time_range), gcal);
b1a0e4
 
b1a0e4
@@ -588,7 +590,7 @@ gnome_calendar_constructed (GObject *obj
b1a0e4
 		calendar_view, "selection-changed",
b1a0e4
 		G_CALLBACK (view_selection_changed_cb), gcal);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	gcal->priv->notify_week_start_day_id = e_signal_connect_notify_swapped (
b1a0e4
 		model, "notify::week-start-day",
b1a0e4
 		G_CALLBACK (gnome_calendar_notify_week_start_day_cb), gcal);
b1a0e4
 
b1a0e4
@@ -1574,6 +1576,7 @@ gnome_calendar_do_dispose (GObject *obje
b1a0e4
 
b1a0e4
 	if (priv->model != NULL) {
b1a0e4
 		g_signal_handlers_disconnect_by_data (priv->model, object);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->model, &priv->notify_week_start_day_id);
b1a0e4
 		g_object_unref (priv->model);
b1a0e4
 		priv->model = NULL;
b1a0e4
 	}
b1a0e4
diff -up evolution-3.8.5/composer/e-composer-name-header.c.labels-gsettings-busy-loop evolution-3.8.5/composer/e-composer-name-header.c
b1a0e4
--- evolution-3.8.5/composer/e-composer-name-header.c.labels-gsettings-busy-loop	2013-07-23 14:52:19.000000000 +0200
b1a0e4
+++ evolution-3.8.5/composer/e-composer-name-header.c	2014-06-05 12:50:44.142250506 +0200
b1a0e4
@@ -222,7 +222,7 @@ composer_name_header_constructed (GObjec
b1a0e4
 		NULL);
b1a0e4
 	E_COMPOSER_HEADER (object)->input_widget = g_object_ref_sink (entry);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		object, "notify::visible",
b1a0e4
 		G_CALLBACK (composer_name_header_visible_changed_cb), object);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/composer/e-composer-private.c.labels-gsettings-busy-loop evolution-3.8.5/composer/e-composer-private.c
b1a0e4
--- evolution-3.8.5/composer/e-composer-private.c.labels-gsettings-busy-loop	2013-07-23 14:52:19.000000000 +0200
b1a0e4
+++ evolution-3.8.5/composer/e-composer-private.c	2014-06-05 12:50:44.142250506 +0200
b1a0e4
@@ -392,7 +392,7 @@ e_composer_private_constructed (EMsgComp
b1a0e4
 	priv->gallery_icon_view = g_object_ref (widget);
b1a0e4
 	g_free (gallery_path);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		composer, "notify::html-mode",
b1a0e4
 		G_CALLBACK (composer_update_gallery_visibility), NULL);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/composer/e-msg-composer.c.labels-gsettings-busy-loop evolution-3.8.5/composer/e-msg-composer.c
b1a0e4
--- evolution-3.8.5/composer/e-msg-composer.c.labels-gsettings-busy-loop	2013-07-23 14:52:19.000000000 +0200
b1a0e4
+++ evolution-3.8.5/composer/e-msg-composer.c	2014-06-05 12:50:44.143250493 +0200
b1a0e4
@@ -2019,28 +2019,28 @@ msg_composer_constructed (GObject *objec
b1a0e4
 
b1a0e4
 	/* Configure Headers */
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::destinations-bcc",
b1a0e4
 		G_CALLBACK (msg_composer_notify_header_cb), composer);
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::destinations-cc",
b1a0e4
 		G_CALLBACK (msg_composer_notify_header_cb), composer);
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::destinations-to",
b1a0e4
 		G_CALLBACK (msg_composer_notify_header_cb), composer);
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::identity-uid",
b1a0e4
 		G_CALLBACK (msg_composer_mail_identity_changed_cb), composer);
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::reply-to",
b1a0e4
 		G_CALLBACK (msg_composer_notify_header_cb), composer);
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::signature-uid",
b1a0e4
 		G_CALLBACK (e_composer_update_signature), composer);
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::subject",
b1a0e4
 		G_CALLBACK (msg_composer_subject_changed_cb), composer);
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		table, "notify::subject",
b1a0e4
 		G_CALLBACK (msg_composer_notify_header_cb), composer);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-action-combo-box.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-action-combo-box.c
b1a0e4
--- evolution-3.8.5/e-util/e-action-combo-box.c.labels-gsettings-busy-loop	2013-07-23 14:52:15.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-action-combo-box.c	2014-06-05 12:50:44.143250493 +0200
b1a0e4
@@ -23,6 +23,7 @@
b1a0e4
 #endif
b1a0e4
 
b1a0e4
 #include "e-action-combo-box.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #include <glib/gi18n.h>
b1a0e4
 
b1a0e4
@@ -512,13 +513,13 @@ e_action_combo_box_set_action (EActionCo
b1a0e4
 
b1a0e4
 	if (combo_box->priv->action_group != NULL) {
b1a0e4
 		combo_box->priv->group_sensitive_handler_id =
b1a0e4
-			g_signal_connect (
b1a0e4
+			e_signal_connect_notify (
b1a0e4
 				combo_box->priv->action_group,
b1a0e4
 				"notify::sensitive", G_CALLBACK (
b1a0e4
 				action_combo_box_action_group_notify_cb),
b1a0e4
 				combo_box);
b1a0e4
 		combo_box->priv->group_visible_handler_id =
b1a0e4
-			g_signal_connect (
b1a0e4
+			e_signal_connect_notify (
b1a0e4
 				combo_box->priv->action_group,
b1a0e4
 				"notify::visible", G_CALLBACK (
b1a0e4
 				action_combo_box_action_group_notify_cb),
b1a0e4
diff -up evolution-3.8.5/e-util/e-activity-bar.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-activity-bar.c
b1a0e4
--- evolution-3.8.5/e-util/e-activity-bar.c.labels-gsettings-busy-loop	2013-07-23 14:52:05.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-activity-bar.c	2014-06-05 12:50:44.143250493 +0200
b1a0e4
@@ -21,6 +21,7 @@
b1a0e4
 #endif
b1a0e4
 
b1a0e4
 #include "e-activity-bar.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_ACTIVITY_BAR_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
diff -up evolution-3.8.5/e-util/e-activity-proxy.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-activity-proxy.c
b1a0e4
--- evolution-3.8.5/e-util/e-activity-proxy.c.labels-gsettings-busy-loop	2013-07-23 14:52:03.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-activity-proxy.c	2014-06-05 12:50:44.143250493 +0200
b1a0e4
@@ -24,6 +24,7 @@
b1a0e4
 #endif
b1a0e4
 
b1a0e4
 #include "e-activity-proxy.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #include <glib/gi18n.h>
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-attachment-bar.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-attachment-bar.c
b1a0e4
--- evolution-3.8.5/e-util/e-attachment-bar.c.labels-gsettings-busy-loop	2013-07-23 14:52:15.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-attachment-bar.c	2014-06-05 12:50:44.143250493 +0200
b1a0e4
@@ -30,6 +30,7 @@
b1a0e4
 #include "e-attachment-store.h"
b1a0e4
 #include "e-attachment-icon-view.h"
b1a0e4
 #include "e-attachment-tree-view.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_ATTACHMENT_BAR_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -133,12 +134,12 @@ attachment_bar_set_store (EAttachmentBar
b1a0e4
 		GTK_TREE_VIEW (bar->priv->tree_view),
b1a0e4
 		bar->priv->model);
b1a0e4
 
b1a0e4
-	g_signal_connect_object (
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
 		bar->priv->model, "notify::num-attachments",
b1a0e4
 		G_CALLBACK (attachment_bar_update_status), bar,
b1a0e4
 		G_CONNECT_SWAPPED);
b1a0e4
 
b1a0e4
-	g_signal_connect_object (
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
 		bar->priv->model, "notify::total-size",
b1a0e4
 		G_CALLBACK (attachment_bar_update_status), bar,
b1a0e4
 		G_CONNECT_SWAPPED);
b1a0e4
diff -up evolution-3.8.5/e-util/e-attachment-button.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-attachment-button.c
b1a0e4
--- evolution-3.8.5/e-util/e-attachment-button.c.labels-gsettings-busy-loop	2013-07-23 14:52:08.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-attachment-button.c	2014-06-05 12:50:44.144250482 +0200
b1a0e4
@@ -26,6 +26,7 @@
b1a0e4
 #endif
b1a0e4
 
b1a0e4
 #include "e-attachment-button.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_ATTACHMENT_BUTTON_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -774,7 +775,7 @@ e_attachment_button_set_attachment (EAtt
b1a0e4
 			G_BINDING_SYNC_CREATE);
b1a0e4
 		button->priv->shown_binding = binding;
b1a0e4
 
b1a0e4
-		handler_id = g_signal_connect_swapped (
b1a0e4
+		handler_id = e_signal_connect_notify_swapped (
b1a0e4
 			attachment, "notify::reference",
b1a0e4
 			G_CALLBACK (attachment_button_update_cell_view),
b1a0e4
 			button);
b1a0e4
diff -up evolution-3.8.5/e-util/e-attachment.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-attachment.c
b1a0e4
--- evolution-3.8.5/e-util/e-attachment.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.867252500 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-attachment.c	2014-06-05 12:50:44.144250482 +0200
b1a0e4
@@ -34,6 +34,7 @@
b1a0e4
 #include "e-attachment-store.h"
b1a0e4
 #include "e-icon-factory.h"
b1a0e4
 #include "e-mktemp.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_ATTACHMENT_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -1024,51 +1025,51 @@ e_attachment_init (EAttachment *attachme
b1a0e4
 	g_mutex_init (&attachment->priv->property_lock);
b1a0e4
 	g_mutex_init (&attachment->priv->idle_lock);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::encrypted",
b1a0e4
 		G_CALLBACK (attachment_update_icon_column), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::file-info",
b1a0e4
 		G_CALLBACK (attachment_update_file_info_columns), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::file-info",
b1a0e4
 		G_CALLBACK (attachment_update_icon_column), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::loading",
b1a0e4
 		G_CALLBACK (attachment_update_icon_column), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::loading",
b1a0e4
 		G_CALLBACK (attachment_update_progress_columns), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::percent",
b1a0e4
 		G_CALLBACK (attachment_update_progress_columns), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::reference",
b1a0e4
 		G_CALLBACK (attachment_update_file_info_columns), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::reference",
b1a0e4
 		G_CALLBACK (attachment_update_icon_column), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::reference",
b1a0e4
 		G_CALLBACK (attachment_update_progress_columns), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::saving",
b1a0e4
 		G_CALLBACK (attachment_update_icon_column), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::saving",
b1a0e4
 		G_CALLBACK (attachment_update_progress_columns), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		attachment, "notify::signed",
b1a0e4
 		G_CALLBACK (attachment_update_icon_column), NULL);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-attachment-paned.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-attachment-paned.c
b1a0e4
--- evolution-3.8.5/e-util/e-attachment-paned.c.labels-gsettings-busy-loop	2013-07-23 14:52:03.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-attachment-paned.c	2014-06-05 12:50:44.144250482 +0200
b1a0e4
@@ -27,6 +27,7 @@
b1a0e4
 
b1a0e4
 #include <glib/gi18n.h>
b1a0e4
 
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 #include "e-attachment-view.h"
b1a0e4
 #include "e-attachment-store.h"
b1a0e4
 #include "e-attachment-icon-view.h"
b1a0e4
@@ -745,15 +746,15 @@ e_attachment_paned_init (EAttachmentPane
b1a0e4
 	paned->priv->status_label = g_object_ref (widget);
b1a0e4
 	gtk_widget_hide (widget);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		paned->priv->expander, "notify::expanded",
b1a0e4
 		G_CALLBACK (attachment_paned_notify_cb), paned);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		paned->priv->model, "notify::num-attachments",
b1a0e4
 		G_CALLBACK (attachment_paned_update_status), paned);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		paned->priv->model, "notify::total-size",
b1a0e4
 		G_CALLBACK (attachment_paned_update_status), paned);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-category-completion.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-category-completion.c
b1a0e4
--- evolution-3.8.5/e-util/e-category-completion.c.labels-gsettings-busy-loop	2013-07-23 14:52:05.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-category-completion.c	2014-06-05 12:50:44.144250482 +0200
b1a0e4
@@ -26,6 +26,8 @@
b1a0e4
 
b1a0e4
 #include <libedataserver/libedataserver.h>
b1a0e4
 
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
+
b1a0e4
 #define E_CATEGORY_COMPLETION_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
 	((obj), E_TYPE_CATEGORY_COMPLETION, ECategoryCompletionPrivate))
b1a0e4
@@ -34,6 +36,9 @@ struct _ECategoryCompletionPrivate {
b1a0e4
 	GtkWidget *last_known_entry;
b1a0e4
 	gchar *create;
b1a0e4
 	gchar *prefix;
b1a0e4
+
b1a0e4
+	gulong notify_cursor_position_id;
b1a0e4
+	gulong notify_text_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 enum {
b1a0e4
@@ -342,6 +347,8 @@ category_completion_track_entry (GtkEntr
b1a0e4
 		g_signal_handlers_disconnect_matched (
b1a0e4
 			priv->last_known_entry, G_SIGNAL_MATCH_DATA,
b1a0e4
 			0, 0, NULL, NULL, completion);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->last_known_entry, &priv->notify_cursor_position_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->last_known_entry, &priv->notify_text_id);
b1a0e4
 		g_object_unref (priv->last_known_entry);
b1a0e4
 	}
b1a0e4
 
b1a0e4
@@ -354,11 +361,11 @@ category_completion_track_entry (GtkEntr
b1a0e4
 
b1a0e4
 	g_object_ref (priv->last_known_entry);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	priv->notify_cursor_position_id = e_signal_connect_notify_swapped (
b1a0e4
 		priv->last_known_entry, "notify::cursor-position",
b1a0e4
 		G_CALLBACK (category_completion_update_prefix), completion);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	priv->notify_text_id = e_signal_connect_notify_swapped (
b1a0e4
 		priv->last_known_entry, "notify::text",
b1a0e4
 		G_CALLBACK (category_completion_update_prefix), completion);
b1a0e4
 
b1a0e4
@@ -413,6 +420,8 @@ category_completion_dispose (GObject *ob
b1a0e4
 		g_signal_handlers_disconnect_matched (
b1a0e4
 			priv->last_known_entry, G_SIGNAL_MATCH_DATA,
b1a0e4
 			0, 0, NULL, NULL, object);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->last_known_entry, &priv->notify_cursor_position_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->last_known_entry, &priv->notify_text_id);
b1a0e4
 		g_object_unref (priv->last_known_entry);
b1a0e4
 		priv->last_known_entry = NULL;
b1a0e4
 	}
b1a0e4
diff -up evolution-3.8.5/e-util/e-charset-combo-box.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-charset-combo-box.c
b1a0e4
--- evolution-3.8.5/e-util/e-charset-combo-box.c.labels-gsettings-busy-loop	2013-07-23 14:52:06.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-charset-combo-box.c	2014-06-05 12:50:44.144250482 +0200
b1a0e4
@@ -352,7 +352,7 @@ e_charset_combo_box_init (ECharsetComboB
b1a0e4
 	e_action_combo_box_add_separator_after (
b1a0e4
 		E_ACTION_COMBO_BOX (combo_box), g_slist_length (group));
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		combo_box, "notify::charset",
b1a0e4
 		G_CALLBACK (charset_combo_box_notify_charset_cb), NULL);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-filter-rule.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-filter-rule.c
b1a0e4
--- evolution-3.8.5/e-util/e-filter-rule.c.labels-gsettings-busy-loop	2013-07-23 14:52:09.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-filter-rule.c	2014-06-05 12:50:44.145250475 +0200
b1a0e4
@@ -33,6 +33,7 @@
b1a0e4
 #include "e-alert-dialog.h"
b1a0e4
 #include "e-filter-rule.h"
b1a0e4
 #include "e-rule-context.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_FILTER_RULE_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -896,10 +897,10 @@ filter_rule_get_widget (EFilterRule *rul
b1a0e4
 	vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1.0, 1.0, 1.0, 1.0));
b1a0e4
 	scrolledwindow = gtk_scrolled_window_new (hadj, vadj);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		hadj, "notify::upper",
b1a0e4
 		G_CALLBACK (ensure_scrolled_width_cb), scrolledwindow);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		vadj, "notify::upper",
b1a0e4
 		G_CALLBACK (ensure_scrolled_height_cb), scrolledwindow);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-interval-chooser.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-interval-chooser.c
b1a0e4
--- evolution-3.8.5/e-util/e-interval-chooser.c.labels-gsettings-busy-loop	2013-07-23 14:52:00.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-interval-chooser.c	2014-06-05 12:50:44.145250475 +0200
b1a0e4
@@ -22,6 +22,7 @@
b1a0e4
 #include <glib/gi18n-lib.h>
b1a0e4
 
b1a0e4
 #include "e-util-enums.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_INTERVAL_CHOOSER_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -130,7 +131,7 @@ e_interval_chooser_init (EIntervalChoose
b1a0e4
 	chooser->priv->spin_button = GTK_SPIN_BUTTON (widget);
b1a0e4
 	gtk_widget_show (widget);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		widget, "notify::value",
b1a0e4
 		G_CALLBACK (interval_chooser_notify_interval), chooser);
b1a0e4
 
b1a0e4
@@ -145,7 +146,7 @@ e_interval_chooser_init (EIntervalChoose
b1a0e4
 	chooser->priv->combo_box = GTK_COMBO_BOX (widget);
b1a0e4
 	gtk_widget_show (widget);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		widget, "notify::active",
b1a0e4
 		G_CALLBACK (interval_chooser_notify_interval), chooser);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/e-util/e-menu-tool-button.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-menu-tool-button.c
b1a0e4
--- evolution-3.8.5/e-util/e-menu-tool-button.c.labels-gsettings-busy-loop	2013-07-23 14:52:09.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-menu-tool-button.c	2014-06-05 12:50:44.145250475 +0200
b1a0e4
@@ -24,6 +24,7 @@
b1a0e4
 #endif
b1a0e4
 
b1a0e4
 #include "e-menu-tool-button.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_MENU_TOOL_BUTTON_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -242,7 +243,7 @@ e_menu_tool_button_init (EMenuToolButton
b1a0e4
 
b1a0e4
 	button->priv->prefer_item = NULL;
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		button, "notify::menu",
b1a0e4
 		G_CALLBACK (menu_tool_button_update_button), NULL);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/e-util/e-misc-utils.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-misc-utils.c
b1a0e4
--- evolution-3.8.5/e-util/e-misc-utils.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.382256022 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-misc-utils.c	2014-06-05 12:50:44.145250475 +0200
b1a0e4
@@ -2070,3 +2070,304 @@ e_misc_utils_is_help_package_installed (
b1a0e4
 
b1a0e4
 	return is_installed;
b1a0e4
 }
b1a0e4
+
b1a0e4
+typedef struct _EConnectNotifyData {
b1a0e4
+	GConnectFlags flags;
b1a0e4
+	GValue *old_value;
b1a0e4
+
b1a0e4
+	GCallback c_handler;
b1a0e4
+	gpointer user_data;
b1a0e4
+} EConnectNotifyData;
b1a0e4
+
b1a0e4
+static EConnectNotifyData *
b1a0e4
+e_connect_notify_data_new (GCallback c_handler,
b1a0e4
+			   gpointer user_data,
b1a0e4
+			   guint32 connect_flags)
b1a0e4
+{
b1a0e4
+	EConnectNotifyData *connect_data;
b1a0e4
+
b1a0e4
+	connect_data = g_new0 (EConnectNotifyData, 1);
b1a0e4
+	connect_data->flags = connect_flags;
b1a0e4
+	connect_data->c_handler = c_handler;
b1a0e4
+	connect_data->user_data = user_data;
b1a0e4
+
b1a0e4
+	return connect_data;
b1a0e4
+}
b1a0e4
+
b1a0e4
+static void
b1a0e4
+e_connect_notify_data_free (EConnectNotifyData *data)
b1a0e4
+{
b1a0e4
+	if (!data)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
+	if (data->old_value) {
b1a0e4
+		g_value_unset (data->old_value);
b1a0e4
+		g_free (data->old_value);
b1a0e4
+	}
b1a0e4
+	g_free (data);
b1a0e4
+}
b1a0e4
+
b1a0e4
+static gboolean
b1a0e4
+e_value_equal (GValue *value1,
b1a0e4
+	       GValue *value2)
b1a0e4
+{
b1a0e4
+	if (value1 == value2)
b1a0e4
+		return TRUE;
b1a0e4
+
b1a0e4
+	if (!value1 || !value2)
b1a0e4
+		return FALSE;
b1a0e4
+
b1a0e4
+	#define testType(_uc,_lc) G_STMT_START { \
b1a0e4
+		if (G_VALUE_HOLDS_ ## _uc (value1)) \
b1a0e4
+			return g_value_get_ ## _lc (value1) == g_value_get_ ## _lc (value2); \
b1a0e4
+	} G_STMT_END
b1a0e4
+
b1a0e4
+	testType (BOOLEAN, boolean);
b1a0e4
+	testType (BOXED, boxed);
b1a0e4
+	testType (CHAR, schar);
b1a0e4
+	testType (DOUBLE, double);
b1a0e4
+	testType (ENUM, enum);
b1a0e4
+	testType (FLAGS, flags);
b1a0e4
+	testType (FLOAT, float);
b1a0e4
+	testType (GTYPE, gtype);
b1a0e4
+	testType (INT, int);
b1a0e4
+	testType (INT64, int64);
b1a0e4
+	testType (LONG, long);
b1a0e4
+	testType (OBJECT, object);
b1a0e4
+	testType (POINTER, pointer);
b1a0e4
+	testType (UCHAR, uchar);
b1a0e4
+	testType (UINT, uint);
b1a0e4
+	testType (UINT64, uint64);
b1a0e4
+	testType (ULONG, ulong);
b1a0e4
+
b1a0e4
+	#undef testType
b1a0e4
+
b1a0e4
+	if (G_VALUE_HOLDS_PARAM (value1)) {
b1a0e4
+		GParamSpec *param1, *param2;
b1a0e4
+
b1a0e4
+		param1 = g_value_get_param (value1);
b1a0e4
+		param2 = g_value_get_param (value2);
b1a0e4
+
b1a0e4
+		return param1 && param2 &&
b1a0e4
+			g_strcmp0 (param1->name, param2->name) == 0 &&
b1a0e4
+			param1->flags == param2->flags &&
b1a0e4
+			param1->value_type == param2->value_type &&
b1a0e4
+			param1->owner_type == param2->owner_type;
b1a0e4
+	} else if (G_VALUE_HOLDS_STRING (value1)) {
b1a0e4
+		const gchar *string1, *string2;
b1a0e4
+
b1a0e4
+		string1 = g_value_get_string (value1);
b1a0e4
+		string2 = g_value_get_string (value2);
b1a0e4
+
b1a0e4
+		return g_strcmp0 (string1, string2) == 0;
b1a0e4
+	} else if (G_VALUE_HOLDS_VARIANT (value1)) {
b1a0e4
+		GVariant *variant1, *variant2;
b1a0e4
+
b1a0e4
+		variant1 = g_value_get_variant (value1);
b1a0e4
+		variant2 = g_value_get_variant (value2);
b1a0e4
+
b1a0e4
+		return variant1 == variant2 ||
b1a0e4
+			(variant1 && variant2 && g_variant_equal (variant1, variant2));
b1a0e4
+	}
b1a0e4
+
b1a0e4
+	return FALSE;
b1a0e4
+}
b1a0e4
+
b1a0e4
+static void
b1a0e4
+e_signal_connect_notify_cb (gpointer instance,
b1a0e4
+			    GParamSpec *param,
b1a0e4
+			    gpointer user_data)
b1a0e4
+{
b1a0e4
+	EConnectNotifyData *connect_data = user_data;
b1a0e4
+	GValue *value;
b1a0e4
+
b1a0e4
+	g_return_if_fail (connect_data != NULL);
b1a0e4
+
b1a0e4
+	value = g_new0 (GValue, 1);
b1a0e4
+	g_value_init (value, param->value_type);
b1a0e4
+	g_object_get_property (instance, param->name, value);
b1a0e4
+
b1a0e4
+	if (!e_value_equal (connect_data->old_value, value)) {
b1a0e4
+		typedef void (* NotifyCBType) (gpointer instance, GParamSpec *param, gpointer user_data);
b1a0e4
+		NotifyCBType c_handler = (NotifyCBType) connect_data->c_handler;
b1a0e4
+
b1a0e4
+		if (connect_data->old_value) {
b1a0e4
+			g_value_unset (connect_data->old_value);
b1a0e4
+			g_free (connect_data->old_value);
b1a0e4
+		}
b1a0e4
+		connect_data->old_value = value;
b1a0e4
+
b1a0e4
+		if (connect_data->flags == G_CONNECT_SWAPPED) {
b1a0e4
+			c_handler (connect_data->user_data, param, instance);
b1a0e4
+		} else {
b1a0e4
+			c_handler (instance, param, connect_data->user_data);
b1a0e4
+		}
b1a0e4
+	} else {
b1a0e4
+		g_value_unset (value);
b1a0e4
+		g_free (value);
b1a0e4
+	}
b1a0e4
+}
b1a0e4
+
b1a0e4
+/**
b1a0e4
+ * e_signal_connect_notify:
b1a0e4
+ *
b1a0e4
+ * This installs a special handler in front of @c_handler, which will
b1a0e4
+ * call the @c_handler only if the property value changed since the last
b1a0e4
+ * time it was checked. Due to this, these handlers cannot be disconnected
b1a0e4
+ * by by any of the g_signal_handlers_* functions, but only with the returned
b1a0e4
+ * handler ID. A convenient e_signal_disconnect_notify_handler() was added
b1a0e4
+ * to make it easier.
b1a0e4
+ **/
b1a0e4
+gulong
b1a0e4
+e_signal_connect_notify (gpointer instance,
b1a0e4
+			 const gchar *notify_name,
b1a0e4
+			 GCallback c_handler,
b1a0e4
+			 gpointer user_data)
b1a0e4
+{
b1a0e4
+	EConnectNotifyData *connect_data;
b1a0e4
+
b1a0e4
+	g_return_val_if_fail (g_str_has_prefix (notify_name, "notify::"), 0);
b1a0e4
+
b1a0e4
+	connect_data = e_connect_notify_data_new (c_handler, user_data, 0);
b1a0e4
+
b1a0e4
+	return g_signal_connect_data (instance,
b1a0e4
+				      notify_name,
b1a0e4
+				      G_CALLBACK (e_signal_connect_notify_cb),
b1a0e4
+				      connect_data,
b1a0e4
+				      (GClosureNotify) e_connect_notify_data_free,
b1a0e4
+				      0);
b1a0e4
+}
b1a0e4
+
b1a0e4
+/**
b1a0e4
+ * e_signal_connect_notify_after:
b1a0e4
+ *
b1a0e4
+ * This installs a special handler in front of @c_handler, which will
b1a0e4
+ * call the @c_handler only if the property value changed since the last
b1a0e4
+ * time it was checked. Due to this, these handlers cannot be disconnected
b1a0e4
+ * by by any of the g_signal_handlers_* functions, but only with the returned
b1a0e4
+ * handler ID. A convenient e_signal_disconnect_notify_handler() was added
b1a0e4
+ * to make it easier.
b1a0e4
+ **/
b1a0e4
+gulong
b1a0e4
+e_signal_connect_notify_after (gpointer instance,
b1a0e4
+			       const gchar *notify_name,
b1a0e4
+			       GCallback c_handler,
b1a0e4
+			       gpointer user_data)
b1a0e4
+{
b1a0e4
+	EConnectNotifyData *connect_data;
b1a0e4
+
b1a0e4
+	g_return_val_if_fail (g_str_has_prefix (notify_name, "notify::"), 0);
b1a0e4
+
b1a0e4
+	connect_data = e_connect_notify_data_new (c_handler, user_data, G_CONNECT_AFTER);
b1a0e4
+
b1a0e4
+	return g_signal_connect_data (instance,
b1a0e4
+				      notify_name,
b1a0e4
+				      G_CALLBACK (e_signal_connect_notify_cb),
b1a0e4
+				      connect_data,
b1a0e4
+				      (GClosureNotify) e_connect_notify_data_free,
b1a0e4
+				      G_CONNECT_AFTER);
b1a0e4
+}
b1a0e4
+
b1a0e4
+/**
b1a0e4
+ * e_signal_connect_notify_swapped:
b1a0e4
+ *
b1a0e4
+ * This installs a special handler in front of @c_handler, which will
b1a0e4
+ * call the @c_handler only if the property value changed since the last
b1a0e4
+ * time it was checked. Due to this, these handlers cannot be disconnected
b1a0e4
+ * by by any of the g_signal_handlers_* functions, but only with the returned
b1a0e4
+ * handler ID. A convenient e_signal_disconnect_notify_handler() was added
b1a0e4
+ * to make it easier.
b1a0e4
+ **/
b1a0e4
+gulong
b1a0e4
+e_signal_connect_notify_swapped (gpointer instance,
b1a0e4
+				 const gchar *notify_name,
b1a0e4
+				 GCallback c_handler,
b1a0e4
+				 gpointer user_data)
b1a0e4
+{
b1a0e4
+	EConnectNotifyData *connect_data;
b1a0e4
+
b1a0e4
+	g_return_val_if_fail (g_str_has_prefix (notify_name, "notify::"), 0);
b1a0e4
+
b1a0e4
+	connect_data = e_connect_notify_data_new (c_handler, user_data, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	return g_signal_connect_data (instance,
b1a0e4
+				      notify_name,
b1a0e4
+				      G_CALLBACK (e_signal_connect_notify_cb),
b1a0e4
+				      connect_data,
b1a0e4
+				      (GClosureNotify) e_connect_notify_data_free,
b1a0e4
+				      0);
b1a0e4
+}
b1a0e4
+
b1a0e4
+/**
b1a0e4
+ * e_signal_connect_notify_object:
b1a0e4
+ *
b1a0e4
+ * This installs a special handler in front of @c_handler, which will
b1a0e4
+ * call the @c_handler only if the property value changed since the last
b1a0e4
+ * time it was checked. Due to this, these handlers cannot be disconnected
b1a0e4
+ * by by any of the g_signal_handlers_* functions, but only with the returned
b1a0e4
+ * handler ID. A convenient e_signal_disconnect_notify_handler() was added
b1a0e4
+ * to make it easier.
b1a0e4
+ **/
b1a0e4
+gulong
b1a0e4
+e_signal_connect_notify_object (gpointer instance,
b1a0e4
+				const gchar *notify_name,
b1a0e4
+				GCallback c_handler,
b1a0e4
+				gpointer gobject,
b1a0e4
+				GConnectFlags connect_flags)
b1a0e4
+{
b1a0e4
+	EConnectNotifyData *connect_data;
b1a0e4
+	GClosure *closure;
b1a0e4
+
b1a0e4
+	g_return_val_if_fail (g_str_has_prefix (notify_name, "notify::"), 0);
b1a0e4
+
b1a0e4
+	if (!gobject) {
b1a0e4
+		if ((connect_flags & G_CONNECT_SWAPPED) != 0)
b1a0e4
+			return e_signal_connect_notify_swapped (instance, notify_name, c_handler, gobject);
b1a0e4
+		else if ((connect_flags & G_CONNECT_AFTER) != 0)
b1a0e4
+			e_signal_connect_notify_after (instance, notify_name, c_handler, gobject);
b1a0e4
+		else
b1a0e4
+			g_warn_if_fail (connect_flags == 0);
b1a0e4
+
b1a0e4
+		return e_signal_connect_notify (instance, notify_name, c_handler, gobject);
b1a0e4
+	}
b1a0e4
+
b1a0e4
+	g_return_val_if_fail (G_IS_OBJECT (gobject), 0);
b1a0e4
+
b1a0e4
+	connect_data = e_connect_notify_data_new (c_handler, gobject, connect_flags & G_CONNECT_SWAPPED);
b1a0e4
+	closure = g_cclosure_new (
b1a0e4
+		G_CALLBACK (e_signal_connect_notify_cb),
b1a0e4
+		connect_data,
b1a0e4
+		(GClosureNotify) e_connect_notify_data_free);
b1a0e4
+
b1a0e4
+	g_object_watch_closure (G_OBJECT (gobject), closure);
b1a0e4
+
b1a0e4
+	return g_signal_connect_closure (instance,
b1a0e4
+					 notify_name,
b1a0e4
+					 closure,
b1a0e4
+					 connect_flags & G_CONNECT_AFTER);
b1a0e4
+}
b1a0e4
+
b1a0e4
+/**
b1a0e4
+ * e_signal_disconnect_notify_handler:
b1a0e4
+ *
b1a0e4
+ * Convenient handler disconnect function to be used with
b1a0e4
+ * returned handler IDs from:
b1a0e4
+ *    e_signal_connect_notify()
b1a0e4
+ *    e_signal_connect_notify_after()
b1a0e4
+ *    e_signal_connect_notify_swapped()
b1a0e4
+ *    e_signal_connect_notify_object()
b1a0e4
+ * but not necessarily only with these functions.
b1a0e4
+ **/
b1a0e4
+void
b1a0e4
+e_signal_disconnect_notify_handler (gpointer instance,
b1a0e4
+				    gulong *handler_id)
b1a0e4
+{
b1a0e4
+	g_return_if_fail (instance != NULL);
b1a0e4
+	g_return_if_fail (handler_id != NULL);
b1a0e4
+
b1a0e4
+	if (!*handler_id)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
+	g_signal_handler_disconnect (instance, *handler_id);
b1a0e4
+	*handler_id = 0;
b1a0e4
+}
b1a0e4
diff -up evolution-3.8.5/e-util/e-misc-utils.h.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-misc-utils.h
b1a0e4
--- evolution-3.8.5/e-util/e-misc-utils.h.labels-gsettings-busy-loop	2014-06-05 12:50:43.382256022 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-misc-utils.h	2014-06-05 12:50:44.146250470 +0200
b1a0e4
@@ -185,6 +185,27 @@ gboolean	e_binding_transform_uid_to_sour
b1a0e4
 
b1a0e4
 gboolean	e_misc_utils_is_help_package_installed (void);
b1a0e4
 
b1a0e4
+gulong		e_signal_connect_notify		(gpointer instance,
b1a0e4
+						 const gchar *notify_name,
b1a0e4
+						 GCallback c_handler,
b1a0e4
+						 gpointer user_data);
b1a0e4
+gulong		e_signal_connect_notify_after	(gpointer instance,
b1a0e4
+						 const gchar *notify_name,
b1a0e4
+						 GCallback c_handler,
b1a0e4
+						 gpointer user_data);
b1a0e4
+gulong		e_signal_connect_notify_swapped	(gpointer instance,
b1a0e4
+						 const gchar *notify_name,
b1a0e4
+						 GCallback c_handler,
b1a0e4
+						 gpointer user_data);
b1a0e4
+gulong		e_signal_connect_notify_object	(gpointer instance,
b1a0e4
+						 const gchar *notify_name,
b1a0e4
+						 GCallback c_handler,
b1a0e4
+						 gpointer gobject,
b1a0e4
+						 GConnectFlags connect_flags);
b1a0e4
+void		e_signal_disconnect_notify_handler
b1a0e4
+						(gpointer instance,
b1a0e4
+						 gulong *handler_id);
b1a0e4
+
b1a0e4
 G_END_DECLS
b1a0e4
 
b1a0e4
 #endif /* E_MISC_UTILS_H */
b1a0e4
diff -up evolution-3.8.5/e-util/e-online-button.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-online-button.c
b1a0e4
--- evolution-3.8.5/e-util/e-online-button.c.labels-gsettings-busy-loop	2013-07-23 14:52:00.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-online-button.c	2014-06-05 12:50:44.146250470 +0200
b1a0e4
@@ -23,6 +23,8 @@
b1a0e4
 
b1a0e4
 #include <glib/gi18n.h>
b1a0e4
 
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
+
b1a0e4
 #define E_ONLINE_BUTTON_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
 	((obj), E_TYPE_ONLINE_BUTTON, EOnlineButtonPrivate))
b1a0e4
@@ -155,11 +157,11 @@ e_online_button_init (EOnlineButton *but
b1a0e4
 	button->priv->image = g_object_ref (widget);
b1a0e4
 	gtk_widget_show (widget);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		button, "notify::online",
b1a0e4
 		G_CALLBACK (online_button_update_tooltip), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		button, "notify::sensitive",
b1a0e4
 		G_CALLBACK (online_button_update_tooltip), NULL);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/e-util/e-paned.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-paned.c
b1a0e4
--- evolution-3.8.5/e-util/e-paned.c.labels-gsettings-busy-loop	2013-07-23 14:52:14.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-paned.c	2014-06-05 12:50:44.146250470 +0200
b1a0e4
@@ -27,6 +27,8 @@
b1a0e4
 
b1a0e4
 #include <glib/gi18n-lib.h>
b1a0e4
 
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
+
b1a0e4
 #define E_PANED_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
 	((obj), E_TYPE_PANED, EPanedPrivate))
b1a0e4
@@ -376,11 +378,11 @@ e_paned_init (EPaned *paned)
b1a0e4
 	paned->priv->proportion = 0.5;
b1a0e4
 	paned->priv->fixed_resize = TRUE;
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		paned, "notify::orientation",
b1a0e4
 		G_CALLBACK (paned_notify_orientation_cb), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		paned, "notify::position",
b1a0e4
 		G_CALLBACK (paned_notify_position_cb), NULL);
b1a0e4
 }
b1a0e4
@@ -472,6 +474,9 @@ e_paned_set_proportion (EPaned *paned,
b1a0e4
 	g_return_if_fail (E_IS_PANED (paned));
b1a0e4
 	g_return_if_fail (CLAMP (proportion, 0.0, 1.0) == proportion);
b1a0e4
 
b1a0e4
+	if (paned->priv->proportion == proportion)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	paned->priv->proportion = proportion;
b1a0e4
 
b1a0e4
 	paned->priv->sync_request = SYNC_REQUEST_PROPORTION;
b1a0e4
diff -up evolution-3.8.5/e-util/e-photo-cache.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-photo-cache.c
b1a0e4
--- evolution-3.8.5/e-util/e-photo-cache.c.labels-gsettings-busy-loop	2013-07-23 14:52:08.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-photo-cache.c	2014-06-05 12:50:44.146250470 +0200
b1a0e4
@@ -708,6 +708,9 @@ e_photo_cache_set_local_only (EPhotoCach
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_PHOTO_CACHE (photo_cache));
b1a0e4
 
b1a0e4
+	if (photo_cache->priv->local_only == local_only)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	photo_cache->priv->local_only = local_only;
b1a0e4
 
b1a0e4
 	/* Reset the cache. */
b1a0e4
diff -up evolution-3.8.5/e-util/e-picture-gallery.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-picture-gallery.c
b1a0e4
--- evolution-3.8.5/e-util/e-picture-gallery.c.labels-gsettings-busy-loop	2013-07-23 14:52:01.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-picture-gallery.c	2014-06-05 12:50:44.146250470 +0200
b1a0e4
@@ -26,6 +26,7 @@
b1a0e4
 #include "e-picture-gallery.h"
b1a0e4
 
b1a0e4
 #include "e-icon-factory.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_PICTURE_GALLERY_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -378,7 +379,7 @@ picture_gallery_constructed (GObject *ob
b1a0e4
 	gtk_target_table_free (targets, n_targets);
b1a0e4
 	gtk_target_list_unref (list);
b1a0e4
 
b1a0e4
-	g_signal_connect (object, "notify::visible", G_CALLBACK (visible_cb), NULL);
b1a0e4
+	e_signal_connect_notify (object, "notify::visible", G_CALLBACK (visible_cb), NULL);
b1a0e4
 }
b1a0e4
 
b1a0e4
 static void
b1a0e4
diff -up evolution-3.8.5/e-util/e-source-config-dialog.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-source-config-dialog.c
b1a0e4
--- evolution-3.8.5/e-util/e-source-config-dialog.c.labels-gsettings-busy-loop	2013-07-23 14:52:02.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-source-config-dialog.c	2014-06-05 12:50:44.146250470 +0200
b1a0e4
@@ -21,6 +21,7 @@
b1a0e4
 #include "e-alert-bar.h"
b1a0e4
 #include "e-alert-dialog.h"
b1a0e4
 #include "e-alert-sink.h"
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 
b1a0e4
 #define E_SOURCE_CONFIG_DIALOG_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
@@ -270,7 +271,7 @@ source_config_dialog_constructed (GObjec
b1a0e4
 	priv->alert_bar = g_object_ref (widget);
b1a0e4
 	/* EAlertBar controls its own visibility. */
b1a0e4
 
b1a0e4
-	handler_id = g_signal_connect (
b1a0e4
+	handler_id = e_signal_connect_notify (
b1a0e4
 		priv->alert_bar, "notify::visible",
b1a0e4
 		G_CALLBACK (source_config_alert_bar_visible_cb), object);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-spell-entry.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-spell-entry.c
b1a0e4
--- evolution-3.8.5/e-util/e-spell-entry.c.labels-gsettings-busy-loop	2013-07-23 14:52:01.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-spell-entry.c	2014-06-05 12:50:44.147250469 +0200
b1a0e4
@@ -27,6 +27,7 @@
b1a0e4
 #include <editor/gtkhtml-spell-language.h>
b1a0e4
 #include <editor/gtkhtml-spell-checker.h>
b1a0e4
 
b1a0e4
+#include "e-misc-utils.h"
b1a0e4
 #include "e-spell-entry.h"
b1a0e4
 
b1a0e4
 #define E_SPELL_ENTRY_GET_PRIVATE(obj) \
b1a0e4
@@ -879,7 +880,7 @@ e_spell_entry_init (ESpellEntry *spell_e
b1a0e4
 	g_signal_connect (
b1a0e4
 		spell_entry, "changed",
b1a0e4
 		G_CALLBACK (spell_entry_changed), NULL);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		spell_entry, "notify::scroll-offset",
b1a0e4
 		G_CALLBACK (spell_entry_notify_scroll_offset), NULL);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-table.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-table.c
b1a0e4
--- evolution-3.8.5/e-util/e-table.c.labels-gsettings-busy-loop	2013-07-23 14:52:01.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-table.c	2014-06-05 12:50:44.147250469 +0200
b1a0e4
@@ -1134,7 +1134,7 @@ et_build_groups (ETable *et)
b1a0e4
 	g_signal_connect (
b1a0e4
 		et->group, "start_drag",
b1a0e4
 		G_CALLBACK (group_start_drag), et);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		et->group, "notify::is-editing",
b1a0e4
 		G_CALLBACK (group_is_editing_changed_cb), et);
b1a0e4
 
b1a0e4
@@ -1516,7 +1516,7 @@ e_table_setup_table (ETable *e_table,
b1a0e4
 		g_signal_connect (
b1a0e4
 			e_table->click_to_add, "cursor_change",
b1a0e4
 			G_CALLBACK (click_to_add_cursor_change), e_table);
b1a0e4
-		g_signal_connect (
b1a0e4
+		e_signal_connect_notify (
b1a0e4
 			e_table->click_to_add, "notify::is-editing",
b1a0e4
 			G_CALLBACK (click_to_add_is_editing_changed_cb), e_table);
b1a0e4
 	}
b1a0e4
@@ -2376,7 +2376,7 @@ et_set_property (GObject *object,
b1a0e4
 				etable->click_to_add, "cursor_change",
b1a0e4
 				G_CALLBACK (click_to_add_cursor_change),
b1a0e4
 				etable);
b1a0e4
-			g_signal_connect (
b1a0e4
+			e_signal_connect_notify (
b1a0e4
 				etable->click_to_add, "notify::is-editing",
b1a0e4
 				G_CALLBACK (click_to_add_is_editing_changed_cb), etable);
b1a0e4
 		} else {
b1a0e4
diff -up evolution-3.8.5/e-util/e-table-click-to-add.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-table-click-to-add.c
b1a0e4
--- evolution-3.8.5/e-util/e-table-click-to-add.c.labels-gsettings-busy-loop	2013-07-23 14:51:59.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-table-click-to-add.c	2014-06-05 12:50:44.147250469 +0200
b1a0e4
@@ -414,7 +414,7 @@ finish_editing (ETableClickToAdd *etcta)
b1a0e4
 			etcta->row, "key_press",
b1a0e4
 			G_CALLBACK (item_key_press), etcta);
b1a0e4
 
b1a0e4
-		g_signal_connect (
b1a0e4
+		e_signal_connect_notify (
b1a0e4
 			etcta->row, "notify::is-editing",
b1a0e4
 			G_CALLBACK (table_click_to_add_row_is_editing_changed_cb), etcta);
b1a0e4
 
b1a0e4
@@ -471,7 +471,7 @@ etcta_event (GnomeCanvasItem *item,
b1a0e4
 				etcta->row, "key_press",
b1a0e4
 				G_CALLBACK (item_key_press), etcta);
b1a0e4
 
b1a0e4
-			g_signal_connect (
b1a0e4
+			e_signal_connect_notify (
b1a0e4
 				etcta->row, "notify::is-editing",
b1a0e4
 				G_CALLBACK (table_click_to_add_row_is_editing_changed_cb), etcta);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-table-group-leaf.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-table-group-leaf.c
b1a0e4
--- evolution-3.8.5/e-util/e-table-group-leaf.c.labels-gsettings-busy-loop	2013-07-23 14:52:16.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-table-group-leaf.c	2014-06-05 12:50:44.147250469 +0200
b1a0e4
@@ -108,9 +108,7 @@ etgl_dispose (GObject *object)
b1a0e4
 				etgl->item,
b1a0e4
 				etgl->etgl_start_drag_id);
b1a0e4
 
b1a0e4
-		g_signal_handlers_disconnect_by_func (
b1a0e4
-			etgl->item,
b1a0e4
-			etgl_item_is_editing_changed_cb, etgl);
b1a0e4
+		e_signal_disconnect_notify_handler (etgl->item, &etgl->notify_is_editing_id);
b1a0e4
 
b1a0e4
 		etgl->etgl_cursor_change_id = 0;
b1a0e4
 		etgl->etgl_cursor_activated_id = 0;
b1a0e4
@@ -346,7 +344,7 @@ etgl_realize (GnomeCanvasItem *item)
b1a0e4
 		etgl->item, "start_drag",
b1a0e4
 		G_CALLBACK (etgl_start_drag), etgl);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	etgl->notify_is_editing_id = e_signal_connect_notify (
b1a0e4
 		etgl->item, "notify::is-editing",
b1a0e4
 		G_CALLBACK (etgl_item_is_editing_changed_cb), etgl);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/e-util/e-table-group-leaf.h.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-table-group-leaf.h
b1a0e4
--- evolution-3.8.5/e-util/e-table-group-leaf.h.labels-gsettings-busy-loop	2013-07-23 14:52:13.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-table-group-leaf.h	2014-06-05 12:50:44.148250463 +0200
b1a0e4
@@ -91,6 +91,8 @@ struct _ETableGroupLeaf {
b1a0e4
 	gint etgl_start_drag_id;
b1a0e4
 
b1a0e4
 	ESelectionModel *selection_model;
b1a0e4
+
b1a0e4
+	gulong notify_is_editing_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 struct _ETableGroupLeafClass {
b1a0e4
diff -up evolution-3.8.5/e-util/e-tree.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-tree.c
b1a0e4
--- evolution-3.8.5/e-util/e-tree.c.labels-gsettings-busy-loop	2013-08-03 15:22:52.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-tree.c	2014-06-05 12:50:44.148250463 +0200
b1a0e4
@@ -1156,7 +1156,7 @@ et_build_item (ETree *et)
b1a0e4
 	g_signal_connect (
b1a0e4
 		et->priv->item, "start_drag",
b1a0e4
 		G_CALLBACK (item_start_drag), et);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		et->priv->item, "notify::is-editing",
b1a0e4
 		G_CALLBACK (tree_item_is_editing_changed_cb), et);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/e-util/e-web-view.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-web-view.c
b1a0e4
--- evolution-3.8.5/e-util/e-web-view.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.915252151 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-web-view.c	2014-06-05 12:53:23.108084994 +0200
b1a0e4
@@ -72,6 +72,8 @@ struct _EWebViewPrivate {
b1a0e4
 
b1a0e4
 	GSettings *font_settings;
b1a0e4
 	GSettings *aliasing_settings;
b1a0e4
+
b1a0e4
+	GHashTable *old_settings;
b1a0e4
 };
b1a0e4
 
b1a0e4
 enum {
b1a0e4
@@ -704,6 +706,11 @@ web_view_finalize (GObject *object)
b1a0e4
 
b1a0e4
 	priv = E_WEB_VIEW_GET_PRIVATE (object);
b1a0e4
 
b1a0e4
+	if (priv->old_settings) {
b1a0e4
+		g_hash_table_destroy (priv->old_settings);
b1a0e4
+		priv->old_settings = NULL;
b1a0e4
+	}
b1a0e4
+
b1a0e4
 	/* All URI requests should be complete or cancelled by now. */
b1a0e4
 	if (priv->requests != NULL)
b1a0e4
 		g_warning ("Finalizing EWebView with active URI requests");
b1a0e4
@@ -1333,6 +1340,28 @@ web_view_drag_motion (GtkWidget *widget,
b1a0e4
 	return FALSE;
b1a0e4
 }
b1a0e4
 
b1a0e4
+static void
b1a0e4
+e_web_view_test_change_and_update_fonts_cb (EWebView *web_view,
b1a0e4
+					    const gchar *key,
b1a0e4
+					    GSettings *settings)
b1a0e4
+{
b1a0e4
+	GVariant *new_value, *old_value;
b1a0e4
+
b1a0e4
+	new_value = g_settings_get_value (settings, key);
b1a0e4
+	old_value = g_hash_table_lookup (web_view->priv->old_settings, key);
b1a0e4
+
b1a0e4
+	if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) {
b1a0e4
+		if (new_value)
b1a0e4
+			g_hash_table_insert (web_view->priv->old_settings, g_strdup (key), new_value);
b1a0e4
+		else
b1a0e4
+			g_hash_table_remove (web_view->priv->old_settings, key);
b1a0e4
+
b1a0e4
+		e_web_view_update_fonts (web_view);
b1a0e4
+	} else if (new_value) {
b1a0e4
+		g_variant_unref (new_value);
b1a0e4
+	}
b1a0e4
+}
b1a0e4
+
b1a0e4
 static gpointer
b1a0e4
 web_view_disable_webkit_3rd_party_plugins (gpointer unused)
b1a0e4
 {
b1a0e4
@@ -1602,6 +1631,8 @@ e_web_view_init (EWebView *web_view)
b1a0e4
 
b1a0e4
 	web_view->priv = E_WEB_VIEW_GET_PRIVATE (web_view);
b1a0e4
 
b1a0e4
+	web_view->priv->old_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
b1a0e4
+
b1a0e4
 	g_signal_connect (
b1a0e4
 		web_view, "create-plugin-widget",
b1a0e4
 		G_CALLBACK (web_view_create_plugin_widget_cb), NULL);
b1a0e4
@@ -1624,7 +1655,7 @@ e_web_view_init (EWebView *web_view)
b1a0e4
 		web_view, "context-menu",
b1a0e4
 		G_CALLBACK (web_view_context_menu_cb), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		web_view, "notify::load-status",
b1a0e4
 		G_CALLBACK (web_view_load_status_changed_cb), NULL);
b1a0e4
 
b1a0e4
@@ -1645,10 +1676,10 @@ e_web_view_init (EWebView *web_view)
b1a0e4
 	settings = g_settings_new ("org.gnome.desktop.interface");
b1a0e4
 	g_signal_connect_swapped (
b1a0e4
 		settings, "changed::font-name",
b1a0e4
-		G_CALLBACK (e_web_view_update_fonts), web_view);
b1a0e4
+		G_CALLBACK (e_web_view_test_change_and_update_fonts_cb), web_view);
b1a0e4
 	g_signal_connect_swapped (
b1a0e4
 		settings, "changed::monospace-font-name",
b1a0e4
-		G_CALLBACK (e_web_view_update_fonts), web_view);
b1a0e4
+		G_CALLBACK (e_web_view_test_change_and_update_fonts_cb), web_view);
b1a0e4
 	web_view->priv->font_settings = settings;
b1a0e4
 
b1a0e4
 	/* This schema is optional.  Use if available. */
b1a0e4
@@ -1659,7 +1690,7 @@ e_web_view_init (EWebView *web_view)
b1a0e4
 		settings = g_settings_new (id);
b1a0e4
 		g_signal_connect_swapped (
b1a0e4
 			settings, "changed::antialiasing",
b1a0e4
-			G_CALLBACK (e_web_view_update_fonts), web_view);
b1a0e4
+			G_CALLBACK (e_web_view_test_change_and_update_fonts_cb), web_view);
b1a0e4
 		web_view->priv->aliasing_settings = settings;
b1a0e4
 		g_settings_schema_unref (settings_schema);
b1a0e4
 	}
b1a0e4
diff -up evolution-3.8.5/e-util/e-web-view-gtkhtml.c.labels-gsettings-busy-loop evolution-3.8.5/e-util/e-web-view-gtkhtml.c
b1a0e4
--- evolution-3.8.5/e-util/e-web-view-gtkhtml.c.labels-gsettings-busy-loop	2013-07-23 14:52:08.000000000 +0200
b1a0e4
+++ evolution-3.8.5/e-util/e-web-view-gtkhtml.c	2014-06-05 12:50:44.149250456 +0200
b1a0e4
@@ -1793,6 +1793,9 @@ e_web_view_gtkhtml_set_animate (EWebView
b1a0e4
 
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (gtk_html_get_animate (GTK_HTML (web_view)) == animate)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	gtk_html_set_animate (GTK_HTML (web_view), animate);
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "animate");
b1a0e4
@@ -1819,6 +1822,9 @@ e_web_view_gtkhtml_set_caret_mode (EWebV
b1a0e4
 
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (gtk_html_get_caret_mode (GTK_HTML (web_view)) == caret_mode)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	gtk_html_set_caret_mode (GTK_HTML (web_view), caret_mode);
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "caret-mode");
b1a0e4
@@ -1846,6 +1852,9 @@ e_web_view_gtkhtml_set_disable_printing
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (web_view->priv->disable_printing == disable_printing)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	web_view->priv->disable_printing = disable_printing;
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "disable-printing");
b1a0e4
@@ -1865,6 +1874,9 @@ e_web_view_gtkhtml_set_disable_save_to_d
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (web_view->priv->disable_save_to_disk == disable_save_to_disk)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	web_view->priv->disable_save_to_disk = disable_save_to_disk;
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "disable-save-to-disk");
b1a0e4
@@ -1891,6 +1903,9 @@ e_web_view_gtkhtml_set_editable (EWebVie
b1a0e4
 
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (gtk_html_get_editable (GTK_HTML (web_view)) == editable)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	gtk_html_set_editable (GTK_HTML (web_view), editable);
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "editable");
b1a0e4
@@ -1917,6 +1932,9 @@ e_web_view_gtkhtml_set_inline_spelling (
b1a0e4
 
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (gtk_html_get_inline_spelling (GTK_HTML (web_view)) == inline_spelling)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	gtk_html_set_inline_spelling (GTK_HTML (web_view), inline_spelling);
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "inline-spelling");
b1a0e4
@@ -1943,6 +1961,9 @@ e_web_view_gtkhtml_set_magic_links (EWeb
b1a0e4
 
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (gtk_html_get_magic_links (GTK_HTML (web_view)) == magic_links)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	gtk_html_set_magic_links (GTK_HTML (web_view), magic_links);
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "magic-links");
b1a0e4
@@ -1969,6 +1990,9 @@ e_web_view_gtkhtml_set_magic_smileys (EW
b1a0e4
 
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (gtk_html_get_magic_smileys (GTK_HTML (web_view)) == magic_smileys)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	gtk_html_set_magic_smileys (GTK_HTML (web_view), magic_smileys);
b1a0e4
 
b1a0e4
 	g_object_notify (G_OBJECT (web_view), "magic-smileys");
b1a0e4
@@ -1988,6 +2012,9 @@ e_web_view_gtkhtml_set_selected_uri (EWe
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (g_strcmp0 (web_view->priv->selected_uri, selected_uri) == 0)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	g_free (web_view->priv->selected_uri);
b1a0e4
 	web_view->priv->selected_uri = g_strdup (selected_uri);
b1a0e4
 
b1a0e4
@@ -2008,6 +2035,9 @@ e_web_view_gtkhtml_set_cursor_image (EWe
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (web_view->priv->cursor_image == image)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	if (image != NULL)
b1a0e4
 		g_object_ref (image);
b1a0e4
 
b1a0e4
@@ -2033,6 +2063,9 @@ e_web_view_gtkhtml_set_open_proxy (EWebV
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (web_view->priv->open_proxy == open_proxy)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	if (open_proxy != NULL) {
b1a0e4
 		g_return_if_fail (GTK_IS_ACTION (open_proxy));
b1a0e4
 		g_object_ref (open_proxy);
b1a0e4
@@ -2068,6 +2101,9 @@ e_web_view_gtkhtml_set_print_proxy (EWeb
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (web_view->priv->print_proxy == print_proxy)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	if (print_proxy != NULL) {
b1a0e4
 		g_return_if_fail (GTK_IS_ACTION (print_proxy));
b1a0e4
 		g_object_ref (print_proxy);
b1a0e4
@@ -2095,6 +2131,9 @@ e_web_view_gtkhtml_set_save_as_proxy (EW
b1a0e4
 {
b1a0e4
 	g_return_if_fail (E_IS_WEB_VIEW_GTKHTML (web_view));
b1a0e4
 
b1a0e4
+	if (web_view->priv->save_as_proxy == save_as_proxy)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	if (save_as_proxy != NULL) {
b1a0e4
 		g_return_if_fail (GTK_IS_ACTION (save_as_proxy));
b1a0e4
 		g_object_ref (save_as_proxy);
b1a0e4
diff -up evolution-3.8.5/libemail-engine/e-mail-session.c.labels-gsettings-busy-loop evolution-3.8.5/libemail-engine/e-mail-session.c
b1a0e4
--- evolution-3.8.5/libemail-engine/e-mail-session.c.labels-gsettings-busy-loop	2013-07-23 14:51:34.000000000 +0200
b1a0e4
+++ evolution-3.8.5/libemail-engine/e-mail-session.c	2014-06-05 12:50:44.149250456 +0200
b1a0e4
@@ -406,6 +406,9 @@ mail_session_set_junk_filter_name (EMail
b1a0e4
 		}
b1a0e4
 	}
b1a0e4
 
b1a0e4
+	if (camel_session_get_junk_filter (CAMEL_SESSION (session)) == junk_filter)
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	camel_session_set_junk_filter (CAMEL_SESSION (session), junk_filter);
b1a0e4
 
b1a0e4
 	/* XXX We emit the "notify" signal in mail_session_notify(). */
b1a0e4
@@ -875,7 +878,7 @@ mail_session_idle_refresh_cb (EMailSessi
b1a0e4
 
b1a0e4
 	/* Listen for network state changes and force a
b1a0e4
 	 * mail store refresh when coming back online. */
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		session, "notify::online",
b1a0e4
 		G_CALLBACK (mail_session_force_refresh), NULL);
b1a0e4
 
b1a0e4
@@ -1130,7 +1133,7 @@ mail_session_constructed (GObject *objec
b1a0e4
 		G_CALLBACK (mail_session_source_disabled_cb), session);
b1a0e4
 	session->priv->source_disabled_handler_id = handler_id;
b1a0e4
 
b1a0e4
-	handler_id = g_signal_connect (
b1a0e4
+	handler_id = e_signal_connect_notify (
b1a0e4
 		registry, "notify::default-mail-account",
b1a0e4
 		G_CALLBACK (mail_session_default_mail_account_cb), session);
b1a0e4
 	session->priv->default_mail_account_handler_id = handler_id;
b1a0e4
diff -up evolution-3.8.5/libemail-engine/mail-config.c.labels-gsettings-busy-loop evolution-3.8.5/libemail-engine/mail-config.c
b1a0e4
--- evolution-3.8.5/libemail-engine/mail-config.c.labels-gsettings-busy-loop	2014-06-05 12:51:47.365791700 +0200
b1a0e4
+++ evolution-3.8.5/libemail-engine/mail-config.c	2014-06-05 12:53:23.108084994 +0200
b1a0e4
@@ -74,11 +74,24 @@ settings_jh_headers_changed (GSettings *
b1a0e4
 	gchar **strv;
b1a0e4
 	gint i;
b1a0e4
 
b1a0e4
+	strv = g_settings_get_strv (settings, "junk-custom-header");
b1a0e4
+	if (key) {
b1a0e4
+		for (i = 0, node = config->jh_header; strv[i] && node; i++, node = g_slist_next (node)) {
b1a0e4
+			if (g_strcmp0 (node->data, strv[i]) != 0)
b1a0e4
+				break;
b1a0e4
+		}
b1a0e4
+
b1a0e4
+		/* both lists are read to the end, thus they are the same */
b1a0e4
+		if (!node && !strv[i]) {
b1a0e4
+			g_strfreev (strv);
b1a0e4
+			return;
b1a0e4
+		}
b1a0e4
+	}
b1a0e4
+
b1a0e4
 	g_slist_foreach (config->jh_header, (GFunc) g_free, NULL);
b1a0e4
 	g_slist_free (config->jh_header);
b1a0e4
 	config->jh_header = NULL;
b1a0e4
 
b1a0e4
-	strv = g_settings_get_strv (settings, "junk-custom-header");
b1a0e4
 	for (i = 0; strv[i] != NULL; i++)
b1a0e4
 		config->jh_header = g_slist_append (config->jh_header, g_strdup (strv[i]));
b1a0e4
 	g_strfreev (strv);
b1a0e4
@@ -109,6 +122,9 @@ settings_jh_check_changed (GSettings *se
b1a0e4
                            const gchar *key,
b1a0e4
                            EMailSession *session)
b1a0e4
 {
b1a0e4
+	if (key && config->jh_check == g_settings_get_boolean (settings, "junk-check-custom-header"))
b1a0e4
+		return;
b1a0e4
+
b1a0e4
 	config->jh_check = g_settings_get_boolean (settings, "junk-check-custom-header");
b1a0e4
 	if (!config->jh_check) {
b1a0e4
 		camel_session_set_junk_headers (
b1a0e4
diff -up evolution-3.8.5/mail/e-mail-config-assistant.c.labels-gsettings-busy-loop evolution-3.8.5/mail/e-mail-config-assistant.c
b1a0e4
--- evolution-3.8.5/mail/e-mail-config-assistant.c.labels-gsettings-busy-loop	2013-07-23 14:51:57.000000000 +0200
b1a0e4
+++ evolution-3.8.5/mail/e-mail-config-assistant.c	2014-06-05 12:50:44.149250456 +0200
b1a0e4
@@ -630,7 +630,7 @@ mail_config_assistant_constructed (GObje
b1a0e4
 		page, "email-address",
b1a0e4
 		G_BINDING_SYNC_CREATE);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		page, "notify::active-backend",
b1a0e4
 		G_CALLBACK (mail_config_assistant_notify_account_backend),
b1a0e4
 		assistant);
b1a0e4
@@ -713,7 +713,7 @@ mail_config_assistant_constructed (GObje
b1a0e4
 		page, "email-address",
b1a0e4
 		G_BINDING_SYNC_CREATE);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		page, "notify::active-backend",
b1a0e4
 		G_CALLBACK (mail_config_assistant_notify_transport_backend),
b1a0e4
 		assistant);
b1a0e4
diff -up evolution-3.8.5/mail/e-mail-display.c.labels-gsettings-busy-loop evolution-3.8.5/mail/e-mail-display.c
b1a0e4
--- evolution-3.8.5/mail/e-mail-display.c.labels-gsettings-busy-loop	2013-07-23 14:51:53.000000000 +0200
b1a0e4
+++ evolution-3.8.5/mail/e-mail-display.c	2014-06-05 12:53:23.109085002 +0200
b1a0e4
@@ -66,6 +66,8 @@ struct _EMailDisplayPrivate {
b1a0e4
 	GHashTable *widgets;
b1a0e4
 
b1a0e4
 	guint scheduled_reload;
b1a0e4
+
b1a0e4
+	GHashTable *old_settings;
b1a0e4
 };
b1a0e4
 
b1a0e4
 enum {
b1a0e4
@@ -571,7 +573,7 @@ plugin_widget_set_parent_element (GtkWid
b1a0e4
 
b1a0e4
 	/* Assign the WebKitDOMElement to "parent_element" data of the GtkWidget
b1a0e4
 	 * and the GtkWidget to "widget" data of the DOM Element */
b1a0e4
-	g_object_set_data (G_OBJECT (widget), "parent_element", element);
b1a0e4
+	g_object_set_data_full (G_OBJECT (widget), "parent_element", g_object_ref (element), g_object_unref);
b1a0e4
 	g_object_set_data (G_OBJECT (element), "widget", widget);
b1a0e4
 
b1a0e4
 	g_object_bind_property (
b1a0e4
@@ -1365,6 +1367,22 @@ mail_display_dispose (GObject *object)
b1a0e4
 }
b1a0e4
 
b1a0e4
 static void
b1a0e4
+mail_display_finalize (GObject *object)
b1a0e4
+{
b1a0e4
+	EMailDisplayPrivate *priv;
b1a0e4
+
b1a0e4
+	priv = E_MAIL_DISPLAY_GET_PRIVATE (object);
b1a0e4
+
b1a0e4
+	if (priv->old_settings) {
b1a0e4
+		g_hash_table_destroy (priv->old_settings);
b1a0e4
+		priv->old_settings = NULL;
b1a0e4
+	}
b1a0e4
+
b1a0e4
+	/* Chain up to parent's finalize() method. */
b1a0e4
+	G_OBJECT_CLASS (e_mail_display_parent_class)->finalize (object);
b1a0e4
+}
b1a0e4
+
b1a0e4
+static void
b1a0e4
 mail_display_constructed (GObject *object)
b1a0e4
 {
b1a0e4
 	e_extensible_load_extensions (E_EXTENSIBLE (object));
b1a0e4
@@ -1486,6 +1504,28 @@ mail_display_set_fonts (EWebView *web_vi
b1a0e4
 }
b1a0e4
 
b1a0e4
 static void
b1a0e4
+e_mail_display_test_change_and_update_fonts_cb (EMailDisplay *mail_display,
b1a0e4
+						const gchar *key,
b1a0e4
+						GSettings *settings)
b1a0e4
+{
b1a0e4
+	GVariant *new_value, *old_value;
b1a0e4
+
b1a0e4
+	new_value = g_settings_get_value (settings, key);
b1a0e4
+	old_value = g_hash_table_lookup (mail_display->priv->old_settings, key);
b1a0e4
+
b1a0e4
+	if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) {
b1a0e4
+		if (new_value)
b1a0e4
+			g_hash_table_insert (mail_display->priv->old_settings, g_strdup (key), new_value);
b1a0e4
+		else
b1a0e4
+			g_hash_table_remove (mail_display->priv->old_settings, key);
b1a0e4
+
b1a0e4
+		e_web_view_update_fonts (E_WEB_VIEW (mail_display));
b1a0e4
+	} else if (new_value) {
b1a0e4
+		g_variant_unref (new_value);
b1a0e4
+	}
b1a0e4
+}
b1a0e4
+
b1a0e4
+static void
b1a0e4
 e_mail_display_class_init (EMailDisplayClass *class)
b1a0e4
 {
b1a0e4
 	GObjectClass *object_class;
b1a0e4
@@ -1499,6 +1539,7 @@ e_mail_display_class_init (EMailDisplayC
b1a0e4
 	object_class->set_property = mail_display_set_property;
b1a0e4
 	object_class->get_property = mail_display_get_property;
b1a0e4
 	object_class->dispose = mail_display_dispose;
b1a0e4
+	object_class->finalize = mail_display_finalize;
b1a0e4
 
b1a0e4
 	widget_class = GTK_WIDGET_CLASS (class);
b1a0e4
 	widget_class->realize = mail_display_realize;
b1a0e4
@@ -1574,6 +1615,8 @@ e_mail_display_init (EMailDisplay *displ
b1a0e4
 
b1a0e4
 	display->priv = E_MAIL_DISPLAY_GET_PRIVATE (display);
b1a0e4
 
b1a0e4
+	display->priv->old_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
b1a0e4
+
b1a0e4
 	/* Set invalid mode so that MODE property initialization is run
b1a0e4
 	 * completely (see e_mail_display_set_mode) */
b1a0e4
 	display->priv->mode = E_MAIL_FORMATTER_MODE_INVALID;
b1a0e4
@@ -1601,28 +1644,28 @@ e_mail_display_init (EMailDisplay *displ
b1a0e4
 	g_signal_connect (
b1a0e4
 		display, "frame-created",
b1a0e4
 		G_CALLBACK (mail_display_frame_created), NULL);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		display, "notify::uri",
b1a0e4
 		G_CALLBACK (mail_display_uri_changed), NULL);
b1a0e4
 
b1a0e4
 	display->priv->settings = g_settings_new ("org.gnome.evolution.mail");
b1a0e4
 	g_signal_connect_swapped (
b1a0e4
 		display->priv->settings , "changed::monospace-font",
b1a0e4
-		G_CALLBACK (e_web_view_update_fonts), display);
b1a0e4
+		G_CALLBACK (e_mail_display_test_change_and_update_fonts_cb), display);
b1a0e4
 	g_signal_connect_swapped (
b1a0e4
 		display->priv->settings , "changed::variable-width-font",
b1a0e4
-		G_CALLBACK (e_web_view_update_fonts), display);
b1a0e4
+		G_CALLBACK (e_mail_display_test_change_and_update_fonts_cb), display);
b1a0e4
 	g_signal_connect_swapped (
b1a0e4
 		display->priv->settings , "changed::use-custom-font",
b1a0e4
-		G_CALLBACK (e_web_view_update_fonts), display);
b1a0e4
+		G_CALLBACK (e_mail_display_test_change_and_update_fonts_cb), display);
b1a0e4
 
b1a0e4
 	e_web_view_update_fonts (E_WEB_VIEW (display));
b1a0e4
 
b1a0e4
 	main_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (display));
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		main_frame, "notify::load-status",
b1a0e4
 		G_CALLBACK (setup_DOM_bindings), NULL);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		main_frame, "notify::load-status",
b1a0e4
 		G_CALLBACK (mail_parts_bind_dom), NULL);
b1a0e4
 
b1a0e4
@@ -1698,37 +1741,60 @@ e_mail_display_set_mode (EMailDisplay *d
b1a0e4
 	display->priv->formatter = formatter;
b1a0e4
 	mail_display_update_formatter_colors (display);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
 		formatter, "notify::image-loading-policy",
b1a0e4
 		G_CALLBACK (formatter_image_loading_policy_changed_cb),
b1a0e4
-		display);
b1a0e4
+		display, 0);
b1a0e4
 
b1a0e4
-	g_object_connect (
b1a0e4
-		formatter,
b1a0e4
-		"swapped-object-signal::notify::charset",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::image-loading-policy",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::mark-citations",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::show-sender-photo",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::show-real-date",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::animate-images",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::text-color",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::body-color",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::citation-color",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::content-color",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::frame-color",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
-		"swapped-object-signal::notify::header-color",
b1a0e4
-			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::charset",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::image-loading-policy",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::mark-citations",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::show-sender-photo",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::show-real-date",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::animate-images",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::text-color",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::body-color",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::citation-color",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::content-color",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::frame-color",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
+		formatter, "notify::header-color",
b1a0e4
+		G_CALLBACK (e_mail_display_reload), display, G_CONNECT_SWAPPED);
b1a0e4
+
b1a0e4
+	g_object_connect (formatter,
b1a0e4
 		"swapped-object-signal::need-redraw",
b1a0e4
 			G_CALLBACK (e_mail_display_reload), display,
b1a0e4
 		NULL);
b1a0e4
diff -up evolution-3.8.5/mail/e-mail-label-list-store.c.labels-gsettings-busy-loop evolution-3.8.5/mail/e-mail-label-list-store.c
b1a0e4
--- evolution-3.8.5/mail/e-mail-label-list-store.c.labels-gsettings-busy-loop	2013-07-23 14:51:54.000000000 +0200
b1a0e4
+++ evolution-3.8.5/mail/e-mail-label-list-store.c	2014-06-05 12:50:44.150250448 +0200
b1a0e4
@@ -36,9 +36,17 @@
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
 	((obj), E_TYPE_MAIL_LABEL_LIST_STORE, EMailLabelListStorePrivate))
b1a0e4
 
b1a0e4
+enum {
b1a0e4
+	CHANGED,
b1a0e4
+	LAST_SIGNAL
b1a0e4
+};
b1a0e4
+
b1a0e4
+static guint signals[LAST_SIGNAL];
b1a0e4
+
b1a0e4
 struct _EMailLabelListStorePrivate {
b1a0e4
 	GHashTable *tag_index;
b1a0e4
 	GSettings *mail_settings;
b1a0e4
+	guint idle_changed_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 static struct {
b1a0e4
@@ -180,6 +188,11 @@ mail_label_list_store_dispose (GObject *
b1a0e4
 
b1a0e4
 	priv = E_MAIL_LABEL_LIST_STORE_GET_PRIVATE (object);
b1a0e4
 
b1a0e4
+	if (priv->idle_changed_id) {
b1a0e4
+		g_source_remove (priv->idle_changed_id);
b1a0e4
+		priv->idle_changed_id = 0;
b1a0e4
+	}
b1a0e4
+
b1a0e4
 	if (priv->mail_settings != NULL) {
b1a0e4
 		g_object_unref (priv->mail_settings);
b1a0e4
 		priv->mail_settings = NULL;
b1a0e4
@@ -204,14 +217,17 @@ mail_label_list_store_finalize (GObject
b1a0e4
 		finalize (object);
b1a0e4
 }
b1a0e4
 
b1a0e4
-static void
b1a0e4
-labels_model_changed_cb (EMailLabelListStore *store)
b1a0e4
+static gboolean
b1a0e4
+labels_model_changed_idle_cb (gpointer user_data)
b1a0e4
 {
b1a0e4
+	EMailLabelListStore *store = user_data;
b1a0e4
 	GPtrArray *array;
b1a0e4
 	GtkTreeIter tmp_iter;
b1a0e4
 	gboolean iter_set;
b1a0e4
 
b1a0e4
-	g_return_if_fail (E_IS_MAIL_LABEL_LIST_STORE (store));
b1a0e4
+	g_return_val_if_fail (E_IS_MAIL_LABEL_LIST_STORE (store), FALSE);
b1a0e4
+
b1a0e4
+	store->priv->idle_changed_id = 0;
b1a0e4
 
b1a0e4
 	/* Make sure we don't enter an infinite synchronizing loop */
b1a0e4
 	g_signal_handlers_block_by_func (
b1a0e4
@@ -249,6 +265,21 @@ labels_model_changed_cb (EMailLabelListS
b1a0e4
 	g_signal_handlers_unblock_by_func (
b1a0e4
 		store->priv->mail_settings,
b1a0e4
 		labels_settings_changed_cb, store);
b1a0e4
+
b1a0e4
+	g_signal_emit (store, signals[CHANGED], 0);
b1a0e4
+
b1a0e4
+	return FALSE;
b1a0e4
+}
b1a0e4
+
b1a0e4
+static void
b1a0e4
+labels_model_changed_cb (EMailLabelListStore *store)
b1a0e4
+{
b1a0e4
+	g_return_if_fail (E_IS_MAIL_LABEL_LIST_STORE (store));
b1a0e4
+
b1a0e4
+	/* do the actual save and signal emission on idle,
b1a0e4
+	   to accumulate as many changes as possible */
b1a0e4
+	if (!store->priv->idle_changed_id)
b1a0e4
+		store->priv->idle_changed_id = g_idle_add (labels_model_changed_idle_cb, store);
b1a0e4
 }
b1a0e4
 
b1a0e4
 static void
b1a0e4
@@ -257,10 +288,50 @@ labels_settings_changed_cb (GSettings *s
b1a0e4
                             gpointer user_data)
b1a0e4
 {
b1a0e4
 	EMailLabelListStore *store;
b1a0e4
+	GtkTreeModel *model;
b1a0e4
+	GtkTreeIter iter;
b1a0e4
+	GHashTable *changed_labels;
b1a0e4
 	gchar **strv;
b1a0e4
 	gint i;
b1a0e4
 
b1a0e4
 	store = E_MAIL_LABEL_LIST_STORE (user_data);
b1a0e4
+	model = GTK_TREE_MODEL (store);
b1a0e4
+
b1a0e4
+	strv = g_settings_get_strv (store->priv->mail_settings, "labels");
b1a0e4
+
b1a0e4
+	/* Check if any label changed first, because GSettings can claim
b1a0e4
+	   change when nothing changed at all */
b1a0e4
+	changed_labels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
b1a0e4
+	if (gtk_tree_model_get_iter_first (model, &iter)) {
b1a0e4
+		do {
b1a0e4
+			gchar *label_str = NULL;
b1a0e4
+
b1a0e4
+			gtk_tree_model_get (model, &iter, 0, &label_str, -1);
b1a0e4
+
b1a0e4
+			if (label_str)
b1a0e4
+				g_hash_table_insert (changed_labels, label_str, NULL);
b1a0e4
+		} while (gtk_tree_model_iter_next (model, &iter));
b1a0e4
+
b1a0e4
+		
b1a0e4
+		for (i = 0; strv[i] != NULL; i++) {
b1a0e4
+			if (!g_hash_table_remove (changed_labels, strv[i])) {
b1a0e4
+				g_hash_table_insert (changed_labels, g_strdup (""), NULL);
b1a0e4
+				break;
b1a0e4
+			}
b1a0e4
+		}
b1a0e4
+	} else {
b1a0e4
+		/* nothing in the store, thus fill it (pretend change) */
b1a0e4
+		g_hash_table_insert (changed_labels, g_strdup (""), NULL);
b1a0e4
+	}
b1a0e4
+
b1a0e4
+	/* Nothing changed */
b1a0e4
+	if (g_hash_table_size (changed_labels) == 0) {
b1a0e4
+		g_hash_table_destroy (changed_labels);
b1a0e4
+		g_strfreev (strv);
b1a0e4
+		return;
b1a0e4
+	}
b1a0e4
+
b1a0e4
+	g_hash_table_destroy (changed_labels);
b1a0e4
 
b1a0e4
 	/* Make sure we don't enter an infinite synchronizing loop */
b1a0e4
 	g_signal_handlers_block_by_func (
b1a0e4
@@ -268,8 +339,6 @@ labels_settings_changed_cb (GSettings *s
b1a0e4
 
b1a0e4
 	gtk_list_store_clear (GTK_LIST_STORE (store));
b1a0e4
 
b1a0e4
-	strv = g_settings_get_strv (store->priv->mail_settings, "labels");
b1a0e4
-
b1a0e4
 	for (i = 0; strv[i] != NULL; i++) {
b1a0e4
 		GtkTreeIter iter;
b1a0e4
 
b1a0e4
@@ -359,6 +428,14 @@ e_mail_label_list_store_class_init (EMai
b1a0e4
 
b1a0e4
 	class->icon_factory = gtk_icon_factory_new ();
b1a0e4
 	gtk_icon_factory_add_default (class->icon_factory);
b1a0e4
+
b1a0e4
+	signals[CHANGED] = g_signal_new (
b1a0e4
+		"changed",
b1a0e4
+		G_OBJECT_CLASS_TYPE (class),
b1a0e4
+		G_SIGNAL_RUN_FIRST,
b1a0e4
+		0, NULL, NULL,
b1a0e4
+		g_cclosure_marshal_VOID__VOID,
b1a0e4
+		G_TYPE_NONE, 0);
b1a0e4
 }
b1a0e4
 
b1a0e4
 static void
b1a0e4
diff -up evolution-3.8.5/mail/e-mail-paned-view.c.labels-gsettings-busy-loop evolution-3.8.5/mail/e-mail-paned-view.c
b1a0e4
--- evolution-3.8.5/mail/e-mail-paned-view.c.labels-gsettings-busy-loop	2013-07-23 14:51:54.000000000 +0200
b1a0e4
+++ evolution-3.8.5/mail/e-mail-paned-view.c	2014-06-05 12:50:44.150250448 +0200
b1a0e4
@@ -1052,7 +1052,7 @@ e_mail_paned_view_init (EMailPanedView *
b1a0e4
 	view->priv = E_MAIL_PANED_VIEW_GET_PRIVATE (view);
b1a0e4
 	view->priv->enable_show_folder = FALSE;
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		view, "notify::group-by-threads",
b1a0e4
 		G_CALLBACK (mail_paned_view_notify_group_by_threads_cb),
b1a0e4
 		NULL);
b1a0e4
diff -up evolution-3.8.5/mail/e-mail-reader.c.labels-gsettings-busy-loop evolution-3.8.5/mail/e-mail-reader.c
b1a0e4
--- evolution-3.8.5/mail/e-mail-reader.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.920252115 +0200
b1a0e4
+++ evolution-3.8.5/mail/e-mail-reader.c	2014-06-05 12:50:44.150250448 +0200
b1a0e4
@@ -4174,7 +4174,7 @@ connect_signals:
b1a0e4
 		display, "key-press-event",
b1a0e4
 		G_CALLBACK (mail_reader_key_press_event_cb), reader);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		display, "notify::load-status",
b1a0e4
 		G_CALLBACK (mail_reader_load_status_changed_cb), reader);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/mail/em-filter-rule.c.labels-gsettings-busy-loop evolution-3.8.5/mail/em-filter-rule.c
b1a0e4
--- evolution-3.8.5/mail/em-filter-rule.c.labels-gsettings-busy-loop	2013-07-23 14:51:56.000000000 +0200
b1a0e4
+++ evolution-3.8.5/mail/em-filter-rule.c	2014-06-05 12:50:44.151250440 +0200
b1a0e4
@@ -658,7 +658,7 @@ get_widget (EFilterRule *fr,
b1a0e4
 
b1a0e4
 	g_object_set_data (G_OBJECT (add), "scrolled-window", scrolledwindow);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		vadj, "notify::upper",
b1a0e4
 		G_CALLBACK (ensure_scrolled_height_cb), scrolledwindow);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/modules/addressbook/e-book-shell-view-private.c.labels-gsettings-busy-loop evolution-3.8.5/modules/addressbook/e-book-shell-view-private.c
b1a0e4
--- evolution-3.8.5/modules/addressbook/e-book-shell-view-private.c.labels-gsettings-busy-loop	2013-07-23 14:51:45.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/addressbook/e-book-shell-view-private.c	2014-06-05 12:50:44.151250440 +0200
b1a0e4
@@ -333,7 +333,7 @@ book_shell_view_activate_selected_source
b1a0e4
 			G_CALLBACK (contacts_removed),
b1a0e4
 			book_shell_view, G_CONNECT_SWAPPED);
b1a0e4
 
b1a0e4
-		g_signal_connect_object (
b1a0e4
+		e_signal_connect_notify_object (
b1a0e4
 			model, "notify::query",
b1a0e4
 			G_CALLBACK (model_query_changed_cb),
b1a0e4
 			book_shell_view, G_CONNECT_SWAPPED);
b1a0e4
@@ -529,7 +529,7 @@ e_book_shell_view_private_init (EBookShe
b1a0e4
 	if (!gal_view_collection_loaded (shell_view_class->view_collection))
b1a0e4
 		book_shell_view_load_view_collection (shell_view_class);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		book_shell_view, "notify::view-id",
b1a0e4
 		G_CALLBACK (book_shell_view_notify_view_id_cb), NULL);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-calendar-preferences.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-calendar-preferences.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-calendar-preferences.c.labels-gsettings-busy-loop	2013-07-23 14:51:48.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-calendar-preferences.c	2014-06-05 12:50:44.151250440 +0200
b1a0e4
@@ -513,7 +513,7 @@ calendar_preferences_construct (ECalenda
b1a0e4
 		widget, "active",
b1a0e4
 		G_BINDING_BIDIRECTIONAL |
b1a0e4
 		G_BINDING_SYNC_CREATE);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_settings, "notify::cal-use-system-timezone",
b1a0e4
 		G_CALLBACK (update_system_tz_widgets), prefs);
b1a0e4
 	update_system_tz_widgets (shell_settings, NULL, prefs);
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-cal-shell-content.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-cal-shell-content.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-cal-shell-content.c.labels-gsettings-busy-loop	2013-07-23 14:51:47.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-cal-shell-content.c	2014-06-05 12:50:44.151250440 +0200
b1a0e4
@@ -415,7 +415,7 @@ cal_shell_content_constructed (GObject *
b1a0e4
 	for (ii = 0; ii < GNOME_CAL_LAST_VIEW; ii++) {
b1a0e4
 		calendar_view = gnome_calendar_get_calendar_view (calendar, ii);
b1a0e4
 
b1a0e4
-		g_signal_connect (
b1a0e4
+		e_signal_connect_notify (
b1a0e4
 			calendar_view, "notify::is-editing",
b1a0e4
 			G_CALLBACK (cal_shell_content_is_editing_changed_cb), shell_view);
b1a0e4
 
b1a0e4
@@ -430,7 +430,7 @@ cal_shell_content_constructed (GObject *
b1a0e4
 		priv->notebook, "page",
b1a0e4
 		G_BINDING_SYNC_CREATE);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		widget, "notify::is-editing",
b1a0e4
 		G_CALLBACK (cal_shell_content_is_editing_changed_cb), shell_view);
b1a0e4
 
b1a0e4
@@ -521,7 +521,7 @@ cal_shell_content_constructed (GObject *
b1a0e4
 			shell_view);
b1a0e4
 	}
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		widget, "notify::is-editing",
b1a0e4
 		G_CALLBACK (cal_shell_content_is_editing_changed_cb), shell_view);
b1a0e4
 
b1a0e4
@@ -537,7 +537,7 @@ cal_shell_content_constructed (GObject *
b1a0e4
 	priv->view_instance = view_instance;
b1a0e4
 
b1a0e4
 	if (!e_shell_get_express_mode (shell)) {
b1a0e4
-		g_signal_connect_swapped (
b1a0e4
+		e_signal_connect_notify_swapped (
b1a0e4
 			shell_view, "notify::view-id",
b1a0e4
 			G_CALLBACK (cal_shell_content_notify_view_id_cb),
b1a0e4
 			object);
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-cal-shell-settings.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-cal-shell-settings.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-cal-shell-settings.c.labels-gsettings-busy-loop	2013-07-23 14:51:47.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-cal-shell-settings.c	2014-06-05 12:50:44.151250440 +0200
b1a0e4
@@ -949,7 +949,7 @@ e_cal_shell_backend_init_settings (EShel
b1a0e4
 		g_object_ref (shell_settings),
b1a0e4
 		(GDestroyNotify) g_object_unref);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_settings, "notify::cal-use-system-timezone",
b1a0e4
 		G_CALLBACK (cal_use_system_timezone_changed_cb), NULL);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-cal-shell-view-private.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-cal-shell-view-private.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-cal-shell-view-private.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.426255699 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-cal-shell-view-private.c	2014-06-05 12:50:44.152250431 +0200
b1a0e4
@@ -484,7 +484,7 @@ e_cal_shell_view_private_init (ECalShell
b1a0e4
 	if (!gal_view_collection_loaded (shell_view_class->view_collection))
b1a0e4
 		cal_shell_view_load_view_collection (shell_view_class);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		cal_shell_view, "notify::view-id",
b1a0e4
 		G_CALLBACK (cal_shell_view_notify_view_id_cb), NULL);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-memo-shell-content.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-memo-shell-content.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-memo-shell-content.c.labels-gsettings-busy-loop	2013-07-23 14:51:46.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-memo-shell-content.c	2014-06-05 12:50:44.152250431 +0200
b1a0e4
@@ -552,7 +552,7 @@ memo_shell_content_constructed (GObject
b1a0e4
 		G_CALLBACK (memo_shell_content_selection_change_cb),
b1a0e4
 		object);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		priv->memo_table, "notify::is-editing",
b1a0e4
 		G_CALLBACK (memo_shell_content_is_editing_changed_cb), shell_view);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-memo-shell-view-private.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-memo-shell-view-private.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-memo-shell-view-private.c.labels-gsettings-busy-loop	2013-07-23 14:51:48.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-memo-shell-view-private.c	2014-06-05 12:50:44.152250431 +0200
b1a0e4
@@ -179,7 +179,7 @@ e_memo_shell_view_private_init (EMemoShe
b1a0e4
 	if (!gal_view_collection_loaded (shell_view_class->view_collection))
b1a0e4
 		memo_shell_view_load_view_collection (shell_view_class);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		memo_shell_view, "notify::view-id",
b1a0e4
 		G_CALLBACK (memo_shell_view_notify_view_id_cb), NULL);
b1a0e4
 }
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-task-shell-content.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-task-shell-content.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-task-shell-content.c.labels-gsettings-busy-loop	2013-07-23 14:51:49.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-task-shell-content.c	2014-06-05 12:50:44.152250431 +0200
b1a0e4
@@ -552,7 +552,7 @@ task_shell_content_constructed (GObject
b1a0e4
 		G_CALLBACK (task_shell_content_selection_change_cb),
b1a0e4
 		object);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		priv->task_table, "notify::is-editing",
b1a0e4
 		G_CALLBACK (task_shell_content_is_editing_changed_cb), shell_view);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/modules/calendar/e-task-shell-view-private.c.labels-gsettings-busy-loop evolution-3.8.5/modules/calendar/e-task-shell-view-private.c
b1a0e4
--- evolution-3.8.5/modules/calendar/e-task-shell-view-private.c.labels-gsettings-busy-loop	2013-07-23 14:51:48.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/calendar/e-task-shell-view-private.c	2014-06-05 12:50:44.152250431 +0200
b1a0e4
@@ -233,7 +233,7 @@ e_task_shell_view_private_init (ETaskShe
b1a0e4
 	if (!gal_view_collection_loaded (shell_view_class->view_collection))
b1a0e4
 		task_shell_view_load_view_collection (shell_view_class);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		task_shell_view, "notify::view-id",
b1a0e4
 		G_CALLBACK (task_shell_view_notify_view_id_cb), NULL);
b1a0e4
 }
b1a0e4
@@ -373,15 +373,15 @@ e_task_shell_view_private_constructed (E
b1a0e4
 		G_BINDING_SYNC_CREATE);
b1a0e4
 
b1a0e4
 	/* Hide Completed Tasks (enable/units/value) */
b1a0e4
-	g_signal_connect_object (
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
 		shell_settings, "notify::cal-hide-completed-tasks",
b1a0e4
 		G_CALLBACK (task_shell_view_schedule_process_completed_tasks),
b1a0e4
 		task_shell_view, G_CONNECT_SWAPPED);
b1a0e4
-	g_signal_connect_object (
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
 		shell_settings, "notify::cal-hide-completed-tasks-units",
b1a0e4
 		G_CALLBACK (task_shell_view_schedule_process_completed_tasks),
b1a0e4
 		task_shell_view, G_CONNECT_SWAPPED);
b1a0e4
-	g_signal_connect_object (
b1a0e4
+	e_signal_connect_notify_object (
b1a0e4
 		shell_settings, "notify::cal-hide-completed-tasks-value",
b1a0e4
 		G_CALLBACK (task_shell_view_schedule_process_completed_tasks),
b1a0e4
 		task_shell_view, G_CONNECT_SWAPPED);
b1a0e4
diff -up evolution-3.8.5/modules/mail/e-mail-shell-view-private.c.labels-gsettings-busy-loop evolution-3.8.5/modules/mail/e-mail-shell-view-private.c
b1a0e4
--- evolution-3.8.5/modules/mail/e-mail-shell-view-private.c.labels-gsettings-busy-loop	2014-06-05 12:50:43.868252492 +0200
b1a0e4
+++ evolution-3.8.5/modules/mail/e-mail-shell-view-private.c	2014-06-05 12:50:44.153250423 +0200
b1a0e4
@@ -599,7 +599,7 @@ e_mail_shell_view_private_init (EMailShe
b1a0e4
 	if (!gal_view_collection_loaded (shell_view_class->view_collection))
b1a0e4
 		mail_shell_view_load_view_collection (shell_view_class);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		mail_shell_view, "notify::view-id",
b1a0e4
 		G_CALLBACK (mail_shell_view_notify_view_id_cb), NULL);
b1a0e4
 }
b1a0e4
@@ -750,17 +750,7 @@ e_mail_shell_view_private_constructed (E
b1a0e4
 		mail_shell_view, G_CONNECT_SWAPPED);
b1a0e4
 
b1a0e4
 	g_signal_connect_object (
b1a0e4
-		label_store, "row-changed",
b1a0e4
-		G_CALLBACK (e_mail_shell_view_update_search_filter),
b1a0e4
-		mail_shell_view, G_CONNECT_SWAPPED);
b1a0e4
-
b1a0e4
-	g_signal_connect_object (
b1a0e4
-		label_store, "row-deleted",
b1a0e4
-		G_CALLBACK (e_mail_shell_view_update_search_filter),
b1a0e4
-		mail_shell_view, G_CONNECT_SWAPPED);
b1a0e4
-
b1a0e4
-	g_signal_connect_object (
b1a0e4
-		label_store, "row-inserted",
b1a0e4
+		label_store, "changed",
b1a0e4
 		G_CALLBACK (e_mail_shell_view_update_search_filter),
b1a0e4
 		mail_shell_view, G_CONNECT_SWAPPED);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/modules/offline-alert/evolution-offline-alert.c.labels-gsettings-busy-loop evolution-3.8.5/modules/offline-alert/evolution-offline-alert.c
b1a0e4
--- evolution-3.8.5/modules/offline-alert/evolution-offline-alert.c.labels-gsettings-busy-loop	2013-07-23 14:51:49.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/offline-alert/evolution-offline-alert.c	2014-06-05 12:50:44.153250423 +0200
b1a0e4
@@ -115,11 +115,11 @@ offline_alert_window_added_cb (GtkApplic
b1a0e4
 	/* Connect these signals after we have the first EShellWindow
b1a0e4
 	 * to avoid false-positive signals during EShell initialization. */
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell, "notify::online",
b1a0e4
 		G_CALLBACK (offline_alert_online_cb), extension);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell, "notify::network-available",
b1a0e4
 		G_CALLBACK (offline_alert_network_available_cb), extension);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/modules/settings/e-settings-mail-formatter.c.labels-gsettings-busy-loop evolution-3.8.5/modules/settings/e-settings-mail-formatter.c
b1a0e4
--- evolution-3.8.5/modules/settings/e-settings-mail-formatter.c.labels-gsettings-busy-loop	2014-06-05 12:52:48.403341562 +0200
b1a0e4
+++ evolution-3.8.5/modules/settings/e-settings-mail-formatter.c	2014-06-05 12:53:23.109085002 +0200
b1a0e4
@@ -33,6 +33,7 @@
b1a0e4
 
b1a0e4
 struct _ESettingsMailFormatterPrivate {
b1a0e4
 	GSettings *settings;
b1a0e4
+	GSList *old_headers;
b1a0e4
 	gulong headers_changed_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
@@ -63,12 +64,31 @@ settings_mail_formatter_headers_changed_
b1a0e4
 	formatter = settings_mail_formatter_get_extensible (extension);
b1a0e4
 
b1a0e4
 	headers = g_settings_get_strv (settings, "headers");
b1a0e4
+	if (key) {
b1a0e4
+		GSList *link;
b1a0e4
+
b1a0e4
+		for (ii = 0, link = extension->priv->old_headers; headers && headers[ii]; ii++, link = g_slist_next (link)) {
b1a0e4
+			if (g_strcmp0 (link->data, headers[ii]) != 0)
b1a0e4
+				break;
b1a0e4
+		}
b1a0e4
+
b1a0e4
+		/* both lists are read to the end, thus they are the same */
b1a0e4
+		if (!headers[ii] && !link) {
b1a0e4
+			g_strfreev (headers);
b1a0e4
+			return;
b1a0e4
+		}
b1a0e4
+	}
b1a0e4
+
b1a0e4
+	g_slist_free_full (extension->priv->old_headers, g_free);
b1a0e4
+	extension->priv->old_headers = NULL;
b1a0e4
 
b1a0e4
 	e_mail_formatter_clear_headers (formatter);
b1a0e4
 	for (ii = 0; headers && headers[ii]; ii++) {
b1a0e4
 		EMailReaderHeader *h;
b1a0e4
 		const gchar *xml = headers[ii];
b1a0e4
 
b1a0e4
+		extension->priv->old_headers = g_slist_prepend (extension->priv->old_headers, g_strdup (xml));
b1a0e4
+
b1a0e4
 		h = e_mail_reader_header_from_xml (xml);
b1a0e4
 		if (h && h->enabled)
b1a0e4
 			e_mail_formatter_add_header (
b1a0e4
@@ -78,6 +98,8 @@ settings_mail_formatter_headers_changed_
b1a0e4
 		e_mail_reader_header_free (h);
b1a0e4
 	}
b1a0e4
 
b1a0e4
+	extension->priv->old_headers = g_slist_reverse (extension->priv->old_headers);
b1a0e4
+
b1a0e4
 	if (!headers || !headers[0])
b1a0e4
 		e_mail_formatter_set_default_headers (formatter);
b1a0e4
 
b1a0e4
@@ -99,6 +121,9 @@ settings_mail_formatter_dispose (GObject
b1a0e4
 		priv->settings = NULL;
b1a0e4
 	}
b1a0e4
 
b1a0e4
+	g_slist_free_full (priv->old_headers, g_free);
b1a0e4
+	priv->old_headers = NULL;
b1a0e4
+
b1a0e4
 	/* Chain up to parent's dispose() method. */
b1a0e4
 	G_OBJECT_CLASS (e_settings_mail_formatter_parent_class)->
b1a0e4
 		dispose (object);
b1a0e4
diff -up evolution-3.8.5/modules/settings/e-settings-web-view-gtkhtml.c.labels-gsettings-busy-loop evolution-3.8.5/modules/settings/e-settings-web-view-gtkhtml.c
b1a0e4
--- evolution-3.8.5/modules/settings/e-settings-web-view-gtkhtml.c.labels-gsettings-busy-loop	2013-07-23 14:51:40.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/settings/e-settings-web-view-gtkhtml.c	2014-06-05 12:50:44.153250423 +0200
b1a0e4
@@ -34,6 +34,13 @@
b1a0e4
 struct _ESettingsWebViewGtkHTMLPrivate {
b1a0e4
 	GtkCssProvider *css_provider;
b1a0e4
 	EShellSettings *shell_settings;
b1a0e4
+
b1a0e4
+	gulong notify_mail_use_custom_fonts_id;
b1a0e4
+	gulong notify_mail_font_monospace_id;
b1a0e4
+	gulong notify_mail_font_variable_id;
b1a0e4
+	gulong notify_mail_mark_citations_id;
b1a0e4
+	gulong notify_mail_citation_color_id;
b1a0e4
+	gulong notify_composer_spell_color_id;
b1a0e4
 };
b1a0e4
 
b1a0e4
 G_DEFINE_DYNAMIC_TYPE (
b1a0e4
@@ -181,32 +188,32 @@ settings_web_view_gtkhtml_realize (GtkWi
b1a0e4
 
b1a0e4
 	/* Reload the style sheet when certain settings change. */
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	extension->priv->notify_mail_use_custom_fonts_id = e_signal_connect_notify_swapped (
b1a0e4
 		shell_settings, "notify::mail-use-custom-fonts",
b1a0e4
 		G_CALLBACK (settings_web_view_gtkhtml_load_style),
b1a0e4
 		extension);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	extension->priv->notify_mail_font_monospace_id = e_signal_connect_notify_swapped (
b1a0e4
 		shell_settings, "notify::mail-font-monospace",
b1a0e4
 		G_CALLBACK (settings_web_view_gtkhtml_load_style),
b1a0e4
 		extension);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	extension->priv->notify_mail_font_variable_id = e_signal_connect_notify_swapped (
b1a0e4
 		shell_settings, "notify::mail-font-variable",
b1a0e4
 		G_CALLBACK (settings_web_view_gtkhtml_load_style),
b1a0e4
 		extension);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	extension->priv->notify_mail_mark_citations_id = e_signal_connect_notify_swapped (
b1a0e4
 		shell_settings, "notify::mail-mark-citations",
b1a0e4
 		G_CALLBACK (settings_web_view_gtkhtml_load_style),
b1a0e4
 		extension);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	extension->priv->notify_mail_citation_color_id = e_signal_connect_notify_swapped (
b1a0e4
 		shell_settings, "notify::mail-citation-color",
b1a0e4
 		G_CALLBACK (settings_web_view_gtkhtml_load_style),
b1a0e4
 		extension);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	extension->priv->notify_composer_spell_color_id = e_signal_connect_notify_swapped (
b1a0e4
 		shell_settings, "notify::composer-spell-color",
b1a0e4
 		G_CALLBACK (settings_web_view_gtkhtml_load_style),
b1a0e4
 		extension);
b1a0e4
@@ -225,9 +232,13 @@ settings_web_view_gtkhtml_dispose (GObje
b1a0e4
 	}
b1a0e4
 
b1a0e4
 	if (priv->shell_settings != NULL) {
b1a0e4
-		g_signal_handlers_disconnect_by_func (
b1a0e4
-			priv->shell_settings,
b1a0e4
-			settings_web_view_gtkhtml_load_style, object);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->shell_settings, &priv->notify_mail_use_custom_fonts_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->shell_settings, &priv->notify_mail_font_monospace_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->shell_settings, &priv->notify_mail_font_variable_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->shell_settings, &priv->notify_mail_mark_citations_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->shell_settings, &priv->notify_mail_citation_color_id);
b1a0e4
+		e_signal_disconnect_notify_handler (priv->shell_settings, &priv->notify_composer_spell_color_id);
b1a0e4
+
b1a0e4
 		g_object_unref (priv->shell_settings);
b1a0e4
 		priv->shell_settings = NULL;
b1a0e4
 	}
b1a0e4
diff -up evolution-3.8.5/modules/startup-wizard/e-mail-config-import-progress-page.c.labels-gsettings-busy-loop evolution-3.8.5/modules/startup-wizard/e-mail-config-import-progress-page.c
b1a0e4
--- evolution-3.8.5/modules/startup-wizard/e-mail-config-import-progress-page.c.labels-gsettings-busy-loop	2013-07-23 14:51:49.000000000 +0200
b1a0e4
+++ evolution-3.8.5/modules/startup-wizard/e-mail-config-import-progress-page.c	2014-06-05 12:50:44.153250423 +0200
b1a0e4
@@ -183,7 +183,7 @@ mail_config_import_progress_page_constru
b1a0e4
 	activity = e_mail_config_import_progress_page_get_activity (page);
b1a0e4
 
b1a0e4
 	/* The activity state affects the "check-complete" result. */
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		activity, "notify::state",
b1a0e4
 		G_CALLBACK (e_mail_config_page_changed), page);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/plugins/mail-to-task/mail-to-task.c.labels-gsettings-busy-loop evolution-3.8.5/plugins/mail-to-task/mail-to-task.c
b1a0e4
--- evolution-3.8.5/plugins/mail-to-task/mail-to-task.c.labels-gsettings-busy-loop	2013-07-23 14:51:37.000000000 +0200
b1a0e4
+++ evolution-3.8.5/plugins/mail-to-task/mail-to-task.c	2014-06-05 12:50:44.153250423 +0200
b1a0e4
@@ -795,7 +795,7 @@ do_manage_comp_idle (struct _manage_comp
b1a0e4
 			/* Force editor's title change */
b1a0e4
 			comp_editor_title_changed (GTK_WIDGET (editor), NULL, mc);
b1a0e4
 
b1a0e4
-			g_signal_connect (
b1a0e4
+			e_signal_connect_notify (
b1a0e4
 				editor, "notify::title",
b1a0e4
 				G_CALLBACK (comp_editor_title_changed), mc);
b1a0e4
 			g_signal_connect (
b1a0e4
diff -up evolution-3.8.5/plugins/publish-calendar/publish-calendar.c.labels-gsettings-busy-loop evolution-3.8.5/plugins/publish-calendar/publish-calendar.c
b1a0e4
--- evolution-3.8.5/plugins/publish-calendar/publish-calendar.c.labels-gsettings-busy-loop	2013-07-23 14:51:37.000000000 +0200
b1a0e4
+++ evolution-3.8.5/plugins/publish-calendar/publish-calendar.c	2014-06-05 12:50:44.154250416 +0200
b1a0e4
@@ -988,10 +988,12 @@ e_plugin_lib_enable (EPlugin *ep,
b1a0e4
 	EShell *shell = e_shell_get_default ();
b1a0e4
 
b1a0e4
 	if (shell) {
b1a0e4
-		g_signal_handlers_disconnect_by_func (shell, G_CALLBACK (online_state_changed), NULL);
b1a0e4
+		static gulong notify_online_id = 0;
b1a0e4
+
b1a0e4
+		e_signal_disconnect_notify_handler (shell, &notify_online_id);
b1a0e4
 		if (enable) {
b1a0e4
 			online = e_shell_get_online (shell);
b1a0e4
-			g_signal_connect (
b1a0e4
+			notify_online_id = e_signal_connect_notify (
b1a0e4
 				shell, "notify::online",
b1a0e4
 				G_CALLBACK (online_state_changed), NULL);
b1a0e4
 		}
b1a0e4
diff -up evolution-3.8.5/shell/e-shell.c.labels-gsettings-busy-loop evolution-3.8.5/shell/e-shell.c
b1a0e4
--- evolution-3.8.5/shell/e-shell.c.labels-gsettings-busy-loop	2013-07-23 14:52:24.000000000 +0200
b1a0e4
+++ evolution-3.8.5/shell/e-shell.c	2014-06-05 12:50:44.154250416 +0200
b1a0e4
@@ -1268,7 +1268,7 @@ e_shell_init (EShell *shell)
b1a0e4
 
b1a0e4
 	shell_parse_debug_string (shell);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell, "notify::online",
b1a0e4
 		G_CALLBACK (shell_notify_online_cb), NULL);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/shell/e-shell-switcher.c.labels-gsettings-busy-loop evolution-3.8.5/shell/e-shell-switcher.c
b1a0e4
--- evolution-3.8.5/shell/e-shell-switcher.c.labels-gsettings-busy-loop	2013-07-23 14:52:25.000000000 +0200
b1a0e4
+++ evolution-3.8.5/shell/e-shell-switcher.c	2014-06-05 12:50:44.154250416 +0200
b1a0e4
@@ -34,6 +34,8 @@
b1a0e4
 #include <glib/gi18n.h>
b1a0e4
 #include <libebackend/libebackend.h>
b1a0e4
 
b1a0e4
+#include <e-util/e-util.h>
b1a0e4
+
b1a0e4
 #define E_SHELL_SWITCHER_GET_PRIVATE(obj) \
b1a0e4
 	(G_TYPE_INSTANCE_GET_PRIVATE \
b1a0e4
 	((obj), E_TYPE_SHELL_SWITCHER, EShellSwitcherPrivate))
b1a0e4
@@ -377,7 +379,7 @@ shell_switcher_screen_changed (GtkWidget
b1a0e4
 
b1a0e4
 	if (settings != NULL) {
b1a0e4
 		priv->settings = g_object_ref (settings);
b1a0e4
-		priv->settings_handler_id = g_signal_connect_swapped (
b1a0e4
+		priv->settings_handler_id = e_signal_connect_notify_swapped (
b1a0e4
 			settings, "notify::gtk-toolbar-style",
b1a0e4
 			G_CALLBACK (shell_switcher_toolbar_style_changed_cb),
b1a0e4
 			widget);
b1a0e4
diff -up evolution-3.8.5/shell/e-shell-window.c.labels-gsettings-busy-loop evolution-3.8.5/shell/e-shell-window.c
b1a0e4
--- evolution-3.8.5/shell/e-shell-window.c.labels-gsettings-busy-loop	2013-08-10 23:38:43.000000000 +0200
b1a0e4
+++ evolution-3.8.5/shell/e-shell-window.c	2014-06-05 12:50:44.154250416 +0200
b1a0e4
@@ -431,7 +431,7 @@ shell_window_construct_menubar (EShellWi
b1a0e4
 		main_menu = child;
b1a0e4
 	}
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (shell_window_menubar_update_new_menu), NULL);
b1a0e4
 
b1a0e4
@@ -568,7 +568,7 @@ shell_window_construct_sidebar (EShellWi
b1a0e4
 	shell_window->priv->sidebar_notebook = g_object_ref (notebook);
b1a0e4
 	gtk_widget_show (notebook);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (shell_window_set_notebook_page), notebook);
b1a0e4
 
b1a0e4
@@ -596,7 +596,7 @@ shell_window_construct_content (EShellWi
b1a0e4
 	shell_window->priv->content_notebook = g_object_ref (widget);
b1a0e4
 	gtk_widget_show (widget);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (shell_window_set_notebook_page), widget);
b1a0e4
 
b1a0e4
@@ -661,7 +661,7 @@ shell_window_construct_taskbar (EShellWi
b1a0e4
 	shell_window->priv->status_notebook = g_object_ref (notebook);
b1a0e4
 	gtk_widget_show (notebook);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (shell_window_set_notebook_page), notebook);
b1a0e4
 
b1a0e4
@@ -743,15 +743,15 @@ shell_window_create_shell_view (EShellWi
b1a0e4
 
b1a0e4
 	/* Listen for changes that affect the shell window. */
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		action, "notify::icon-name",
b1a0e4
 		G_CALLBACK (e_shell_window_update_icon), shell_window);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		shell_view, "notify::title",
b1a0e4
 		G_CALLBACK (e_shell_window_update_title), shell_window);
b1a0e4
 
b1a0e4
-	g_signal_connect_swapped (
b1a0e4
+	e_signal_connect_notify_swapped (
b1a0e4
 		shell_view, "notify::view-id",
b1a0e4
 		G_CALLBACK (e_shell_window_update_view_menu), shell_window);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/shell/e-shell-window-private.c.labels-gsettings-busy-loop evolution-3.8.5/shell/e-shell-window-private.c
b1a0e4
--- evolution-3.8.5/shell/e-shell-window-private.c.labels-gsettings-busy-loop	2013-07-23 14:52:25.000000000 +0200
b1a0e4
+++ evolution-3.8.5/shell/e-shell-window-private.c	2014-06-05 12:50:44.154250416 +0200
b1a0e4
@@ -329,19 +329,19 @@ e_shell_window_private_constructed (EShe
b1a0e4
 
b1a0e4
 	/* Bunch of chores to do when the active view changes. */
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (e_shell_window_update_icon), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (e_shell_window_update_title), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (e_shell_window_update_view_menu), NULL);
b1a0e4
 
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		shell_window, "notify::active-view",
b1a0e4
 		G_CALLBACK (e_shell_window_update_search_menu), NULL);
b1a0e4
 
b1a0e4
diff -up evolution-3.8.5/smime/gui/certificate-manager.c.labels-gsettings-busy-loop evolution-3.8.5/smime/gui/certificate-manager.c
b1a0e4
--- evolution-3.8.5/smime/gui/certificate-manager.c.labels-gsettings-busy-loop	2013-07-23 14:52:23.000000000 +0200
b1a0e4
+++ evolution-3.8.5/smime/gui/certificate-manager.c	2014-06-05 12:50:44.155250410 +0200
b1a0e4
@@ -440,7 +440,7 @@ treeview_add_column (CertPage *cp,
b1a0e4
 	g_signal_connect (
b1a0e4
 		item, "toggled",
b1a0e4
 		G_CALLBACK (header_popup_item_toggled), column);
b1a0e4
-	g_signal_connect (
b1a0e4
+	e_signal_connect_notify (
b1a0e4
 		column, "notify::visible",
b1a0e4
 		G_CALLBACK (treeview_column_visibility_changed), item);
b1a0e4
 }