* Fixes NB#95749, properly manage new windows
[modest] / src / hildon2 / modest-hildon2-window-mgr.c
index 85c74d8..8c7548d 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 #include <string.h>
-#include <hildon/hildon-program.h>
+#include <hildon/hildon.h>
 #include "modest-hildon2-window-mgr.h"
 #include "modest-msg-edit-window.h"
 #include "modest-main-window.h"
@@ -236,16 +236,16 @@ modest_hildon2_window_mgr_close_all_windows (ModestWindowMgr *self)
 {
        ModestHildon2WindowMgrPrivate *priv = NULL;
        gboolean ret_value = FALSE;
-       HildonStackableWindow *window;
-       HildonProgram *program;
+       GtkWidget *window;
+       HildonWindowStack *stack;
        gboolean failed = FALSE;
-       
+
        g_return_val_if_fail (MODEST_IS_HILDON2_WINDOW_MGR (self), FALSE);
        priv = MODEST_HILDON2_WINDOW_MGR_GET_PRIVATE (self);
-       
-       program = hildon_program_get_instance ();
 
-       while ((window = hildon_program_peek_window_stack (program)) != NULL) {
+       stack = hildon_window_stack_get_default ();
+
+       while ((window = hildon_window_stack_peek (stack)) != NULL) {
                g_signal_emit_by_name (G_OBJECT (window), "delete-event", NULL, &ret_value);
                if (ret_value == TRUE) {
                        failed = TRUE;
@@ -337,6 +337,8 @@ modest_hildon2_window_mgr_register_window (ModestWindowMgr *self,
        gint *handler_id;
        HildonProgram *program;
        GtkWidget *current_top;
+       HildonWindowStack *stack;
+       gboolean nested_msg;
 
        g_return_val_if_fail (MODEST_IS_HILDON2_WINDOW_MGR (self), FALSE);
        g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
@@ -353,6 +355,8 @@ modest_hildon2_window_mgr_register_window (ModestWindowMgr *self,
                return TRUE;
        }
 
+       stack = hildon_window_stack_get_default ();
+
        if (!MODEST_WINDOW_MGR_CLASS (parent_class)->register_window (self, window, parent))
                goto fail;
 
@@ -360,30 +364,30 @@ modest_hildon2_window_mgr_register_window (ModestWindowMgr *self,
        g_object_ref (window);
        priv->window_list = g_list_prepend (priv->window_list, window);
 
-       current_top = GTK_WIDGET (hildon_program_peek_window_stack (program));
-
-       /* policy is: if no parent, then we close all up message views, but no account/folder/header window */
+       current_top = hildon_window_stack_peek (stack);
 
-       if (!parent || ((GtkWidget *) parent != current_top)) {
-               gboolean close_canceled = FALSE;
+        nested_msg = MODEST_IS_MSG_VIEW_WINDOW (window) && 
+                MODEST_IS_MSG_VIEW_WINDOW (parent);
+       /* Close views if they're being shown */
+       if (!nested_msg &&
+           (MODEST_IS_MSG_EDIT_WINDOW (current_top) ||
+            MODEST_IS_MSG_VIEW_WINDOW (current_top))) {
+               gboolean retval;
 
+               /* If the current view has modal dialogs then
+                  we fail to register the new view */
                if ((current_top != NULL) &&
                    window_has_modals (MODEST_WINDOW (current_top))) {
                        /* Window on top but it has opened dialogs */
                        goto fail;
                }
-               while (current_top && !close_canceled) {
-                       current_top = GTK_WIDGET (hildon_program_peek_window_stack (program));
-                       if (MODEST_IS_MSG_VIEW_WINDOW (current_top) || MODEST_IS_MSG_EDIT_WINDOW (current_top)) {
-                               g_signal_emit_by_name (G_OBJECT (current_top), "delete-event", NULL, &close_canceled);
-                       } else {
-                               break;
-                       }
-               }
 
-               if (close_canceled)
+               /* Close the current view */
+               g_signal_emit_by_name (G_OBJECT (current_top), "delete-event", NULL, &retval);
+               if (retval == TRUE) {
+                       /* Cancelled closing top window, then we fail to register */
                        goto fail;
-
+               }
        }
 
        /* Listen to object destruction */
@@ -399,7 +403,7 @@ fail:
        /* Add to list. Keep a reference to the window */
        priv->window_list = g_list_remove (priv->window_list, window);
        g_object_unref (window);
-       current_top = GTK_WIDGET (hildon_program_peek_window_stack (program));
+       current_top = hildon_window_stack_peek (stack);
        if (current_top)
                gtk_window_present (GTK_WINDOW (current_top));
        return FALSE;
@@ -439,7 +443,8 @@ window_has_modals (ModestWindow *window)
        toplevels = gtk_window_list_toplevels ();
        for (node = toplevels; node != NULL; node = g_list_next (node)) {
                if (GTK_IS_WINDOW (node->data) &&
-                   gtk_window_get_transient_for (GTK_WINDOW (node->data)) == GTK_WINDOW (window)) {
+                   gtk_window_get_transient_for (GTK_WINDOW (node->data)) == GTK_WINDOW (window) &&
+                   GTK_WIDGET_VISIBLE (node->data)) {
                        retvalue = TRUE;
                        break;
                }