I#1505 - Mail: Prefer existing message window on message open

Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1505
This commit is contained in:
Milan Crha
2021-05-25 13:48:01 +02:00
parent 25e954da5b
commit 2129be64b3
4 changed files with 98 additions and 0 deletions

View File

@ -1410,6 +1410,7 @@ e_mail_reader_open_selected (EMailReader *reader)
GPtrArray *views;
GPtrArray *uids;
guint ii = 0;
gboolean prefer_existing;
g_return_val_if_fail (E_IS_MAIL_READER (reader), 0);
@ -1435,6 +1436,8 @@ e_mail_reader_open_selected (EMailReader *reader)
goto exit;
}
prefer_existing = !E_IS_MAIL_BROWSER (window);
views = g_ptr_array_new ();
/* For vfolders we need to edit the original, not the vfolder copy. */
@ -1479,6 +1482,17 @@ e_mail_reader_open_selected (EMailReader *reader)
GtkWidget *browser;
MessageList *ml;
if (prefer_existing) {
EMailBrowser *mail_browser;
mail_browser = em_utils_find_message_window (E_MAIL_FORMATTER_MODE_NORMAL, folder, uid);
if (mail_browser) {
gtk_window_present (GTK_WINDOW (mail_browser));
continue;
}
}
browser = e_mail_browser_new (backend, E_MAIL_FORMATTER_MODE_NORMAL);
ml = MESSAGE_LIST (e_mail_reader_get_message_list (

View File

@ -2200,6 +2200,19 @@ action_mail_show_source_cb (GtkAction *action,
g_return_if_fail (uids != NULL && uids->len == 1);
message_uid = g_ptr_array_index (uids, 0);
if (!E_IS_MAIL_BROWSER (e_mail_reader_get_window (reader))) {
EMailBrowser *mail_browser;
mail_browser = em_utils_find_message_window (E_MAIL_FORMATTER_MODE_SOURCE, folder, message_uid);
if (mail_browser) {
gtk_window_present (GTK_WINDOW (mail_browser));
g_ptr_array_unref (uids);
g_clear_object (&folder);
return;
}
}
browser = e_mail_browser_new (backend, E_MAIL_FORMATTER_MODE_SOURCE);
ml = MESSAGE_LIST (e_mail_reader_get_message_list (E_MAIL_READER (browser)));

View File

@ -2020,3 +2020,70 @@ em_utils_account_path_to_folder_uri (CamelSession *session,
return folder_uri;
}
EMailBrowser *
em_utils_find_message_window (EMailFormatterMode display_mode,
CamelFolder *folder,
const gchar *message_uid)
{
EShell *shell;
GList *windows, *link;
g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
g_return_val_if_fail (message_uid != NULL, NULL);
shell = e_shell_get_default ();
windows = gtk_application_get_windows (GTK_APPLICATION (shell));
for (link = windows; link; link = g_list_next (link)) {
GtkWindow *window = link->data;
if (E_IS_MAIL_BROWSER (window)) {
EMailBrowser *browser = E_MAIL_BROWSER (window);
gboolean matched = FALSE;
if (e_mail_browser_get_display_mode (browser) == display_mode) {
CamelFolder *tmp_folder;
GPtrArray *uids;
tmp_folder = e_mail_reader_ref_folder (E_MAIL_READER (browser));
uids = e_mail_reader_get_selected_uids (E_MAIL_READER (browser));
if (uids->len == 1) {
const gchar *uid = g_ptr_array_index (uids, 0);
matched = g_strcmp0 (message_uid, uid) == 0 &&
folder == tmp_folder;
if (!matched) {
CamelFolder *real_folder = NULL, *tmp_real_folder = NULL;
gchar *real_uid = NULL, *tmp_real_uid = NULL;
if (CAMEL_IS_VEE_FOLDER (folder))
em_utils_get_real_folder_and_message_uid (folder, message_uid, &real_folder, NULL, &real_uid);
if (CAMEL_IS_VEE_FOLDER (tmp_folder))
em_utils_get_real_folder_and_message_uid (tmp_folder, uid, &tmp_real_folder, NULL, &tmp_real_uid);
matched = (real_folder || tmp_real_folder) &&
(real_folder ? real_folder : folder) == (tmp_real_folder ? tmp_real_folder : tmp_folder) &&
g_strcmp0 (real_uid ? real_uid : message_uid, tmp_real_uid ? tmp_real_uid : uid) == 0;
g_clear_object (&tmp_real_folder);
g_clear_object (&real_folder);
g_free (tmp_real_uid);
g_free (real_uid);
}
}
g_ptr_array_unref (uids);
g_clear_object (&tmp_folder);
}
if (matched)
return browser;
}
}
return NULL;
}

View File

@ -28,6 +28,7 @@
#include <libemail-engine/libemail-engine.h>
#include <mail/e-mail-browser.h>
#include <mail/e-mail-reader.h>
#include <mail/em-folder-tree.h>
@ -122,6 +123,9 @@ gchar * em_utils_build_export_basename (CamelFolder *folder,
gchar * em_utils_account_path_to_folder_uri
(CamelSession *session,
const gchar *account_path); /* On This Computer/Inbox/Subfolder... */
EMailBrowser * em_utils_find_message_window (EMailFormatterMode display_mode,
CamelFolder *folder,
const gchar *message_uid);
G_END_DECLS