File bnc-472719-evo-disk-summary-patches.patch of Package evolution
--- e-util/e-util.c 2008-11-07 10:04:08.000000000 +0530
+++ e-util/e-util.c 2009-02-04 11:45:58.000000000 +0530
@@ -39,7 +39,7 @@
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <libgnome/gnome-help.h>
-#include <libgnome/gnome-util.h>
+#include <libgnome/gnome-init.h>
#ifdef G_OS_WIN32
#include <windows.h>
@@ -70,6 +70,27 @@ e_get_user_data_dir (void)
}
/**
+ * e_get_accels_filename:
+ *
+ * Returns the name of the user data file containing custom keyboard
+ * accelerator specifications.
+ *
+ * Returns: filename for accelerator specifications
+ **/
+const gchar *
+e_get_accels_filename (void)
+{
+ static gchar *filename = NULL;
+
+ if (G_UNLIKELY (filename == NULL))
+ filename = g_build_filename (
+ gnome_user_dir_get (),
+ "accels", PACKAGE, NULL);
+
+ return filename;
+}
+
+/**
* e_display_help:
* @parent: a parent #GtkWindow or %NULL
* @link_id: help section to present or %NULL
--- e-util/e-util.h 2008-10-13 14:13:22.000000000 +0530
+++ e-util/e-util.h 2009-02-04 11:45:58.000000000 +0530
@@ -41,6 +41,7 @@ typedef enum {
} EFocus;
const gchar * e_get_user_data_dir (void);
+const gchar * e_get_accels_filename (void);
void e_display_help (GtkWindow *parent,
const gchar *link_id);
--- e-util/e-util-labels.c 2009-02-04 09:57:29.000000000 +0530
+++ e-util/e-util-labels.c 2009-02-04 11:48:00.000000000 +0530
@@ -83,7 +83,7 @@ e_util_labels_parse (GConfClient *client
/* Needed for Backward Compatibility */
if (num < LABEL_DEFAULTS_NUM) {
- label->name = g_strdup (_(buf));
+ label->name = g_strdup ((buf && *buf) ? buf : _(label_defaults[num].name));
label->tag = g_strdup (label_defaults[num].tag);
num++;
} else if (!tag) {
--- mail/em-folder-tree.c 2008-11-07 10:04:07.000000000 +0530
+++ mail/em-folder-tree.c 2009-02-04 11:46:18.000000000 +0530
@@ -1896,7 +1896,8 @@ emft_tree_row_expanded (GtkTreeView *tre
return;
}
- gtk_tree_store_set((GtkTreeStore *)model, root, COL_BOOL_LOAD_SUBDIRS, FALSE, -1);
+ /* do not set LOAD_SUBDIRS to FALSE until we are really done with loading */
+ /* gtk_tree_store_set ((GtkTreeStore *)model, root, COL_BOOL_LOAD_SUBDIRS, FALSE, -1); */
m = mail_msg_new (&get_folder_info_info);
m->root = gtk_tree_row_reference_new (model, tree_path);
@@ -2093,6 +2094,23 @@ emft_popup_properties (EPopup *ep, EPopu
g_free (uri);
}
+static void
+emft_popup_uvfolder (EPopup *ep, EPopupItem *pitem, void *data)
+{
+ EMFolderTree *emft = data;
+ CamelFolder *folder;
+ char *meta = camel_object_meta_get(folder, "vfolder:unread");
+
+ if ((folder = em_folder_tree_get_selected_folder (emft)) != NULL) {
+ if (!meta || strcmp(meta, "false") == 0)
+ camel_object_meta_set(folder, "vfolder:unread", "true");
+ else
+ camel_object_meta_set(folder, "vfolder:unread", "false");
+ }
+ camel_object_state_write (folder);
+ g_free (meta);
+}
+
static EPopupItem emft_popup_items[] = {
#if 0
{ E_POPUP_ITEM, "00.emc.00", N_("_View"), emft_popup_view, NULL, NULL, EM_POPUP_FOLDER_SELECT },
@@ -2210,6 +2228,25 @@ emft_popup (EMFolderTree *emft, GdkEvent
if ((folder_type_flags & CAMEL_FOLDER_TYPE_MASK) == CAMEL_FOLDER_TYPE_TRASH)
menus = g_slist_prepend (menus, &trash_popup_item);
+ if (!isstore && strstr(uri, "vfolder")) {
+ /* This is a vfolder, so lets add hacked up menu item. */
+ static EPopupItem *item = NULL;
+ char *meta = camel_object_meta_get (selfolder, "vfolder:unread");
+
+ if (!item)
+ item = g_malloc0(sizeof(*item));
+ if (meta && (strcmp (meta, "true") == 0))
+ item->type = E_POPUP_TOGGLE | E_POPUP_ACTIVE;
+ else
+ item->type = E_POPUP_TOGGLE & ~E_POPUP_ACTIVE;
+ item->path = "99.emc.99";
+ item->label = _("_Unread Search Folder");
+ item->activate = emft_popup_uvfolder;
+ item->visible = EM_POPUP_FOLDER_SELECT;
+ item->user_data = NULL;
+ menus = g_slist_prepend (menus, item);
+ g_free (meta);
+ }
e_popup_add_items ((EPopup *)emp, menus, NULL, emft_popup_free, emft);
--- mail/em-folder-view.c 2008-11-07 10:04:07.000000000 +0530
+++ mail/em-folder-view.c 2009-02-04 11:46:18.000000000 +0530
@@ -478,13 +478,15 @@ em_folder_view_mark_selected(EMFolderVie
return 0;
uids = message_list_get_selected(emfv->list);
- camel_folder_freeze(emfv->folder);
+ if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+ camel_folder_freeze(emfv->folder);
for (i=0; i<uids->len; i++)
camel_folder_set_message_flags(emfv->folder, uids->pdata[i], mask, set);
message_list_free_uids(emfv->list, uids);
- camel_folder_thaw(emfv->folder);
+ if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+ camel_folder_thaw(emfv->folder);
return i;
}
@@ -886,6 +888,7 @@ emfv_popup_source(EPopup *ep, EPopupItem
emmb = (EMMessageBrowser *)em_message_browser_window_new();
em_format_set_session((EMFormat *)((EMFolderView *)emmb)->preview, ((EMFormat *)emfv->preview)->session);
+ message_list_ensure_message (((EMFolderView *)emmb)->list, uids->pdata[0]);
em_folder_view_set_folder((EMFolderView *)emmb, emfv->folder, emfv->folder_uri);
em_format_set_mode((EMFormat *)((EMFolderView *)emmb)->preview, EM_FORMAT_SOURCE);
em_folder_view_set_message((EMFolderView *)emmb, uids->pdata[0], FALSE);
@@ -1079,7 +1082,8 @@ emfv_delete_msg_response (GtkWidget *dia
}
uids = message_list_get_selected(emfv->list);
- camel_folder_freeze(emfv->folder);
+ if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+ camel_folder_freeze(emfv->folder);
for (count=0; count < uids->len; count++) {
if (camel_folder_get_message_flags (emfv->folder, uids->pdata[count]) & CAMEL_MESSAGE_USER_NOT_DELETABLE) {
@@ -1102,7 +1106,8 @@ emfv_delete_msg_response (GtkWidget *dia
}
message_list_free_uids(emfv->list, uids);
- camel_folder_thaw(emfv->folder);
+ if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+ camel_folder_thaw(emfv->folder);
emfv_select_next_message (emfv, count, FALSE);
}
@@ -2743,37 +2748,6 @@ emfv_format_link_clicked(EMFormatHTMLDis
}
}
-static gchar *
-url_unescape_amp (const gchar *url)
-{
- gchar *buff;
- int i, j, amps;
-
- if (!url)
- return NULL;
-
- amps = 0;
- for (i = 0; url [i]; i++) {
- if (url [i] == '&' && strncmp (url + i, "&", 5) == 0)
- amps++;
- }
-
- buff = g_strdup (url);
-
- if (!amps)
- return buff;
-
- for (i = 0, j = 0; url [i]; i++, j++) {
- buff [j] = url [i];
-
- if (url [i] == '&' && strncmp (url + i, "&", 5) == 0)
- i += 4;
- }
- buff [j] = 0;
-
- return buff;
-}
-
static void
emp_uri_popup_link_copy(EPopup *ep, EPopupItem *pitem, void *data)
{
@@ -2781,7 +2755,7 @@ emp_uri_popup_link_copy(EPopup *ep, EPop
struct _EMFolderViewPrivate *p = emfv->priv;
g_free(p->selection_uri);
- p->selection_uri = url_unescape_amp(pitem->user_data);
+ p->selection_uri = em_utils_url_unescape_amp(pitem->user_data);
gtk_selection_owner_set(p->invisible, GDK_SELECTION_PRIMARY, gtk_get_current_event_time());
gtk_selection_owner_set(p->invisible, GDK_SELECTION_CLIPBOARD, gtk_get_current_event_time());
--- mail/em-format.c 2008-10-13 14:07:24.000000000 +0530
+++ mail/em-format.c 2009-02-04 11:46:18.000000000 +0530
@@ -1124,7 +1124,7 @@ em_format_format_text(EMFormat *emf, Cam
camel_object_unref(filter_stream);
camel_stream_reset (mem_stream);
- if (max == -1 || size < (max * 1024) || emf->composer) {
+ if (max == -1 || size == -1 || size < (max * 1024) || emf->composer) {
camel_stream_write_to_stream(mem_stream, (CamelStream *)stream);
camel_stream_flush((CamelStream *)stream);
} else {
@@ -1653,6 +1653,8 @@ emf_inlinepgp_encrypted(EMFormat *emf, C
CamelCipherValidity *valid;
CamelException *ex;
CamelMimePart *opart;
+ CamelDataWrapper *dw;
+ char *mime_type;
cipher = camel_gpg_context_new(emf->session);
ex = camel_exception_new();
@@ -1671,6 +1673,19 @@ emf_inlinepgp_encrypted(EMFormat *emf, C
return;
}
+ dw = camel_medium_get_content_object ((CamelMedium *)opart);
+ mime_type = camel_data_wrapper_get_mime_type (dw);
+
+ /* this ensures to show the 'opart' as inlined, if possible */
+ if (mime_type && g_ascii_strcasecmp (mime_type, "application/octet-stream") == 0) {
+ const char *snoop = em_utils_snoop_type (opart);
+
+ if (snoop)
+ camel_data_wrapper_set_mime_type (dw, snoop);
+ }
+
+ g_free (mime_type);
+
/* Pass it off to the real formatter */
em_format_format_secure(emf, stream, opart, valid);
--- mail/em-format-html-print.c 2008-10-13 14:07:24.000000000 +0530
+++ mail/em-format-html-print.c 2009-02-04 11:46:18.000000000 +0530
@@ -52,7 +52,7 @@ efhp_finalize (GObject *o)
static void
efhp_class_init (GObjectClass *class)
{
- parent_class = g_type_class_ref(EM_TYPE_FORMAT_HTML_PRINT);
+ parent_class = g_type_class_peek_parent (class);
class->finalize = efhp_finalize;
}
--- mail/em-popup.c 2008-10-13 14:07:24.000000000 +0530
+++ mail/em-popup.c 2009-02-04 11:46:18.000000000 +0530
@@ -588,12 +588,14 @@ emp_uri_popup_link_open(EPopup *ep, EPop
{
EMPopupTargetURI *t = (EMPopupTargetURI *)ep->target;
GError *err = NULL;
+ gchar *unescaped_uri = em_utils_url_unescape_amp (t->uri);
- gnome_url_show(t->uri, &err);
+ gnome_url_show(unescaped_uri, &err);
if (err) {
g_warning("gnome_url_show: %s", err->message);
g_error_free(err);
}
+ g_free (unescaped_uri);
}
static void
--- mail/em-subscribe-editor.c 2008-10-13 14:07:24.000000000 +0530
+++ mail/em-subscribe-editor.c 2009-02-04 11:46:18.000000000 +0530
@@ -111,6 +111,12 @@ struct _EMSubscribeNode {
GtkTreePath *path;
};
+typedef struct _MailMsgListNode MailMsgListNode;
+struct _MailMsgListNode {
+ EDListNode node;
+ MailMsg *msg;
+};
+
static void sub_editor_busy(EMSubscribeEditor *se, int dir);
static int sub_queue_fill_level(EMSubscribe *sub, EMSubscribeNode *node);
static void sub_selection_changed(GtkTreeSelection *selection, EMSubscribe *sub);
@@ -185,6 +191,7 @@ sub_folder_done (struct _zsubscribe_msg
GtkTreeModel *model;
EMSubscribeNode *node;
gboolean subscribed, issub;
+ MailMsgListNode *msgListNode;
m->sub->subscribe_id = -1;
if (m->sub->cancel)
@@ -209,10 +216,13 @@ sub_folder_done (struct _zsubscribe_msg
}
/* queue any further ones, or if out, update the ui */
- next = (struct _zsubscribe_msg *)e_dlist_remhead(&m->sub->subscribe);
- if (next) {
+ msgListNode = (MailMsgListNode *) e_dlist_remhead(&m->sub->subscribe);
+ if (msgListNode) {
+ next = (struct _zsubscribe_msg *) msgListNode->msg;
+ /* Free the memory of the MailMsgListNode which won't be used anymore. */
+ g_free(msgListNode);
next->sub->subscribe_id = next->base.seq;
- mail_msg_unordered_push (next);
+ mail_msg_unordered_push (next);
} else {
/* should it go off the model instead? */
sub_selection_changed(gtk_tree_view_get_selection(m->sub->tree), m->sub);
@@ -239,6 +249,7 @@ static int
sub_subscribe_folder (EMSubscribe *sub, EMSubscribeNode *node, int state, const char *spath)
{
struct _zsubscribe_msg *m;
+ MailMsgListNode *msgListNode;
int id;
m = mail_msg_new (&sub_subscribe_folder_info);
@@ -254,8 +265,10 @@ sub_subscribe_folder (EMSubscribe *sub,
d(printf("running subscribe folder '%s'\n", spath));
mail_msg_unordered_push (m);
} else {
+ msgListNode = g_malloc0(sizeof(MailMsgListNode));
+ msgListNode->msg = (MailMsg *) m;
d(printf("queueing subscribe folder '%s'\n", spath));
- e_dlist_addtail(&sub->subscribe, (EDListNode *)m);
+ e_dlist_addtail(&sub->subscribe, (EDListNode *)msgListNode);
}
return id;
@@ -541,6 +554,7 @@ static void
sub_destroy(GtkWidget *w, EMSubscribe *sub)
{
struct _zsubscribe_msg *m;
+ MailMsgListNode *msgListNode;
d(printf("subscribe closed\n"));
sub->cancel = TRUE;
@@ -551,8 +565,12 @@ sub_destroy(GtkWidget *w, EMSubscribe *s
if (sub->subscribe_id != -1)
mail_msg_cancel(sub->subscribe_id);
- while ( (m = (struct _zsubscribe_msg *)e_dlist_remhead(&sub->subscribe)) )
+ while ( (msgListNode = (MailMsgListNode *)e_dlist_remhead(&sub->subscribe))) {
+ m = (struct _zsubscribe_msg *) msgListNode->msg;
+ /* Free the memory of MailMsgListNode which won't be used anymore. */
+ g_free(msgListNode);
mail_msg_unref(m);
+ }
sub_unref(sub);
}
--- mail/em-utils.c 2008-11-07 10:04:07.000000000 +0530
+++ mail/em-utils.c 2009-02-04 11:46:18.000000000 +0530
@@ -2442,3 +2442,34 @@ em_utils_show_info_silent (GtkWidget *wi
g_signal_connect(widget, "response", G_CALLBACK(error_response), NULL);
e_activity_handler_make_error (handler, "mail", E_LOG_WARNINGS, widget);
}
+
+gchar *
+em_utils_url_unescape_amp (const gchar *url)
+{
+ gchar *buff;
+ int i, j, amps;
+
+ if (!url)
+ return NULL;
+
+ amps = 0;
+ for (i = 0; url [i]; i++) {
+ if (url [i] == '&' && strncmp (url + i, "&", 5) == 0)
+ amps++;
+ }
+
+ buff = g_strdup (url);
+
+ if (!amps)
+ return buff;
+
+ for (i = 0, j = 0; url [i]; i++, j++) {
+ buff [j] = url [i];
+
+ if (url [i] == '&' && strncmp (url + i, "&", 5) == 0)
+ i += 4;
+ }
+ buff [j] = 0;
+
+ return buff;
+}
--- mail/em-utils.h 2008-10-13 14:07:24.000000000 +0530
+++ mail/em-utils.h 2009-02-04 11:46:18.000000000 +0530
@@ -117,6 +117,9 @@ const char *em_utils_snoop_type(struct _
/* clears flag 'get_password_canceled' at every known accounts, so if needed, get_password will show dialog */
void em_utils_clear_get_password_canceled_accounts_flag (void);
+/* Unescapes & back to a real & in URIs */
+gchar *em_utils_url_unescape_amp (const gchar *url);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
--- mail/message-list.c 2009-02-04 09:57:29.000000000 +0530
+++ mail/message-list.c 2009-02-04 11:46:19.000000000 +0530
@@ -42,6 +42,7 @@
#include <camel/camel-folder-thread.h>
#include <camel/camel-folder-summary.h>
#include <camel/camel-vee-folder.h>
+#include <camel/camel-string-utils.h>
#include <libedataserver/e-memory.h>
@@ -2303,6 +2304,11 @@ message_list_finalise (GObject *object)
g_hash_table_destroy (message_list->normalised_hash);
+ if (message_list->ensure_uid) {
+ g_free (message_list->ensure_uid);
+ message_list->ensure_uid = NULL;
+ }
+
if (message_list->thread_tree)
camel_folder_thread_messages_unref(message_list->thread_tree);
@@ -3975,13 +3981,11 @@ regen_list_exec (struct _regen_list_msg
uids = camel_folder_get_uids (m->folder);
} else {
searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &m->base.ex);
-
/* If m->changes is not NULL, then it means we are called from folder_changed event,
thus we will keep the selected message to be sure it doesn't disappear because
it no longer belong to our search filter. */
- if (uids && m->ml->search && ((m->changes && m->ml->cursor_uid) || m->ml->ensure_uid)) {
+ if (uids && ((m->changes && m->ml->cursor_uid) || m->ml->ensure_uid)) {
const char *looking_for = m->ml->cursor_uid;
-
/* ensure_uid has precedence of cursor_uid */
if (m->ml->ensure_uid)
looking_for = m->ml->ensure_uid;
@@ -4002,7 +4006,7 @@ regen_list_exec (struct _regen_list_msg
on the flag whether we can view deleted messages or not. */
if (!was_deleted || (was_deleted && !m->hidedel))
- g_ptr_array_add (uids, g_strdup (looking_for));
+ g_ptr_array_add (uids, (gpointer) camel_pstring_strdup (looking_for));
}
}
}
@@ -4146,11 +4150,6 @@ regen_list_done (struct _regen_list_msg
if (m->ml->priv->destroyed)
return;
- if (m->ml->ensure_uid) {
- g_free (m->ml->ensure_uid);
- m->ml->ensure_uid = NULL;
- }
-
if (!m->complete)
return;
--- shell/e-shell-window.c 2008-10-13 14:02:56.000000000 +0530
+++ shell/e-shell-window.c 2009-02-04 11:46:19.000000000 +0530
@@ -795,7 +795,7 @@ setup_widgets (EShellWindow *window)
info->icon_name, width, 0);
g_string_append_printf(xml, "\" pixtype=\"filename\" pixname=\"%s\"/>"
"</placeholder></submenu></submenu>\n",
- gtk_icon_info_get_filename (icon_info));
+ icon_info ? gtk_icon_info_get_filename (icon_info) : "");
gtk_icon_info_free (icon_info);
bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
"/menu",
--- shell/main.c 2008-10-13 14:02:56.000000000 +0530
+++ shell/main.c 2009-02-04 11:46:19.000000000 +0530
@@ -330,10 +330,10 @@ idle_cb (gchar **uris)
startup_line_mode = E_SHELL_STARTUP_LINE_MODE_OFFLINE;
shell = e_shell_new (startup_line_mode, &result);
- e_shell_set_crash_recovery (shell, e_file_lock_exists ());
switch (result) {
case E_SHELL_CONSTRUCT_RESULT_OK:
+ e_shell_set_crash_recovery (shell, e_file_lock_exists ());
g_signal_connect (shell, "no_windows_left", G_CALLBACK (no_windows_left_cb), NULL);
g_object_weak_ref (G_OBJECT (shell), shell_weak_notify, NULL);
corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell));
@@ -656,6 +656,7 @@ main (int argc, char **argv)
exit (0);
gnome_sound_init ("localhost");
+ gtk_accel_map_load (e_get_accels_filename ());
if (!disable_eplugin) {
e_plugin_register_type(e_plugin_lib_get_type());
@@ -688,6 +689,8 @@ main (int argc, char **argv)
bonobo_main ();
+ gtk_accel_map_save (e_get_accels_filename ());
+
e_icon_factory_shutdown ();
g_object_unref (program);
gnome_sound_shutdown ();
--- widgets/misc/e-attachment-bar.c 2008-10-13 14:13:34.000000000 +0530
+++ widgets/misc/e-attachment-bar.c 2009-02-04 11:46:19.000000000 +0530
@@ -1001,7 +1001,8 @@ eab_icon_clicked_cb (EAttachmentBar *bar
if (E_IS_ATTACHMENT_BAR (bar) && event->type == GDK_2BUTTON_PRESS) {
p = e_attachment_bar_get_selected (bar);
- if (p && p->next == NULL) {
+ /* check if has body already, remote files can take longer to fetch */
+ if (p && p->next == NULL && ((EAttachment *)p->data)->body) {
attachment = p->data;
/* Check if the file is stored already */