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