X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-window-mgr.c;h=3b6221481bf2306d9e6a60489d882b54bcd2b03b;hb=89afc289ebe1d06e00a014ac01295bf594343ed2;hp=42e14e107c51566c057574043525b1b4ca170f75;hpb=cb22f21e3b8d843e124ba976a01ab74c3c763712;p=modest diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index 42e14e1..3b62214 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -68,6 +68,7 @@ enum { typedef struct _ModestWindowMgrPrivate ModestWindowMgrPrivate; struct _ModestWindowMgrPrivate { GList *window_list; + guint banner_counter; ModestWindow *main_window; @@ -194,6 +195,7 @@ modest_window_mgr_init (ModestWindowMgr *obj) priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj); priv->window_list = NULL; + priv->banner_counter = 0; priv->main_window = NULL; priv->fullscreen_mode = FALSE; @@ -354,10 +356,10 @@ modest_window_mgr_register_header (ModestWindowMgr *self, TnyHeader *header, co uid = g_strdup (alt_uid); if (!has_uid (priv->preregistered_uids, uid)) { - g_debug ("registering new uid %s", uid); + MODEST_DEBUG_BLOCK(g_debug ("registering new uid %s", uid);); priv->preregistered_uids = append_uid (priv->preregistered_uids, uid); } else - g_debug ("already had uid %s", uid); + MODEST_DEBUG_BLOCK(g_debug ("already had uid %s", uid);); g_free (uid); } @@ -375,17 +377,17 @@ modest_window_mgr_unregister_header (ModestWindowMgr *self, TnyHeader *header) uid = modest_tny_folder_get_header_unique_id (header); if (!has_uid (priv->preregistered_uids, uid)) { - g_debug ("trying to unregister non-existing uid %s", uid); + MODEST_DEBUG_BLOCK(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); + MODEST_DEBUG_BLOCK(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); + MODEST_DEBUG_BLOCK(g_debug ("uid %s removed", uid);); } g_free (uid); @@ -472,19 +474,25 @@ void modest_window_mgr_close_all_windows (ModestWindowMgr *self) { ModestWindowMgrPrivate *priv = NULL; - GList *wins = NULL; gboolean ret_value = FALSE; g_return_if_fail (MODEST_IS_WINDOW_MGR (self)); priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); - /* delete-event handler already removes window_list item, */ - /* so no next its required on this loop */ - wins = priv->window_list; - while (wins) { - g_signal_emit_by_name (G_OBJECT (wins->data), "delete-event", NULL, &ret_value); + /* If there is a main window then try to close it, and it will + close the others if needed */ + if (priv->main_window) { + g_signal_emit_by_name (priv->main_window, "delete-event", NULL, &ret_value); + } else { + GList *wins = NULL, *next = NULL; + /* delete-event handler actually removes window_list item, */ wins = priv->window_list; + while (wins) { + next = g_list_next (wins); + g_signal_emit_by_name (G_OBJECT (wins->data), "delete-event", NULL, &ret_value); + wins = next; + } } } @@ -595,7 +603,7 @@ modest_window_mgr_register_window (ModestWindowMgr *self, if (!has_uid (priv->preregistered_uids, uid)) g_debug ("weird: no uid for window (%s)", uid); - g_debug ("registering window for %s", uid ? uid : ""); + MODEST_DEBUG_BLOCK(g_debug ("registering window for %s", uid ? uid : "");); priv->preregistered_uids = remove_uid (priv->preregistered_uids, @@ -605,7 +613,7 @@ modest_window_mgr_register_window (ModestWindowMgr *self, const gchar *uid = modest_msg_edit_window_get_message_uid (MODEST_MSG_EDIT_WINDOW (window)); - g_debug ("registering window for %s", uid); + MODEST_DEBUG_BLOCK(g_debug ("registering window for %s", uid);); priv->preregistered_uids = remove_uid (priv->preregistered_uids, @@ -656,15 +664,17 @@ on_window_destroy (ModestWindow *window, /* If more than one window already opened */ if (g_list_length (priv->window_list) > 1) { + /* Present the window if it's not visible now */ + if (!gtk_window_has_toplevel_focus (GTK_WINDOW (window))) + gtk_window_present (GTK_WINDOW (window)); /* Create the confirmation dialog MSG-NOT308 */ dialog_response = modest_platform_run_confirmation_dialog ( GTK_WINDOW (window), _("emev_nc_close_windows")); /* If the user wants to close all the windows */ if ((dialog_response == GTK_RESPONSE_OK) - || (dialog_response == GTK_RESPONSE_ACCEPT) - || (dialog_response == GTK_RESPONSE_YES)) - { + || (dialog_response == GTK_RESPONSE_ACCEPT) + || (dialog_response == GTK_RESPONSE_YES)) { GList *iter = priv->window_list; do { if (iter->data != window) { @@ -677,11 +687,9 @@ on_window_destroy (ModestWindow *window, iter = g_list_next (iter); } } while (iter); - } - else - { - return TRUE; - } + } else { + return TRUE; + } } } else { @@ -700,8 +708,9 @@ on_window_destroy (ModestWindow *window, modest_platform_run_confirmation_dialog (GTK_WINDOW (window), _("mcen_nc_no_email_message_modified_save_changes")); /* Save to drafts */ - if (response != GTK_RESPONSE_CANCEL) - modest_ui_actions_on_save_to_drafts (NULL, MODEST_MSG_EDIT_WINDOW (window)); + if (response != GTK_RESPONSE_CANCEL) + if (!modest_ui_actions_on_save_to_drafts (NULL, MODEST_MSG_EDIT_WINDOW (window))) + return TRUE; } } } @@ -780,6 +789,26 @@ modest_window_mgr_unregister_window (ModestWindowMgr *self, handler_id = *tmp; g_hash_table_remove (priv->destroy_handlers, window); + /* cancel open and receive operations */ + if (MODEST_IS_MSG_VIEW_WINDOW (window)) { + ModestMailOperationTypeOperation type; + GSList* pending_ops = NULL; + GSList* tmp_list = NULL; + pending_ops = modest_mail_operation_queue_get_by_source ( + modest_runtime_get_mail_operation_queue (), + G_OBJECT (window)); + while (pending_ops != NULL) { + type = modest_mail_operation_get_type_operation (MODEST_MAIL_OPERATION (pending_ops->data)); + if (type == MODEST_MAIL_OPERATION_TYPE_RECEIVE || type == MODEST_MAIL_OPERATION_TYPE_OPEN) { + modest_mail_operation_cancel (pending_ops->data); + } + g_object_unref (G_OBJECT (pending_ops->data)); + tmp_list = pending_ops; + pending_ops = g_slist_next (pending_ops); + g_slist_free_1 (tmp_list); + } + } + /* Disconnect the "delete-event" handler, we won't need it anymore */ g_signal_handler_disconnect (window, handler_id); @@ -790,7 +819,7 @@ modest_window_mgr_unregister_window (ModestWindowMgr *self, gtk_widget_destroy (win->data); /* If there are no more windows registered emit the signal */ - if (priv->window_list == NULL) + if (priv->window_list == NULL && priv->banner_counter == 0) g_signal_emit (self, signals[WINDOW_LIST_EMPTY_SIGNAL], 0); } @@ -1142,21 +1171,29 @@ on_modal_dialog_close (GtkDialog *dialog, gint modest_window_mgr_num_windows (ModestWindowMgr *self) { - ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); + ModestWindowMgrPrivate *priv; gint num_windows = 0; + g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), -1); + + priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); + if (priv->window_list) num_windows = g_list_length (priv->window_list); - return num_windows; + return num_windows + priv->banner_counter; } GtkWidget * modest_window_mgr_get_msg_edit_window (ModestWindowMgr *self) { GtkWidget *result; - ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); + ModestWindowMgrPrivate *priv; + + g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), NULL); + priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); + if (priv->cached_editor) { result = priv->cached_editor; priv->cached_editor = NULL; @@ -1172,7 +1209,11 @@ GtkWidget * modest_window_mgr_get_msg_view_window (ModestWindowMgr *self) { GtkWidget *result; - ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); + ModestWindowMgrPrivate *priv; + + g_return_val_if_fail (self && MODEST_IS_WINDOW_MGR(self), NULL); + + priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); if (priv->cached_view) { result = priv->cached_view; @@ -1184,3 +1225,30 @@ modest_window_mgr_get_msg_view_window (ModestWindowMgr *self) return result; } + +void +modest_window_mgr_register_banner (ModestWindowMgr *self) +{ + ModestWindowMgrPrivate *priv; + + g_return_if_fail (MODEST_IS_WINDOW_MGR (self)); + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + priv->banner_counter++; + +} + +void +modest_window_mgr_unregister_banner (ModestWindowMgr *self) +{ + ModestWindowMgrPrivate *priv; + + g_return_if_fail (MODEST_IS_WINDOW_MGR (self)); + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + priv->banner_counter--; + if (priv->window_list == NULL && priv->banner_counter == 0) { + g_signal_emit (self, signals[WINDOW_LIST_EMPTY_SIGNAL], 0); + } + +}