From 87596c5aa5517ac7ba37e50664a969fcaaea72f9 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Tue, 10 Jul 2007 23:13:08 +0000 Subject: [PATCH] * let the dbus-invoked msgs use the same uids as other messages, so, modest-window-mgr will do the right thing. also fixed up modest-window-mgr a bit. fixes: NB#62897 pmo-trunk-r2685 --- src/dbus_api/modest-dbus-callbacks.c | 56 +++++++++++++++++++---------- src/widgets/modest-window-mgr.c | 66 ++++++++++++++++++++++++---------- 2 files changed, 85 insertions(+), 37 deletions(-) diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index 7d6bd0e..f130961 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -32,6 +32,7 @@ #include "modest-account-mgr.h" #include "modest-account-mgr-helpers.h" #include "modest-tny-account.h" +#include "modest-tny-folder.h" #include "modest-ui-actions.h" #include "modest-search.h" @@ -445,7 +446,7 @@ static gint on_compose_mail(GArray * arguments, gpointer data, osso_rpc_t * retv static TnyMsg * -find_message_by_url (const char *uri, TnyAccount **ac_out) +find_message_by_url (const char *uri, TnyFolder **folder_out, TnyAccount **ac_out) { ModestTnyAccountStore *astore; TnyAccount *account; @@ -477,7 +478,6 @@ find_message_by_url (const char *uri, TnyAccount **ac_out) } g_debug ("%s: Account is store account.\n", __FUNCTION__); - *ac_out = account; folder = tny_store_account_find_folder (TNY_STORE_ACCOUNT (account), @@ -489,6 +489,8 @@ find_message_by_url (const char *uri, TnyAccount **ac_out) tny_account_get_id (TNY_ACCOUNT(account)), uri); goto out; } + *folder = folder; + g_debug ("%s: Found folder. (%s)\n", __FUNCTION__, uri); @@ -508,8 +510,9 @@ out: *ac_out = NULL; } - if (folder) { + if (folder && !msg) { g_object_unref (folder); + *folder_out = NULL; } return msg; @@ -518,18 +521,20 @@ out: static gboolean on_idle_open_message (gpointer user_data) { - ModestWindow *msg_view; + ModestWindow *msg_view = NULL; TnyMsg *msg; - TnyAccount *account; + TnyAccount *account = NULL; TnyHeader *header; const char *msg_uid; const char *account_name; char *uri; - + ModestWindowMgr *win_mgr; + TnyFolder *folder = NULL; + uri = (char *) user_data; - g_debug ("%s: Trying to find msg by url: %s", __FUNCTION__, uri); - msg = find_message_by_url (uri, &account); + g_debug ("%s: Trying to find msg by url: %s", __FUNCTION__, uri); + msg = find_message_by_url (uri, &folder, &account); g_free (uri); if (msg == NULL) { @@ -538,25 +543,40 @@ on_idle_open_message (gpointer user_data) } g_debug (" %s: Found message.", __FUNCTION__); + if (modest_tny_folder_get_local_folder_type (folder) == TNY_FOLDER_TYPE_DRAFTS) { + g_debug ("draft messages should be opened in edit mode... "); + } + header = tny_msg_get_header (msg); account_name = tny_account_get_name (account); - msg_uid = tny_header_get_uid (header); - + msg_uid = modest_tny_folder_get_header_unique_id(header); +/* FIXME: modest_tny_folder_get_header_unique_id warns against this */ + win_mgr = modest_runtime_get_window_mgr (); + gdk_threads_enter (); - - msg_view = modest_msg_view_window_new (msg, - account_name, - msg_uid); - modest_window_mgr_register_window (modest_runtime_get_window_mgr (), msg_view); - gtk_widget_show_all (GTK_WIDGET (msg_view)); + if (modest_window_mgr_find_registered_header (win_mgr, header, &msg_view)) { + g_debug ("window for this msg is open already"); + if (!MODEST_IS_MSG_VIEW_WINDOW(msg_view)) + g_debug ("not a msg view"); + else { + gtk_window_present (GTK_WINDOW(msg_view)); + } + } else { + g_debug ("creating new window for this msg"); + modest_window_mgr_register_header (win_mgr, header); + msg_view = modest_msg_view_window_new (msg,account_name, + msg_uid); + modest_window_mgr_register_window (win_mgr, msg_view); + gtk_widget_show_all (GTK_WIDGET (msg_view)); + } gdk_threads_leave (); g_object_unref (header); g_object_unref (account); - g_object_unref (msg_view); - + g_object_unref (folder); + return FALSE; /* Do not call this callback again. */ } diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index 3312baa..d66cc14 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -239,9 +239,13 @@ modest_window_mgr_register_header (ModestWindowMgr *self, TnyHeader *header) priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); uid = modest_tny_folder_get_header_unique_id (header); - - if (!has_uid (priv->preregistered_uids, uid)) + + + if (!has_uid (priv->preregistered_uids, uid)) { + g_debug ("registering new uid %s", uid); priv->preregistered_uids = append_uid (priv->preregistered_uids, uid); + } else + g_debug ("already had uid %s", uid); g_free (uid); } @@ -258,8 +262,19 @@ modest_window_mgr_unregister_header (ModestWindowMgr *self, TnyHeader *header) priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); uid = modest_tny_folder_get_header_unique_id (header); - if (has_uid (priv->preregistered_uids, uid)) + if (!has_uid (priv->preregistered_uids, uid)) { + g_debug ("trying to unregister non-existing uid %s", uid); + priv->preregistered_uids = append_uid (priv->preregistered_uids, uid); + } else + g_debug ("unregistering uid %s", uid); + + if (has_uid (priv->preregistered_uids, uid)) { priv->preregistered_uids = remove_uid (priv->preregistered_uids, uid); + if (has_uid (priv->preregistered_uids, uid)) + g_debug ("BUG: uid %s NOT removed", uid); + else + g_debug ("uid %s removed", uid); + } g_free (uid); } @@ -290,7 +305,7 @@ modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *head { ModestWindowMgrPrivate *priv; gchar* uid; - gboolean retval = FALSE; + gboolean has_header, has_window = FALSE; GList *item = NULL; g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE); @@ -300,24 +315,29 @@ modest_window_mgr_find_registered_header (ModestWindowMgr *self, TnyHeader *head uid = modest_tny_folder_get_header_unique_id (header); - /* first, look for the window */ - /* note, the UID cannot be in both the window list and the preregistered uid list */ - if (priv->window_list) { - item = g_list_find_custom (priv->window_list, - uid, (GCompareFunc) compare_msguids); - if (item) - retval = TRUE; - if (win) - *win = item ? MODEST_WINDOW(item->data) : NULL; - } + if (win) + *win = NULL; + g_debug ("windows in list: %d", g_list_length (priv->window_list)); + g_debug ("headers in list: %d", g_slist_length (priv->preregistered_uids)); - /* IF It's not in the window list. maybe it's in our uid list... */ - retval = retval || has_uid (priv->preregistered_uids, uid); + has_header = has_uid (priv->preregistered_uids, uid); + + item = g_list_find_custom (priv->window_list, uid, (GCompareFunc) compare_msguids); + if (item) { + has_window = TRUE; + if (win) { + if (!MODEST_IS_MSG_VIEW_WINDOW(item->data)) + g_debug ("not a valid window!"); + else { + g_debug ("found a window"); + *win = MODEST_WINDOW (item->data); + } + } + } g_free (uid); - - return retval; + return has_header || has_window; } @@ -342,7 +362,7 @@ modest_window_mgr_register_window (ModestWindowMgr *self, g_warning ("Trying to register an already registered window"); return; } - + /* Check that it's not a second main window */ if (MODEST_IS_MAIN_WINDOW (window)) { if (priv->main_window) { @@ -355,6 +375,14 @@ modest_window_mgr_register_window (ModestWindowMgr *self, /* remove from the list of pre-registered uids */ if (MODEST_IS_MSG_VIEW_WINDOW(window)) { + const gchar *uid = modest_msg_view_window_get_message_uid + (MODEST_MSG_VIEW_WINDOW (window)); + + g_debug ("registering window for %s", uid); + + if (!has_uid (priv->preregistered_uids, uid)) + g_debug ("weird: no uid for window (%s)", uid); + priv->preregistered_uids = remove_uid (priv->preregistered_uids, modest_msg_view_window_get_message_uid -- 1.7.9.5