I#1505 - Mail: Prefer existing message window on message open
Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1505
This commit is contained in:
@ -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 (
|
||||
|
@ -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)));
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user