From 7c6d83d950634768372e1a2400f89a67810b993e Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mar 05 2015 13:06:46 +0000 Subject: import evolution-3.8.5-31.el7 --- diff --git a/SOURCES/evolution-3.8.5-cal-source-remove.patch b/SOURCES/evolution-3.8.5-cal-source-remove.patch new file mode 100644 index 0000000..b1f58f1 --- /dev/null +++ b/SOURCES/evolution-3.8.5-cal-source-remove.patch @@ -0,0 +1,161 @@ +diff -up evolution-3.8.5/modules/calendar/e-cal-shell-sidebar.c.cal-source-remove evolution-3.8.5/modules/calendar/e-cal-shell-sidebar.c +--- evolution-3.8.5/modules/calendar/e-cal-shell-sidebar.c.cal-source-remove 2014-12-05 11:04:35.184193529 +0100 ++++ evolution-3.8.5/modules/calendar/e-cal-shell-sidebar.c 2014-12-05 11:04:35.454191152 +0100 +@@ -23,14 +23,15 @@ + #include + #endif + +-#include "e-cal-shell-sidebar.h" +- + #include + #include + + #include "calendar/gui/e-calendar-selector.h" + #include "calendar/gui/misc.h" + ++#include "e-cal-shell-content.h" ++#include "e-cal-shell-sidebar.h" ++ + #define E_CAL_SHELL_SIDEBAR_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_CAL_SHELL_SIDEBAR, ECalShellSidebarPrivate)) +@@ -883,8 +884,29 @@ e_cal_shell_sidebar_remove_source (ECalS + + selector = e_cal_shell_sidebar_get_selector (cal_shell_sidebar); + +- client = e_client_selector_ref_cached_client ( +- E_CLIENT_SELECTOR (selector), source); ++ client = e_client_selector_ref_cached_client (E_CLIENT_SELECTOR (selector), source); ++ if (!client) { ++ EShellView *shell_view; ++ EShellContent *shell_content; ++ ECalModel *model; ++ GList *clients, *link; ++ ++ shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (cal_shell_sidebar)); ++ shell_content = e_shell_view_get_shell_content (shell_view); ++ model = e_cal_shell_content_get_model (E_CAL_SHELL_CONTENT (shell_content)); ++ ++ clients = e_cal_model_list_clients (model); ++ for (link = clients; link; link = g_list_next (link)) { ++ EClient *adept = link->data; ++ ++ if (adept && g_strcmp0 (e_source_get_uid (source), e_source_get_uid (e_client_get_source (adept))) == 0) { ++ client = g_object_ref (adept); ++ break; ++ } ++ } ++ ++ g_list_free_full (clients, g_object_unref); ++ } + + if (client != NULL) { + cal_shell_sidebar_emit_client_removed ( +diff -up evolution-3.8.5/modules/calendar/e-memo-shell-sidebar.c.cal-source-remove evolution-3.8.5/modules/calendar/e-memo-shell-sidebar.c +--- evolution-3.8.5/modules/calendar/e-memo-shell-sidebar.c.cal-source-remove 2014-12-05 11:04:35.185193520 +0100 ++++ evolution-3.8.5/modules/calendar/e-memo-shell-sidebar.c 2014-12-05 11:04:35.454191152 +0100 +@@ -23,8 +23,6 @@ + #include + #endif + +-#include "e-memo-shell-sidebar.h" +- + #include + #include + +@@ -32,6 +30,9 @@ + #include "calendar/gui/e-memo-list-selector.h" + #include "calendar/gui/misc.h" + ++#include "e-memo-shell-content.h" ++#include "e-memo-shell-sidebar.h" ++ + #define E_MEMO_SHELL_SIDEBAR_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MEMO_SHELL_SIDEBAR, EMemoShellSidebarPrivate)) +@@ -766,8 +767,29 @@ e_memo_shell_sidebar_remove_source (EMem + + selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar); + +- client = e_client_selector_ref_cached_client ( +- E_CLIENT_SELECTOR (selector), source); ++ client = e_client_selector_ref_cached_client (E_CLIENT_SELECTOR (selector), source); ++ if (!client) { ++ EShellView *shell_view; ++ EShellContent *shell_content; ++ ECalModel *model; ++ GList *clients, *link; ++ ++ shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (memo_shell_sidebar)); ++ shell_content = e_shell_view_get_shell_content (shell_view); ++ model = e_memo_shell_content_get_memo_model (E_MEMO_SHELL_CONTENT (shell_content)); ++ ++ clients = e_cal_model_list_clients (model); ++ for (link = clients; link; link = g_list_next (link)) { ++ EClient *adept = link->data; ++ ++ if (adept && g_strcmp0 (e_source_get_uid (source), e_source_get_uid (e_client_get_source (adept))) == 0) { ++ client = g_object_ref (adept); ++ break; ++ } ++ } ++ ++ g_list_free_full (clients, g_object_unref); ++ } + + if (client != NULL) { + memo_shell_sidebar_emit_client_removed ( +diff -up evolution-3.8.5/modules/calendar/e-task-shell-sidebar.c.cal-source-remove evolution-3.8.5/modules/calendar/e-task-shell-sidebar.c +--- evolution-3.8.5/modules/calendar/e-task-shell-sidebar.c.cal-source-remove 2014-12-05 11:04:35.185193520 +0100 ++++ evolution-3.8.5/modules/calendar/e-task-shell-sidebar.c 2014-12-05 11:04:35.454191152 +0100 +@@ -23,8 +23,6 @@ + #include + #endif + +-#include "e-task-shell-sidebar.h" +- + #include + #include + +@@ -32,6 +30,9 @@ + #include "calendar/gui/e-task-list-selector.h" + #include "calendar/gui/misc.h" + ++#include "e-task-shell-content.h" ++#include "e-task-shell-sidebar.h" ++ + #define E_TASK_SHELL_SIDEBAR_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_TASK_SHELL_SIDEBAR, ETaskShellSidebarPrivate)) +@@ -766,8 +767,29 @@ e_task_shell_sidebar_remove_source (ETas + + selector = e_task_shell_sidebar_get_selector (task_shell_sidebar); + +- client = e_client_selector_ref_cached_client ( +- E_CLIENT_SELECTOR (selector), source); ++ client = e_client_selector_ref_cached_client (E_CLIENT_SELECTOR (selector), source); ++ if (!client) { ++ EShellView *shell_view; ++ EShellContent *shell_content; ++ ECalModel *model; ++ GList *clients, *link; ++ ++ shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (task_shell_sidebar)); ++ shell_content = e_shell_view_get_shell_content (shell_view); ++ model = e_task_shell_content_get_task_model (E_TASK_SHELL_CONTENT (shell_content)); ++ ++ clients = e_cal_model_list_clients (model); ++ for (link = clients; link; link = g_list_next (link)) { ++ EClient *adept = link->data; ++ ++ if (adept && g_strcmp0 (e_source_get_uid (source), e_source_get_uid (e_client_get_source (adept))) == 0) { ++ client = g_object_ref (adept); ++ break; ++ } ++ } ++ ++ g_list_free_full (clients, g_object_unref); ++ } + + if (client != NULL) { + task_shell_sidebar_emit_client_removed ( diff --git a/SOURCES/evolution-3.8.5-calendar-tooltip-hide.patch b/SOURCES/evolution-3.8.5-calendar-tooltip-hide.patch new file mode 100644 index 0000000..f400310 --- /dev/null +++ b/SOURCES/evolution-3.8.5-calendar-tooltip-hide.patch @@ -0,0 +1,185 @@ +diff -up evolution-3.8.5/calendar/gui/e-calendar-view.c.calendar-tooltip-hide evolution-3.8.5/calendar/gui/e-calendar-view.c +--- evolution-3.8.5/calendar/gui/e-calendar-view.c.calendar-tooltip-hide 2013-08-10 23:38:42.000000000 +0200 ++++ evolution-3.8.5/calendar/gui/e-calendar-view.c 2014-08-25 17:37:19.166154934 +0200 +@@ -1863,26 +1863,31 @@ e_calendar_view_send (ECalendarView *cal + g_object_unref (send_comp); + } + +-static gboolean +-tooltip_grab (GtkWidget *tooltip, +- GdkEvent *key_event, +- ECalendarView *view) ++static void ++tooltip_ungrab (ECalendarView *view, ++ guint32 event_time) + { +- GtkWidget *widget; + GdkDevice *keyboard; +- guint32 event_time; +- +- widget = g_object_get_data (G_OBJECT (view), "tooltip-window"); +- if (widget == NULL) +- return TRUE; +- +- event_time = gdk_event_get_time (key_event); + + while (!g_queue_is_empty (&view->priv->grabbed_keyboards)) { + keyboard = g_queue_pop_head (&view->priv->grabbed_keyboards); + gdk_device_ungrab (keyboard, event_time); + g_object_unref (keyboard); + } ++} ++ ++static gboolean ++tooltip_key_event (GtkWidget *tooltip, ++ GdkEvent *key_event, ++ ECalendarView *view) ++{ ++ GtkWidget *widget; ++ ++ widget = g_object_get_data (G_OBJECT (view), "tooltip-window"); ++ if (widget == NULL) ++ return TRUE; ++ ++ tooltip_ungrab (view, gdk_event_get_time (key_event)); + + gtk_widget_destroy (widget); + g_object_set_data (G_OBJECT (view), "tooltip-window", NULL); +@@ -1949,6 +1954,16 @@ e_calendar_view_move_tip (GtkWidget *wid + gtk_widget_show (widget); + } + ++static void ++tooltip_window_destroyed_cb (gpointer user_data, ++ GObject *gone) ++{ ++ ECalendarView *view = user_data; ++ ++ tooltip_ungrab (view, GDK_CURRENT_TIME); ++ g_object_unref (view); ++} ++ + /* + * It is expected to show the tooltips in this below format + * +@@ -2189,9 +2204,10 @@ e_calendar_view_get_tooltips (const ECal + + g_signal_connect ( + pevent->tooltip, "key-press-event", +- G_CALLBACK (tooltip_grab), data->cal_view); ++ G_CALLBACK (tooltip_key_event), data->cal_view); + pevent->timeout = -1; + ++ g_object_weak_ref (G_OBJECT (pevent->tooltip), tooltip_window_destroyed_cb, g_object_ref (data->cal_view)); + g_object_set_data (G_OBJECT (data->cal_view), "tooltip-window", pevent->tooltip); + g_object_unref (newcomp); + +diff -up evolution-3.8.5/calendar/gui/e-day-view.c.calendar-tooltip-hide evolution-3.8.5/calendar/gui/e-day-view.c +--- evolution-3.8.5/calendar/gui/e-day-view.c.calendar-tooltip-hide 2014-08-25 17:37:19.145154935 +0200 ++++ evolution-3.8.5/calendar/gui/e-day-view.c 2014-08-25 17:38:55.403150856 +0200 +@@ -405,6 +405,7 @@ static void e_day_view_queue_layout (EDa + static void e_day_view_cancel_layout (EDayView *day_view); + static gboolean e_day_view_layout_timeout_cb (gpointer data); + static void tooltip_destroy (EDayView *day_view, GnomeCanvasItem *item); ++static EDayViewEvent *tooltip_get_view_event (EDayView *day_view, gint day, gint event_num); + + enum { + PROP_0, +@@ -4068,7 +4069,13 @@ e_day_view_show_popup_menu (EDayView *da + gint day, + gint event_num) + { +- tooltip_destroy (day_view, NULL); ++ EDayViewEvent *pevent = NULL; ++ ++ if (event_num >= 0) ++ pevent = tooltip_get_view_event (day_view, day, event_num); ++ ++ if (pevent && pevent->canvas_item) ++ tooltip_destroy (day_view, pevent->canvas_item); + + day_view->popup_event_day = day; + day_view->popup_event_num = event_num; +diff -up evolution-3.8.5/calendar/gui/e-week-view.c.calendar-tooltip-hide evolution-3.8.5/calendar/gui/e-week-view.c +--- evolution-3.8.5/calendar/gui/e-week-view.c.calendar-tooltip-hide 2014-08-25 17:37:19.147154935 +0200 ++++ evolution-3.8.5/calendar/gui/e-week-view.c 2014-08-25 17:42:49.982140916 +0200 +@@ -3212,6 +3212,28 @@ tooltip_destroy (EWeekView *week_view, + } + + static gboolean ++e_week_view_handle_tooltip_timeout (gpointer user_data) ++{ ++ ECalendarViewEventData *data = user_data; ++ ++ g_return_val_if_fail (data != NULL, FALSE); ++ ++ return e_calendar_view_get_tooltips (data); ++} ++ ++static void ++e_week_view_destroy_tooltip_timeout_data (gpointer ptr) ++{ ++ ECalendarViewEventData *data = ptr; ++ ++ if (data) { ++ g_object_set_data ((GObject *) data->cal_view, "tooltip-timeout", NULL); ++ g_object_unref (data->cal_view); ++ g_free (data); ++ } ++} ++ ++static gboolean + tooltip_event_cb (GnomeCanvasItem *item, + GdkEvent *event, + EWeekView *view) +@@ -3232,14 +3254,14 @@ tooltip_event_cb (GnomeCanvasItem *item, + pevent->y = ((GdkEventCrossing *) event)->y_root; + pevent->tooltip = NULL; + +- data->cal_view = (ECalendarView *) view; ++ data->cal_view = g_object_ref (view); + data->day = -1; + data->event_num = event_num; + data->get_view_event = (ECalendarViewEvent * (*)(ECalendarView *, int, gint)) tooltip_get_view_event; + pevent->timeout = g_timeout_add_full ( + G_PRIORITY_DEFAULT, 500, +- (GSourceFunc) e_calendar_view_get_tooltips, +- data, (GDestroyNotify) g_free); ++ e_week_view_handle_tooltip_timeout, ++ data, e_week_view_destroy_tooltip_timeout_data); + g_object_set_data ((GObject *) view, "tooltip-timeout", GUINT_TO_POINTER (pevent->timeout)); + + return TRUE; +@@ -3910,14 +3932,14 @@ e_week_view_on_text_item_event (GnomeCan + pevent->y = (gint) event_y_root; + pevent->tooltip = NULL; + +- data->cal_view = (ECalendarView *) week_view; ++ data->cal_view = g_object_ref (week_view); + data->day = -1; + data->event_num = nevent; + data->get_view_event = (ECalendarViewEvent * (*)(ECalendarView *, int, gint)) tooltip_get_view_event; + pevent->timeout = g_timeout_add_full ( + G_PRIORITY_DEFAULT, 500, +- (GSourceFunc) e_calendar_view_get_tooltips, +- data, (GDestroyNotify) g_free); ++ e_week_view_handle_tooltip_timeout, ++ data, e_week_view_destroy_tooltip_timeout_data); + g_object_set_data ((GObject *) week_view, "tooltip-timeout", GUINT_TO_POINTER (pevent->timeout)); + + return TRUE; +@@ -4709,6 +4731,14 @@ e_week_view_show_popup_menu (EWeekView * + GdkEvent *button_event, + gint event_num) + { ++ guint timeout; ++ ++ timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (week_view), "tooltip-timeout")); ++ if (timeout) { ++ g_source_remove (timeout); ++ g_object_set_data (G_OBJECT (week_view), "tooltip-timeout", NULL); ++ } ++ + week_view->popup_event_num = event_num; + + e_calendar_view_popup_event (E_CALENDAR_VIEW (week_view), button_event); diff --git a/SOURCES/evolution-3.8.5-caret-mode-to-body-navigation.patch b/SOURCES/evolution-3.8.5-caret-mode-to-body-navigation.patch new file mode 100644 index 0000000..e6a4864 --- /dev/null +++ b/SOURCES/evolution-3.8.5-caret-mode-to-body-navigation.patch @@ -0,0 +1,18 @@ +diff -up evolution-3.8.5/modules/mail/e-mail-shell-view-private.c.caret-mode-to-body-navigation evolution-3.8.5/modules/mail/e-mail-shell-view-private.c +--- evolution-3.8.5/modules/mail/e-mail-shell-view-private.c.caret-mode-to-body-navigation 2014-08-25 17:53:58.057112608 +0200 ++++ evolution-3.8.5/modules/mail/e-mail-shell-view-private.c 2014-08-25 17:53:58.069112608 +0200 +@@ -322,10 +322,13 @@ mail_shell_view_key_press_event_cb (EMai + case GDK_KEY_Up: + case GDK_KEY_Right: + case GDK_KEY_Down: +- case GDK_KEY_Prior: + case GDK_KEY_Next: + case GDK_KEY_End: + case GDK_KEY_Begin: ++ /* If Caret mode is enabled don't try to process these keys */ ++ if (e_web_view_get_caret_mode (E_WEB_VIEW (mail_display))) ++ return FALSE; ++ case GDK_KEY_Prior: + if (!mail_shell_view_mail_display_needs_key (mail_display, FALSE) && + webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (mail_display)) != + webkit_web_view_get_focused_frame (WEBKIT_WEB_VIEW (mail_display))) { diff --git a/SOURCES/evolution-3.8.5-contact-duplicate-auto-expand.patch b/SOURCES/evolution-3.8.5-contact-duplicate-auto-expand.patch new file mode 100644 index 0000000..7ea433c --- /dev/null +++ b/SOURCES/evolution-3.8.5-contact-duplicate-auto-expand.patch @@ -0,0 +1,340 @@ +diff -up evolution-3.8.5/addressbook/gui/merging/eab-contact-commit-duplicate-detected.ui.contact-duplicate-auto-expand evolution-3.8.5/addressbook/gui/merging/eab-contact-commit-duplicate-detected.ui +--- evolution-3.8.5/addressbook/gui/merging/eab-contact-commit-duplicate-detected.ui.contact-duplicate-auto-expand 2013-03-17 13:46:11.000000000 +0100 ++++ evolution-3.8.5/addressbook/gui/merging/eab-contact-commit-duplicate-detected.ui 2014-08-25 18:27:12.978121991 +0200 +@@ -57,8 +57,18 @@ + 6 + 6 + +- +- True ++ ++ True ++ True ++ GTK_POLICY_NEVER ++ GTK_POLICY_AUTOMATIC ++ GTK_SHADOW_NONE ++ GTK_CORNER_TOP_LEFT ++ ++ ++ True ++ ++ + + + 1 +@@ -135,8 +145,18 @@ + + + +- +- True ++ ++ True ++ True ++ GTK_POLICY_NEVER ++ GTK_POLICY_AUTOMATIC ++ GTK_SHADOW_NONE ++ GTK_CORNER_TOP_LEFT ++ ++ ++ True ++ ++ + + + 1 +diff -up evolution-3.8.5/addressbook/gui/merging/eab-contact-duplicate-detected.ui.contact-duplicate-auto-expand evolution-3.8.5/addressbook/gui/merging/eab-contact-duplicate-detected.ui +--- evolution-3.8.5/addressbook/gui/merging/eab-contact-duplicate-detected.ui.contact-duplicate-auto-expand 2013-03-17 13:46:11.000000000 +0100 ++++ evolution-3.8.5/addressbook/gui/merging/eab-contact-duplicate-detected.ui 2014-08-25 18:27:12.978121991 +0200 +@@ -67,146 +67,152 @@ + + + +- +- True +- True +- GTK_POLICY_NEVER +- GTK_POLICY_AUTOMATIC +- GTK_SHADOW_IN +- GTK_CORNER_TOP_LEFT +- +- +- +- +- 12 +- True +- 5 +- 2 +- False +- 6 +- 12 +- +- +- True +- +- +- 1 +- 2 +- 4 +- 5 +- +- +- +- +- True +- The name or email address of this contact already exists ++ ++ 12 ++ True ++ 5 ++ 2 ++ False ++ 6 ++ 12 ++ ++ ++ True ++ True ++ GTK_POLICY_NEVER ++ GTK_POLICY_AUTOMATIC ++ GTK_SHADOW_NONE ++ GTK_CORNER_TOP_LEFT ++ ++ ++ True ++ ++ ++ ++ ++ 1 ++ 2 ++ 4 ++ 5 ++ ++ ++ ++ ++ True ++ The name or email address of this contact already exists + in this folder. Would you like to add it anyway? +- False +- False +- GTK_JUSTIFY_LEFT +- False +- False +- 0 +- 0.5 +- 0 +- 0 +- +- +- 1 +- 2 +- 0 +- 1 +- fill +- +- +- +- +- True +- Original Contact: +- False +- False +- GTK_JUSTIFY_CENTER +- False +- False +- 0 +- 0.5 +- 0 +- 0 +- +- +- 1 +- 2 +- 3 +- 4 +- fill +- +- +- +- +- True +- New Contact: +- False +- False +- GTK_JUSTIFY_CENTER +- False +- False +- 0 +- 0.5 +- 0 +- 0 +- +- +- 1 +- 2 +- 1 +- 2 +- fill +- +- +- +- +- +- True +- +- +- 1 +- 2 +- 2 +- 3 +- +- +- +- +- True +- 0.5 +- 0 +- 1 +- 0 +- 0 +- 0 +- 0 +- 0 +- +- +- True +- avatar-default +- +- +- +- +- 0 +- 1 +- 0 +- 5 +- fill +- fill +- +- +- +- +- +- +- ++ False ++ False ++ GTK_JUSTIFY_LEFT ++ False ++ False ++ 0 ++ 0.5 ++ 0 ++ 0 ++ ++ ++ 1 ++ 2 ++ 0 ++ 1 ++ fill ++ ++ ++ ++ ++ True ++ Original Contact: ++ False ++ False ++ GTK_JUSTIFY_CENTER ++ False ++ False ++ 0 ++ 0.5 ++ 0 ++ 0 ++ ++ ++ 1 ++ 2 ++ 3 ++ 4 ++ fill ++ ++ ++ ++ ++ True ++ New Contact: ++ False ++ False ++ GTK_JUSTIFY_CENTER ++ False ++ False ++ 0 ++ 0.5 ++ 0 ++ 0 ++ ++ ++ 1 ++ 2 ++ 1 ++ 2 ++ fill ++ ++ ++ ++ ++ ++ True ++ True ++ GTK_POLICY_NEVER ++ GTK_POLICY_AUTOMATIC ++ GTK_SHADOW_NONE ++ GTK_CORNER_TOP_LEFT ++ ++ ++ True ++ ++ ++ ++ ++ 1 ++ 2 ++ 2 ++ 3 ++ ++ ++ ++ ++ True ++ 0.5 ++ 0 ++ 1 ++ 0 ++ 0 ++ 0 ++ 0 ++ 0 ++ ++ ++ True ++ avatar-default ++ ++ ++ ++ ++ 0 ++ 1 ++ 0 ++ 5 ++ fill ++ fill ++ ++ ++ + + + diff --git a/SOURCES/evolution-3.8.5-crash-customize-mail-view.patch b/SOURCES/evolution-3.8.5-crash-customize-mail-view.patch new file mode 100644 index 0000000..47f89b4 --- /dev/null +++ b/SOURCES/evolution-3.8.5-crash-customize-mail-view.patch @@ -0,0 +1,21 @@ +diff -up evolution-3.8.5/e-util/e-table-memory-store.c.crash-customize-mail-view evolution-3.8.5/e-util/e-table-memory-store.c +--- evolution-3.8.5/e-util/e-table-memory-store.c.crash-customize-mail-view 2013-07-23 14:52:06.000000000 +0200 ++++ evolution-3.8.5/e-util/e-table-memory-store.c 2014-08-25 17:30:33.996172102 +0200 +@@ -109,7 +109,7 @@ etms_value_at (ETableModel *etm, + { + ETableMemoryStore *etms = E_TABLE_MEMORY_STORE (etm); + +- return STORE_LOCATOR (etms, col, row); ++ return duplicate_value (etms, col, STORE_LOCATOR (etms, col, row)); + } + + static void +@@ -122,6 +122,8 @@ etms_set_value_at (ETableModel *etm, + + e_table_model_pre_change (etm); + ++ if (val != STORE_LOCATOR (etms, col, row)) ++ free_value (etms, col, STORE_LOCATOR (etms, col, row)); + STORE_LOCATOR (etms, col, row) = duplicate_value (etms, col, val); + + e_table_model_cell_changed (etm, col, row); diff --git a/SOURCES/evolution-3.8.5-crash-mail-header-show.patch b/SOURCES/evolution-3.8.5-crash-mail-header-show.patch new file mode 100644 index 0000000..4c0cfeb --- /dev/null +++ b/SOURCES/evolution-3.8.5-crash-mail-header-show.patch @@ -0,0 +1,19 @@ +diff -up evolution-3.8.5/modules/settings/e-settings-mail-formatter.c.crash-mail-header-show evolution-3.8.5/modules/settings/e-settings-mail-formatter.c +--- evolution-3.8.5/modules/settings/e-settings-mail-formatter.c.crash-mail-header-show 2014-08-25 17:24:50.317186665 +0200 ++++ evolution-3.8.5/modules/settings/e-settings-mail-formatter.c 2014-08-25 17:24:50.323186664 +0200 +@@ -67,13 +67,13 @@ settings_mail_formatter_headers_changed_ + if (key) { + GSList *link; + +- for (ii = 0, link = extension->priv->old_headers; headers && headers[ii]; ii++, link = g_slist_next (link)) { ++ for (ii = 0, link = extension->priv->old_headers; link && 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) { ++ if ((!headers || !headers[ii]) && !link) { + g_strfreev (headers); + return; + } diff --git a/SOURCES/evolution-3.8.5-crash-mail-migration.patch b/SOURCES/evolution-3.8.5-crash-mail-migration.patch new file mode 100644 index 0000000..a2041a1 --- /dev/null +++ b/SOURCES/evolution-3.8.5-crash-mail-migration.patch @@ -0,0 +1,17 @@ +diff -up evolution-3.8.5/shell/e-convert-local-mail.c.crash-mail-migration evolution-3.8.5/shell/e-convert-local-mail.c +--- evolution-3.8.5/shell/e-convert-local-mail.c.crash-mail-migration 2013-07-23 14:52:25.000000000 +0200 ++++ evolution-3.8.5/shell/e-convert-local-mail.c 2014-08-25 18:01:41.317092978 +0200 +@@ -263,6 +263,13 @@ migrate_mbox_to_maildir (EShell *shell, + g_object_unref (maildir_service); + g_thread_unref (thread); + ++ /* Folders can leave notifications in the main loop which would be delivered ++ on idle, but these can be left in the main loop longer than the temporary ++ CamelSession object is alive, which leads to a crash, because of ++ the CamelStore's descendant being freed too early. */ ++ while (g_main_context_pending (NULL)) ++ g_main_context_iteration (NULL, TRUE); ++ + return TRUE; + } + diff --git a/SOURCES/evolution-3.8.5-evolution-convert-add-trailing-slash.patch b/SOURCES/evolution-3.8.5-evolution-convert-add-trailing-slash.patch new file mode 100644 index 0000000..f91a052 --- /dev/null +++ b/SOURCES/evolution-3.8.5-evolution-convert-add-trailing-slash.patch @@ -0,0 +1,39 @@ +diff -up evolution-3.8.5/data/evolution.convert.evolution-convert-add-trailing-slash evolution-3.8.5/data/evolution.convert +--- evolution-3.8.5/data/evolution.convert.evolution-convert-add-trailing-slash 2013-05-10 19:16:18.000000000 +0200 ++++ evolution-3.8.5/data/evolution.convert 2014-11-27 07:50:57.936769683 +0100 +@@ -17,7 +17,7 @@ start-offline = /apps/evolution/shell/st + statusbar-visible = /apps/evolution/shell/view_defaults/statusbar_visible + toolbar-visible = /apps/evolution/shell/view_defaults/toolbar_visible + +-[org.gnome.evolution.window:/org/gnome/evolution/mail/shell/window] ++[org.gnome.evolution.window:/org/gnome/evolution/mail/shell/window/] + height = /apps/evolution/shell/view_defaults/window_height + maximized = /apps/evolution/shell/view_defaults/window_maximized + width = /apps/evolution/shell/view_defaults/window_width +@@ -207,22 +207,22 @@ height = /apps/evolution/mail/mail_brows + maximized = /apps/evolution/mail/mail_browser_maximized + width = /apps/evolution/mail/mail_browser_width + +-[org.gnome.evolution.window:/org/gnome/evolution/mail/filter-window] ++[org.gnome.evolution.window:/org/gnome/evolution/mail/filter-window/] + height = /apps/evolution/mail/filter_editor_height + maximized = /apps/evolution/mail/filter_editor_maximized + width = /apps/evolution/mail/filter_editor_width + +-[org.gnome.evolution.window:/org/gnome/evolution/mail/send-recv-window] ++[org.gnome.evolution.window:/org/gnome/evolution/mail/send-recv-window/] + height = /apps/evolution/mail/send_recv_height + maximized = /apps/evolution/mail/send_recv_maximized + width = /apps/evolution/mail/send_recv_width + +-[org.gnome.evolution.window:/org/gnome/evolution/mail/subscription-window] ++[org.gnome.evolution.window:/org/gnome/evolution/mail/subscription-window/] + height = /apps/evolution/mail/subscription_editor_height + maximized = /apps/evolution/mail/subscription_editor_maximized + width = /apps/evolution/mail/subscription_editor_width + +-[org.gnome.evolution.window:/org/gnome/evolution/mail/vfolder-window] ++[org.gnome.evolution.window:/org/gnome/evolution/mail/vfolder-window/] + height = /apps/evolution/mail/vfolder_editor_height + maximized = /apps/evolution/mail/vfolder_editor_maximized + width = /apps/evolution/mail/vfolder_editor_width diff --git a/SOURCES/evolution-3.8.5-ewebview-limit-zoom.patch b/SOURCES/evolution-3.8.5-ewebview-limit-zoom.patch new file mode 100644 index 0000000..31b1010 --- /dev/null +++ b/SOURCES/evolution-3.8.5-ewebview-limit-zoom.patch @@ -0,0 +1,69 @@ +diff -up evolution-3.8.5/e-util/e-web-view.c.ewebview-limit-zoom evolution-3.8.5/e-util/e-web-view.c +--- evolution-3.8.5/e-util/e-web-view.c.ewebview-limit-zoom 2014-12-01 13:22:53.124559330 +0100 ++++ evolution-3.8.5/e-util/e-web-view.c 2014-12-01 13:23:44.638597493 +0100 +@@ -472,8 +472,13 @@ web_view_load_status_changed_cb (WebKitW + web_view_update_document_highlights (web_view); + + /* Workaround webkit bug https://bugs.webkit.org/show_bug.cgi?id=89553 */ +- e_web_view_zoom_in (web_view); +- e_web_view_zoom_out (web_view); ++ if (webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW (web_view)) > 0.9999) { ++ e_web_view_zoom_out (web_view); ++ e_web_view_zoom_in (web_view); ++ } else { ++ e_web_view_zoom_in (web_view); ++ e_web_view_zoom_out (web_view); ++ } + } + + static void +@@ -2494,7 +2499,8 @@ e_web_view_zoom_in (EWebView *web_view) + { + g_return_if_fail (E_IS_WEB_VIEW (web_view)); + +- webkit_web_view_zoom_in (WEBKIT_WEB_VIEW (web_view)); ++ if (webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW (web_view)) < 4.9999) ++ webkit_web_view_zoom_in (WEBKIT_WEB_VIEW (web_view)); + } + + void +@@ -2502,7 +2508,8 @@ e_web_view_zoom_out (EWebView *web_view) + { + g_return_if_fail (E_IS_WEB_VIEW (web_view)); + +- webkit_web_view_zoom_out (WEBKIT_WEB_VIEW (web_view)); ++ if (webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW (web_view)) > 0.7999) ++ webkit_web_view_zoom_out (WEBKIT_WEB_VIEW (web_view)); + } + + GtkUIManager * +diff -up evolution-3.8.5/mail/e-mail-reader.c.ewebview-limit-zoom evolution-3.8.5/mail/e-mail-reader.c +--- evolution-3.8.5/mail/e-mail-reader.c.ewebview-limit-zoom 2014-12-01 13:23:34.278759905 +0100 ++++ evolution-3.8.5/mail/e-mail-reader.c 2014-12-01 13:23:44.639597455 +0100 +@@ -1864,7 +1864,7 @@ action_mail_zoom_100_cb (GtkAction *acti + + display = e_mail_reader_get_mail_display (reader); + +- webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW (display), 1.0); ++ e_web_view_zoom_100 (E_WEB_VIEW (display)); + } + + static void +@@ -1875,7 +1875,7 @@ action_mail_zoom_in_cb (GtkAction *actio + + display = e_mail_reader_get_mail_display (reader); + +- webkit_web_view_zoom_in (WEBKIT_WEB_VIEW (display)); ++ e_web_view_zoom_in (E_WEB_VIEW (display)); + } + + static void +@@ -1886,7 +1886,7 @@ action_mail_zoom_out_cb (GtkAction *acti + + display = e_mail_reader_get_mail_display (reader); + +- webkit_web_view_zoom_out (WEBKIT_WEB_VIEW (display)); ++ e_web_view_zoom_out (E_WEB_VIEW (display)); + } + + static void diff --git a/SOURCES/evolution-3.8.5-formatter-in-main.patch b/SOURCES/evolution-3.8.5-formatter-in-main.patch new file mode 100644 index 0000000..d2f4745 --- /dev/null +++ b/SOURCES/evolution-3.8.5-formatter-in-main.patch @@ -0,0 +1,122 @@ +diff -up evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c.formatter-in-main evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c +--- evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c.formatter-in-main 2013-07-23 14:51:35.000000000 +0200 ++++ evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c 2014-07-23 17:41:40.399807290 +0200 +@@ -89,11 +89,11 @@ emfe_attachment_bar_get_widget (EMailFor + g_return_val_if_fail (E_MAIL_PART_IS (part, EMailPartAttachmentBar), NULL); + + empab = (EMailPartAttachmentBar *) part; +- widget = e_attachment_bar_new (empab->store); +- g_object_set_data (G_OBJECT (empab->store), "attachment-bar", widget); ++ widget = e_attachment_bar_new (e_mail_part_attachment_bar_get_store (empab)); ++ g_object_set_data (G_OBJECT (e_mail_part_attachment_bar_get_store (empab)), "attachment-bar", widget); + g_object_weak_ref ( + G_OBJECT (widget), +- (GWeakNotify) unset_bar_from_store_data, empab->store); ++ (GWeakNotify) unset_bar_from_store_data, e_mail_part_attachment_bar_get_store (empab)); + + return widget; + } +diff -up evolution-3.8.5/em-format/e-mail-formatter-attachment.c.formatter-in-main evolution-3.8.5/em-format/e-mail-formatter-attachment.c +--- evolution-3.8.5/em-format/e-mail-formatter-attachment.c.formatter-in-main 2013-07-23 14:51:36.000000000 +0200 ++++ evolution-3.8.5/em-format/e-mail-formatter-attachment.c 2014-07-23 17:41:40.399807290 +0200 +@@ -94,7 +94,7 @@ find_attachment_store (EMailPartList *pa + g_free (tmp); + + if (part != NULL) +- store = ((EMailPartAttachmentBar *) part)->store; ++ store = e_mail_part_attachment_bar_get_store ((EMailPartAttachmentBar *) part); + + while (!g_queue_is_empty (&queue)) + e_mail_part_unref (g_queue_pop_head (&queue)); +diff -up evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c.formatter-in-main evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c +--- evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c.formatter-in-main 2013-07-23 14:51:35.000000000 +0200 ++++ evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c 2014-07-23 17:41:40.399807290 +0200 +@@ -28,12 +28,40 @@ + + #include "e-mail-parser-extension.h" + ++struct _EMailPartAttachmentBarPrivate ++{ ++ EAttachmentStore *store; ++}; ++ + static void + mail_part_attachment_bar_free (EMailPart *part) + { + EMailPartAttachmentBar *empab = (EMailPartAttachmentBar *) part; + +- g_clear_object (&empab->store); ++ if (empab->priv) { ++ g_clear_object (&empab->priv->store); ++ g_free (empab->priv); ++ empab->priv = NULL; ++ } ++} ++ ++EAttachmentStore * ++e_mail_part_attachment_bar_get_store (EMailPartAttachmentBar *empab) ++{ ++ g_return_val_if_fail (empab != NULL, NULL); ++ g_return_val_if_fail (empab->priv != NULL, NULL); ++ ++ if (!empab->priv->store) { ++ /* Create the store only on demand. The EMailParser runs in a dedicated ++ thread, but the EAttachmentStore is a GtkWidget descendant, which should ++ be manipulated only from the main/UI thread, thus postpone its creating ++ until it's really needed, which might be during the EMailFormatter run, ++ which runs from the main/UI thread. */ ++ ++ empab->priv->store = E_ATTACHMENT_STORE (e_attachment_store_new ()); ++ } ++ ++ return empab->priv->store; + } + + /******************************************************************************/ +@@ -70,7 +98,7 @@ empe_attachment_bar_parse (EMailParserEx + part, part_id->str, sizeof (EMailPartAttachmentBar), + (GFreeFunc) mail_part_attachment_bar_free); + empab->parent.mime_type = g_strdup ("application/vnd.evolution.widget.attachment-bar"); +- empab->store = E_ATTACHMENT_STORE (e_attachment_store_new ()); ++ empab->priv = g_new0 (EMailPartAttachmentBarPrivate, 1); + g_string_truncate (part_id, len); + + g_queue_push_tail (out_mail_parts, empab); +diff -up evolution-3.8.5/em-format/e-mail-part-attachment-bar.h.formatter-in-main evolution-3.8.5/em-format/e-mail-part-attachment-bar.h +--- evolution-3.8.5/em-format/e-mail-part-attachment-bar.h.formatter-in-main 2013-07-23 14:51:36.000000000 +0200 ++++ evolution-3.8.5/em-format/e-mail-part-attachment-bar.h 2014-07-23 17:41:40.399807290 +0200 +@@ -23,10 +23,14 @@ + + #include + ++typedef struct _EMailPartAttachmentBarPrivate EMailPartAttachmentBarPrivate; ++ + typedef struct _EMailPartAttachmentBar { + EMailPart parent; + +- EAttachmentStore *store; ++ EMailPartAttachmentBarPrivate *priv; + } EMailPartAttachmentBar; + ++EAttachmentStore *e_mail_part_attachment_bar_get_store (EMailPartAttachmentBar *empab); ++ + #endif /* E_MAIL_PART_ATTACHMENT_BAR_H */ +diff -up evolution-3.8.5/mail/e-mail-request.c.formatter-in-main evolution-3.8.5/mail/e-mail-request.c +--- evolution-3.8.5/mail/e-mail-request.c.formatter-in-main 2013-07-23 14:51:56.000000000 +0200 ++++ evolution-3.8.5/mail/e-mail-request.c 2014-07-23 17:41:40.400807290 +0200 +@@ -364,9 +364,12 @@ mail_request_send_async (SoupRequest *re + simple, handle_contact_photo_request, + G_PRIORITY_DEFAULT, cancellable); + } else { +- g_simple_async_result_run_in_thread ( +- simple, handle_mail_request, +- G_PRIORITY_DEFAULT, cancellable); ++ /* Process e-mail mail requests in this thread, which should be ++ the main/UI thread, because any EMailFormatter can create ++ GtkWidget-s, or manipulate with them, which should be always ++ done in the main/UI thread. */ ++ handle_mail_request (simple, G_OBJECT (request), cancellable); ++ g_simple_async_result_complete_in_idle (simple); + } + + g_object_unref (simple); diff --git a/SOURCES/evolution-3.8.5-labels-gsettings-busy-loop.patch b/SOURCES/evolution-3.8.5-labels-gsettings-busy-loop.patch index 5edd315..0a9c04d 100644 --- a/SOURCES/evolution-3.8.5-labels-gsettings-busy-loop.patch +++ b/SOURCES/evolution-3.8.5-labels-gsettings-busy-loop.patch @@ -2248,18 +2248,6 @@ diff -up evolution-3.8.5/modules/calendar/e-task-shell-view-private.c.labels-gse 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/composer-autosave/e-composer-autosave.c.labels-gsettings-busy-loop evolution-3.8.5/modules/composer-autosave/e-composer-autosave.c ---- evolution-3.8.5/modules/composer-autosave/e-composer-autosave.c.labels-gsettings-busy-loop 2013-07-23 14:51:41.000000000 +0200 -+++ evolution-3.8.5/modules/composer-autosave/e-composer-autosave.c 2014-06-05 12:50:44.152250431 +0200 -@@ -191,7 +191,7 @@ composer_autosave_constructed (GObject * - - extensible = e_extension_get_extensible (E_EXTENSION (object)); - -- g_signal_connect_swapped ( -+ e_signal_connect_notify_swapped ( - extensible, "notify::changed", - G_CALLBACK (composer_autosave_changed_cb), object); - } 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 diff --git a/SOURCES/evolution-3.8.5-message-list-select-with-collapsed-threads.patch b/SOURCES/evolution-3.8.5-message-list-select-with-collapsed-threads.patch new file mode 100644 index 0000000..447df62 --- /dev/null +++ b/SOURCES/evolution-3.8.5-message-list-select-with-collapsed-threads.patch @@ -0,0 +1,233 @@ +diff -up evolution-3.8.5/e-util/e-table-item.c.message-list-select-with-collapsed-threads evolution-3.8.5/e-util/e-table-item.c +--- evolution-3.8.5/e-util/e-table-item.c.message-list-select-with-collapsed-threads 2014-08-25 19:05:29.946290850 +0200 ++++ evolution-3.8.5/e-util/e-table-item.c 2014-08-25 19:05:29.995290548 +0200 +@@ -1179,6 +1179,24 @@ eti_unfreeze (ETableItem *eti) + } + } + ++void ++e_table_item_freeze (ETableItem *eti) ++{ ++ if (!eti) ++ return; ++ ++ eti_freeze (eti); ++} ++ ++void ++e_table_item_thaw (ETableItem *eti) ++{ ++ if (!eti) ++ return; ++ ++ eti_unfreeze (eti); ++} ++ + /* + * Callback routine: invoked before the ETableModel suffers a change + */ +diff -up evolution-3.8.5/e-util/e-table-item.h.message-list-select-with-collapsed-threads evolution-3.8.5/e-util/e-table-item.h +--- evolution-3.8.5/e-util/e-table-item.h.message-list-select-with-collapsed-threads 2013-08-03 15:22:52.000000000 +0200 ++++ evolution-3.8.5/e-util/e-table-item.h 2014-08-25 19:05:29.995290548 +0200 +@@ -260,6 +260,9 @@ gboolean e_table_item_is_editing (ETabl + + void e_table_item_cursor_scrolled (ETableItem *eti); + ++void e_table_item_freeze (ETableItem *eti); ++void e_table_item_thaw (ETableItem *eti); ++ + G_END_DECLS + + #endif /* _E_TABLE_ITEM_H_ */ +diff -up evolution-3.8.5/mail/message-list.c.message-list-select-with-collapsed-threads evolution-3.8.5/mail/message-list.c +--- evolution-3.8.5/mail/message-list.c.message-list-select-with-collapsed-threads 2014-08-25 19:05:29.959290770 +0200 ++++ evolution-3.8.5/mail/message-list.c 2014-08-25 19:05:29.996290542 +0200 +@@ -3224,10 +3224,6 @@ build_tree (MessageList *ml, + #ifndef BROKEN_ETREE + ETreePath *top; + #endif +- gchar *saveuid = NULL; +-#ifdef BROKEN_ETREE +- GPtrArray *selected; +-#endif + #ifdef TIMEIT + struct timeval start, end; + gulong diff; +@@ -3247,35 +3243,19 @@ build_tree (MessageList *ml, + ml->tree_root = e_tree_memory_node_insert (E_TREE_MEMORY (etm), NULL, 0, NULL); + } + +- if (ml->cursor_uid) +- saveuid = find_next_selectable (ml); +- + #ifndef BROKEN_ETREE + top = e_tree_model_node_get_first_child (etm, ml->tree_root); + if (top == NULL || changes == NULL) { +-#else +- selected = message_list_get_selected (ml); + #endif ++ if (table_item) ++ e_table_item_freeze (table_item); ++ + e_tree_memory_freeze (E_TREE_MEMORY (etm)); + clear_tree (ml, FALSE); + + build_subtree (ml, ml->tree_root, thread->tree, &row); + +- if (!can_scroll_to_cursor && table_item) +- table_item->queue_show_cursor = FALSE; +- +- e_tree_memory_thaw (E_TREE_MEMORY (etm)); + #ifdef BROKEN_ETREE +- +- /* it's required to thaw & freeze, to propagate changes */ +- e_tree_memory_freeze (E_TREE_MEMORY (etm)); +- +- message_list_set_selected (ml, selected); +- em_utils_uids_free (selected); +- +- if (!can_scroll_to_cursor && table_item) +- table_item->queue_show_cursor = FALSE; +- + e_tree_memory_thaw (E_TREE_MEMORY (etm)); + #else + } else { +@@ -3286,42 +3266,13 @@ build_tree (MessageList *ml, + tree_equal (ml->model, top, thread->tree); + } + #endif +- if (!saveuid && ml->cursor_uid && g_hash_table_lookup (ml->uid_nodemap, ml->cursor_uid)) { +- /* this makes sure a visible node is selected, like when +- * collapsing all nodes and a children had been selected +- */ +- saveuid = g_strdup (ml->cursor_uid); +- } +- +- if (saveuid) { +- ETreePath node = g_hash_table_lookup (ml->uid_nodemap, saveuid); +- if (node == NULL) { +- g_free (ml->cursor_uid); +- ml->cursor_uid = NULL; +- g_signal_emit (ml, message_list_signals[MESSAGE_SELECTED], 0, NULL); +- } else { +- ETree *tree = E_TREE (ml); +- ETreePath parent = node; +- +- while (parent = e_tree_model_node_get_parent (etm, parent), parent) { +- if (!e_tree_node_is_expanded (tree, parent)) +- node = parent; +- } +- +- e_tree_memory_freeze (E_TREE_MEMORY (etm)); + +- e_tree_set_cursor (E_TREE (ml), node); +- +- if (!can_scroll_to_cursor && table_item) +- table_item->queue_show_cursor = FALSE; +- +- e_tree_memory_thaw (E_TREE_MEMORY (etm)); +- } +- g_free (saveuid); +- } else if (ml->cursor_uid && !g_hash_table_lookup (ml->uid_nodemap, ml->cursor_uid)) { +- g_free (ml->cursor_uid); +- ml->cursor_uid = NULL; +- g_signal_emit (ml, message_list_signals[MESSAGE_SELECTED], 0, NULL); ++ if (table_item) { ++ /* Show the cursor unless we're responding to a ++ * "folder-changed" signal from our CamelFolder. */ ++ if (!can_scroll_to_cursor) ++ table_item->queue_show_cursor = FALSE; ++ e_table_item_thaw (table_item); + } + + #ifdef TIMEIT +@@ -4863,6 +4814,9 @@ regen_list_done (struct _regen_list_msg + searching = m->ml->search && *m->ml->search; + + if (m->dotree) { ++ ETableItem *table_item = e_tree_get_item (E_TREE (m->ml)); ++ GPtrArray *selected; ++ gchar *saveuid = NULL; + gboolean forcing_expand_state = m->ml->expand_all || m->ml->collapse_all; + + if (m->ml->just_set_folder) { +@@ -4877,6 +4831,11 @@ regen_list_done (struct _regen_list_msg + if (forcing_expand_state || searching) + e_tree_force_expanded_state (tree, (m->ml->expand_all || searching) ? 1 : -1); + ++ if (m->ml->cursor_uid != NULL) ++ saveuid = find_next_selectable (m->ml); ++ ++ selected = message_list_get_selected (m->ml); ++ + build_tree (m->ml, m->tree, m->changes, m->scroll_to_cursor); + if (m->ml->thread_tree) + camel_folder_thread_messages_unref (m->ml->thread_tree); +@@ -4893,6 +4852,67 @@ regen_list_done (struct _regen_list_msg + + m->ml->expand_all = 0; + m->ml->collapse_all = 0; ++ ++ /* restore cursor position only after the expand state is restored, ++ thus the row numbers will actually match their real rows in UI */ ++ ++ e_table_item_freeze (table_item); ++ ++ message_list_set_selected (m->ml, selected); ++ g_ptr_array_unref (selected); ++ ++ /* Show the cursor unless we're responding to a ++ * "folder-changed" signal from our CamelFolder. */ ++ if (!m->scroll_to_cursor && table_item != NULL) ++ table_item->queue_show_cursor = FALSE; ++ ++ e_table_item_thaw (table_item); ++ ++ if (!saveuid && m->ml->cursor_uid && g_hash_table_lookup (m->ml->uid_nodemap, m->ml->cursor_uid)) { ++ /* this makes sure a visible node is selected, like when ++ * collapsing all nodes and a children had been selected ++ */ ++ saveuid = g_strdup (m->ml->cursor_uid); ++ } ++ ++ if (saveuid) { ++ ETreePath node; ++ ++ node = g_hash_table_lookup (m->ml->uid_nodemap, saveuid); ++ if (node == NULL) { ++ g_free (m->ml->cursor_uid); ++ m->ml->cursor_uid = NULL; ++ g_signal_emit (m->ml, message_list_signals[MESSAGE_SELECTED], 0, NULL); ++ ++ } else { ++ ETree *tree = E_TREE (m->ml); ++ ETreeModel *etm = m->ml->model; ++ ETreePath parent = node; ++ ++ while (parent = e_tree_model_node_get_parent (etm, parent), parent) { ++ if (!e_tree_node_is_expanded (tree, parent)) ++ node = parent; ++ } ++ ++ e_table_item_freeze (table_item); ++ ++ e_tree_set_cursor (E_TREE (m->ml), node); ++ ++ /* Show the cursor unless we're responding to a ++ * "folder-changed" signal from our CamelFolder. */ ++ if (!m->scroll_to_cursor && table_item != NULL) ++ table_item->queue_show_cursor = FALSE; ++ ++ e_table_item_thaw (table_item); ++ } ++ g_free (saveuid); ++ } else if (m->ml->cursor_uid && !g_hash_table_lookup (m->ml->uid_nodemap, m->ml->cursor_uid)) { ++ g_free (m->ml->cursor_uid); ++ m->ml->cursor_uid = NULL; ++ g_signal_emit ( ++ m->ml, ++ message_list_signals[MESSAGE_SELECTED], 0, NULL); ++ } + } else + build_flat (m->ml, m->summary, m->changes); + diff --git a/SOURCES/evolution-3.8.5-reply-with-selection.patch b/SOURCES/evolution-3.8.5-reply-with-selection.patch new file mode 100644 index 0000000..54bbaa2 --- /dev/null +++ b/SOURCES/evolution-3.8.5-reply-with-selection.patch @@ -0,0 +1,59 @@ +diff -up evolution-3.8.5/e-util/e-web-view.c.reply-with-selection evolution-3.8.5/e-util/e-web-view.c +--- evolution-3.8.5/e-util/e-web-view.c.reply-with-selection 2014-07-23 17:47:43.318792162 +0200 ++++ evolution-3.8.5/e-util/e-web-view.c 2014-07-23 17:47:43.327792161 +0200 +@@ -2569,6 +2569,27 @@ e_web_view_update_actions (EWebView *web + g_signal_emit (web_view, signals[UPDATE_ACTIONS], 0); + } + ++static gboolean ++element_is_in_pre_tag (WebKitDOMNode *node) ++{ ++ WebKitDOMElement *element; ++ ++ if (!node) ++ return FALSE; ++ ++ while (element = webkit_dom_node_get_parent_element (node), element) { ++ node = WEBKIT_DOM_NODE (element); ++ ++ if (WEBKIT_DOM_IS_HTML_PRE_ELEMENT (element)) { ++ return TRUE; ++ } else if (WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT (element)) { ++ break; ++ } ++ } ++ ++ return FALSE; ++} ++ + static gchar * + web_view_get_frame_selection_html (WebKitDOMElement *iframe) + { +@@ -2589,6 +2610,9 @@ web_view_get_frame_selection_html (WebKi + + range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL); + if (range != NULL) { ++ gchar *inner_html; ++ WebKitDOMNode *node; ++ + fragment = webkit_dom_range_clone_contents ( + range, NULL); + +@@ -2598,8 +2622,16 @@ web_view_get_frame_selection_html (WebKi + WEBKIT_DOM_NODE (element), + WEBKIT_DOM_NODE (fragment), NULL); + +- return webkit_dom_html_element_get_inner_html ( ++ inner_html = webkit_dom_html_element_get_inner_html ( + WEBKIT_DOM_HTML_ELEMENT (element)); ++ node = webkit_dom_range_get_start_container (range, NULL); ++ if (element_is_in_pre_tag (node)) { ++ gchar *tmp = inner_html; ++ inner_html = g_strconcat ("
", tmp, "
", NULL); ++ g_free (tmp); ++ } ++ ++ return inner_html; + } + } + diff --git a/SOURCES/evolution-3.8.5-restore-restarts-processes.patch b/SOURCES/evolution-3.8.5-restore-restarts-processes.patch new file mode 100644 index 0000000..e9f91d7 --- /dev/null +++ b/SOURCES/evolution-3.8.5-restore-restarts-processes.patch @@ -0,0 +1,62 @@ +diff -up evolution-3.8.5/calendar/alarm-notify/notify-main.c.restore-restarts-processes evolution-3.8.5/calendar/alarm-notify/notify-main.c +--- evolution-3.8.5/calendar/alarm-notify/notify-main.c.restore-restarts-processes 2013-07-23 14:52:26.000000000 +0200 ++++ evolution-3.8.5/calendar/alarm-notify/notify-main.c 2014-12-05 10:34:21.187168876 +0100 +@@ -46,6 +46,18 @@ + + #include "e-util/e-util-private.h" + ++#ifdef G_OS_UNIX ++#include ++ ++static gboolean ++handle_term_signal (gpointer data) ++{ ++ g_application_quit (data); ++ ++ return FALSE; ++} ++#endif ++ + gint + main (gint argc, + gchar **argv) +@@ -114,6 +126,12 @@ main (gint argc, + return 0; + } + ++#ifdef G_OS_UNIX ++ g_unix_signal_add_full ( ++ G_PRIORITY_DEFAULT, SIGTERM, ++ handle_term_signal, alarm_notify_service, NULL); ++#endif ++ + exit_status = g_application_run ( + G_APPLICATION (alarm_notify_service), argc, argv); + +diff -up evolution-3.8.5/modules/backup-restore/evolution-backup-tool.c.restore-restarts-processes evolution-3.8.5/modules/backup-restore/evolution-backup-tool.c +--- evolution-3.8.5/modules/backup-restore/evolution-backup-tool.c.restore-restarts-processes 2013-07-23 14:51:42.000000000 +0200 ++++ evolution-3.8.5/modules/backup-restore/evolution-backup-tool.c 2014-12-05 10:34:21.187168876 +0100 +@@ -684,6 +684,9 @@ restore (const gchar *filename, + if (g_cancellable_is_cancelled (cancellable)) + return; + ++ /* Make full-restart background processes after restore */ ++ run_cmd (EVOLUTION " --force-shutdown"); ++ + txt = _("Reloading registry service"); + + /* wait few seconds, till changes settle */ +diff -up evolution-3.8.5/shell/killev.c.restore-restarts-processes evolution-3.8.5/shell/killev.c +--- evolution-3.8.5/shell/killev.c.restore-restarts-processes 2013-07-23 14:52:25.000000000 +0200 ++++ evolution-3.8.5/shell/killev.c 2014-12-05 10:34:21.187168876 +0100 +@@ -166,6 +166,10 @@ main (gint argc, + kill: + #ifdef KILL_PROCESS_CMD + system (KILL_PROCESS_CMD " -QUIT evolution 2> /dev/null"); ++ system (KILL_PROCESS_CMD " -TERM evolution-alarm-notify 2> /dev/null"); ++ system (KILL_PROCESS_CMD " -QUIT evolution-source-registry 2> /dev/null"); ++ system (KILL_PROCESS_CMD " -QUIT evolution-addressbook-factory 2> /dev/null"); ++ system (KILL_PROCESS_CMD " -QUIT evolution-calendar-factory 2> /dev/null"); + #else + g_printerr ("No \"kill\" command available.\n"); + #endif diff --git a/SOURCES/evolution-3.8.5-smtp-mail-account-dialog-ui-update.patch b/SOURCES/evolution-3.8.5-smtp-mail-account-dialog-ui-update.patch new file mode 100644 index 0000000..e7b0248 --- /dev/null +++ b/SOURCES/evolution-3.8.5-smtp-mail-account-dialog-ui-update.patch @@ -0,0 +1,40 @@ +diff -up evolution-3.8.5/modules/mail-config/e-mail-config-smtp-backend.c.smtp-mail-account-dialog-ui-update evolution-3.8.5/modules/mail-config/e-mail-config-smtp-backend.c +--- evolution-3.8.5/modules/mail-config/e-mail-config-smtp-backend.c.smtp-mail-account-dialog-ui-update 2013-07-23 14:51:42.000000000 +0200 ++++ evolution-3.8.5/modules/mail-config/e-mail-config-smtp-backend.c 2014-08-25 17:34:20.364162510 +0200 +@@ -25,6 +25,7 @@ + #include + + #include ++#include + #include + + #define E_MAIL_CONFIG_SMTP_BACKEND_GET_PRIVATE(obj) \ +@@ -46,6 +47,18 @@ G_DEFINE_DYNAMIC_TYPE ( + E_TYPE_MAIL_CONFIG_SERVICE_BACKEND) + + static void ++server_requires_auth_toggled_cb (GtkToggleButton *toggle, ++ EMailConfigServiceBackend *backend) ++{ ++ EMailConfigServicePage *page; ++ ++ g_return_if_fail (E_IS_MAIL_CONFIG_SERVICE_BACKEND (backend)); ++ ++ page = e_mail_config_service_backend_get_page (backend); ++ e_mail_config_page_changed (E_MAIL_CONFIG_PAGE (page)); ++} ++ ++static void + mail_config_smtp_backend_insert_widgets (EMailConfigServiceBackend *backend, + GtkBox *parent) + { +@@ -126,6 +139,9 @@ mail_config_smtp_backend_insert_widgets + priv->auth_required_toggle = widget; /* do not reference */ + gtk_widget_show (widget); + ++ g_signal_connect_object (widget, "toggled", ++ G_CALLBACK (server_requires_auth_toggled_cb), backend, 0); ++ + text = _("Security"); + markup = g_markup_printf_escaped ("%s", text); + widget = gtk_label_new (markup); diff --git a/SOURCES/evolution-3.8.5-weather-calendar.patch b/SOURCES/evolution-3.8.5-weather-calendar.patch new file mode 100644 index 0000000..d091ec9 --- /dev/null +++ b/SOURCES/evolution-3.8.5-weather-calendar.patch @@ -0,0 +1,133 @@ +diff -up evolution-3.8.5/modules/cal-config-weather/evolution-cal-config-weather.c.weather-calendar evolution-3.8.5/modules/cal-config-weather/evolution-cal-config-weather.c +--- evolution-3.8.5/modules/cal-config-weather/evolution-cal-config-weather.c.weather-calendar 2013-07-23 14:51:42.000000000 +0200 ++++ evolution-3.8.5/modules/cal-config-weather/evolution-cal-config-weather.c 2014-10-08 14:05:31.007469726 +0200 +@@ -69,14 +69,20 @@ cal_config_weather_location_to_string (G + + location = g_value_get_boxed (source_value); + +- if (location != NULL) { +- const gchar *code; +- gchar *city_name; +- +- code = gweather_location_get_code (location); +- city_name = gweather_location_get_city_name (location); +- string = g_strdup_printf ("%s/%s", code, city_name); +- g_free (city_name); ++ while (location && !gweather_location_has_coords (location)) { ++ location = gweather_location_get_parent (location); ++ } ++ ++ if (location) { ++ gdouble latitude, longitude; ++ gchar lat_str[G_ASCII_DTOSTR_BUF_SIZE + 1], lon_str[G_ASCII_DTOSTR_BUF_SIZE + 1]; ++ ++ gweather_location_get_coords (location, &latitude, &longitude); ++ ++ g_ascii_dtostr (lat_str, G_ASCII_DTOSTR_BUF_SIZE, latitude); ++ g_ascii_dtostr (lon_str, G_ASCII_DTOSTR_BUF_SIZE, longitude); ++ ++ string = g_strdup_printf ("%s/%s", lat_str, lon_str); + } + + g_value_take_string (target_value, string); +@@ -84,18 +90,47 @@ cal_config_weather_location_to_string (G + return TRUE; + } + ++static GWeatherLocation * ++cal_config_weather_find_location_by_coords (GWeatherLocation *start, ++ gdouble latitude, ++ gdouble longitude) ++{ ++ GWeatherLocation *location, **children; ++ gint ii; ++ ++ if (!start) ++ return NULL; ++ ++ location = start; ++ if (gweather_location_has_coords (location)) { ++ gdouble lat, lon; ++ ++ gweather_location_get_coords (location, &lat, &lon); ++ ++ if (lat == latitude && lon == longitude) ++ return location; ++ } ++ ++ children = gweather_location_get_children (location); ++ for (ii = 0; children[ii]; ii++) { ++ location = cal_config_weather_find_location_by_coords (children[ii], latitude, longitude); ++ if (location) ++ return location; ++ } ++ ++ return NULL; ++} ++ + static gboolean + cal_config_weather_string_to_location (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer user_data) + { +- GWeatherLocation *world; +- GWeatherLocation *match, *start; ++ GWeatherLocation *world, *match; + const gchar *string; +- const gchar *city_name; +- const gchar *code; + gchar **tokens; ++ gdouble latitude, longitude; + + world = user_data; + +@@ -104,7 +139,7 @@ cal_config_weather_string_to_location (G + if (string == NULL) + return FALSE; + +- /* String is: STATION-CODE '/' CITY-NAME */ ++ /* String is: latitude '/' longitude */ + tokens = g_strsplit (string, "/", 2); + + if (g_strv_length (tokens) != 2) { +@@ -112,35 +147,16 @@ cal_config_weather_string_to_location (G + return FALSE; + } + +- code = tokens[0]; +- city_name = tokens[1]; ++ latitude = g_ascii_strtod (tokens[0], NULL); ++ longitude = g_ascii_strtod (tokens[1], NULL); + +- match = start = gweather_location_find_by_station_code (world, code); +- while (match) { +- gchar *cmp_city_name; +- +- /* Does the city name match? */ +- cmp_city_name = gweather_location_get_city_name (match); +- if (g_strcmp0 (city_name, cmp_city_name) == 0) { +- g_free (cmp_city_name); +- break; +- } +- g_free (cmp_city_name); +- +- /* No match, try parent */ +- match = gweather_location_get_parent (match); +- } +- +- if (match == NULL) { +- /* No exact match, use start instead */ +- match = start; +- } ++ match = cal_config_weather_find_location_by_coords (world, latitude, longitude); + + g_value_set_boxed (target_value, match); + + g_strfreev (tokens); + +- return TRUE; ++ return match != NULL; + } + + static gboolean diff --git a/SPECS/evolution.spec b/SPECS/evolution.spec index 0ad66ee..5432a03 100644 --- a/SPECS/evolution.spec +++ b/SPECS/evolution.spec @@ -31,7 +31,7 @@ Name: evolution Version: 3.8.5 -Release: 22%{?dist}.1 +Release: 31%{?dist} Group: Applications/Productivity Summary: Mail and calendar client for GNOME License: GPLv2+ and GFDL @@ -96,18 +96,63 @@ Patch16: evolution-3.8.5-comp-editor-missing-icon.patch # RH bug #1083584 Patch17: evolution-3.8.5-disconnect-on-network-outage.patch -# RH bug #1097268 +# RH bug #1070764 Patch18: evolution-3.8.5-auto-mark-as-seen.patch -# RH bug #1097269 +# RH bug #1084414 Patch19: evolution-3.8.5-memory-leaks.patch -# RH bug #1097270 +# RH bug #1090629 Patch20: evolution-3.8.5-mail-browser-filtered.patch -# RH bug #1097271 +# RH bug #1091882 Patch21: evolution-3.8.5-labels-gsettings-busy-loop.patch +# RH bug #1098358 +Patch22: evolution-3.8.5-formatter-in-main.patch + +# RH bug #1113177 +Patch23: evolution-3.8.5-reply-with-selection.patch + +# RH bug #1123136 +Patch24: evolution-3.8.5-crash-mail-header-show.patch + +# RH bug #1118996 +Patch25: evolution-3.8.5-crash-customize-mail-view.patch + +# RH bug #1116938 +Patch26: evolution-3.8.5-smtp-mail-account-dialog-ui-update.patch + +# RH bug #1110370 +Patch27: evolution-3.8.5-calendar-tooltip-hide.patch + +# RH bug #1075109 +Patch28: evolution-3.8.5-caret-mode-to-body-navigation.patch + +# RH bug #1070850 +Patch29: evolution-3.8.5-ewebview-limit-zoom.patch + +# RH bug #1103823 +Patch30: evolution-3.8.5-crash-mail-migration.patch + +# RH bug #1033263 +Patch31: evolution-3.8.5-contact-duplicate-auto-expand.patch + +# RH bug #1070833 +Patch32: evolution-3.8.5-message-list-select-with-collapsed-threads.patch + +# RH bug #1122645 +Patch33: evolution-3.8.5-weather-calendar.patch + +# RH bug #1166665 +Patch34: evolution-3.8.5-evolution-convert-add-trailing-slash.patch + +# RH bug #1002188 +Patch35: evolution-3.8.5-restore-restarts-processes.patch + +# RH bug #1170671 +Patch36: evolution-3.8.5-cal-source-remove.patch + ## Dependencies ### Requires: gnome-icon-theme >= %{gnome_icon_theme_version} @@ -122,7 +167,7 @@ BuildRequires: automake >= 1.9 BuildRequires: cairo-gobject-devel BuildRequires: clutter-gtk-devel >= %{clutter_gtk_version} BuildRequires: desktop-file-utils -BuildRequires: evolution-data-server-devel >= %{version} +BuildRequires: evolution-data-server-devel >= 3.8.5-28 BuildRequires: gettext BuildRequires: glib2-devel >= %{glib2_version} BuildRequires: gnome-common @@ -276,6 +321,21 @@ This package contains the plugin to import Microsoft Personal Storage Table %patch19 -p1 -b .memory-leaks %patch20 -p1 -b .mail-browser-filtered %patch21 -p1 -b .labels-gsettings-busy-loop +%patch22 -p1 -b .formatter-in-main +%patch23 -p1 -b .reply-with-selection +%patch24 -p1 -b .crash-mail-header-show +%patch25 -p1 -b .crash-customize-mail-view +%patch26 -p1 -b .smtp-mail-account-dialog-ui-update +%patch27 -p1 -b .calendar-tooltip-hide +%patch28 -p1 -b .caret-mode-to-body-navigation +%patch29 -p1 -b .ewebview-limit-zoom +%patch30 -p1 -b .crash-mail-migration +%patch31 -p1 -b .contact-duplicate-auto-expand +%patch32 -p1 -b .message-list-select-with-collapsed-threads +%patch33 -p1 -b .weather-calendar +%patch34 -p1 -b .evolution-convert-add-trailing-slash +%patch35 -p1 -b .restore-restarts-processes +%patch36 -p1 -b .cal-source-remove mkdir -p krb5-fakeprefix/include mkdir -p krb5-fakeprefix/lib @@ -603,17 +663,49 @@ rm -rf $RPM_BUILD_ROOT %endif %changelog -* Thu Jun 05 2014 Milan Crha - 3.8.5-22.1 -- Update patch for RH bug #1097271 (Labels GSettings busy loop) - -* Wed May 28 2014 Lubos Kocman - 3.8.5-22 -- Resolves: #1092926 (rebuild due incorrect dist) - -* Tue May 13 2014 Milan Crha - 3.8.5-21.1 -- Add patch for RH bug #1097268 (Auto-mark as seen sometimes doesn't work) -- Add patch for RH bug #1097269 (Fix various memory leaks) -- Add patch for RH bug #1097270 (Filtered message not opened in a separate window) -- Add patch for RH bug #1097271 (Labels GSettings busy loop) +* Mon Dec 08 2014 Milan Crha - 3.8.5-31 +- Add patch for RH bug #1002188 (Restart background processes after restore) +- Add patch for RH bug #1170671 (Remove calendar events on its delete) + +* Mon Dec 01 2014 Milan Crha - 3.8.5-30 +- Update patch for RH bug #1070850 (Correct EMailReader to use EWebView functions) + +* Thu Nov 27 2014 Milan Crha - 3.8.5-29 +- Add patch for RH bug #1166665 (Correct path in evolution.convert) +- Update patch for RH bug #1070850 (Increase lower zoom limit) + +* Thu Nov 06 2014 Milan Crha - 3.8.5-28 +- Update patch for RH bug #1091882 (Fix regression of a message composer autosave) + +* Wed Oct 08 2014 Milan Crha - 3.8.5-27 +- Add patch for RH bug #1122645 (Weather calendar doesn't work) + +* Mon Aug 25 2014 Milan Crha - 3.8.5-26 +- Add patch for RH bug #1123136 (Crash when selecting mail header to show) +- Add patch for RH bug #1118996 (Crash when customize mail view) +- Add patch for RH bug #1116938 (Correct SMTP mail account editor UI update) +- Add patch for RH bug #1110370 (Calendar view tooltip doesn't go away) +- Add patch for RH bug #1075109 (Correct caret mode navigation to message body) +- Add patch for RH bug #1070850 (Limit zoom value for previews) +- Add patch for RH bug #1103823 (Crash after migration to maildir) +- Add patch for RH bug #1033263 (Contact duplicate dialog auto expands indefinitely) +- Add patch for RH bug #1070833 (Correct message list selection with collapsed threads) + +* Wed Jul 23 2014 Milan Crha - 3.8.5-25 +- Add patch for RH bug #1098358 (Run mail formatter in the main thread) +- Add patch for RH bug #1113177 (Reply with selection can lose white-spaces) + +* Thu Jun 05 2014 Milan Crha - 3.8.5-24 +- Update patch for RH bug #1091882 (Labels GSettings busy loop) + +* Wed May 28 2014 Lubos Kocman - 3.8.5-23 +- Resolves: #1100332 (bump release against 0day) + +* Tue May 13 2014 Milan Crha - 3.8.5-22 +- Add patch for RH bug #1070764 (Auto-mark as seen sometimes doesn't work) +- Add patch for RH bug #1084414 (Fix various memory leaks) +- Add patch for RH bug #1090629 (Filtered message not opened in a separate window) +- Add patch for RH bug #1091882 (Labels GSettings busy loop) * Mon Apr 07 2014 Milan Crha - 3.8.5-21 - Add patch for RH bug #1083584 (Disconnect stores on network outage)