* Fixes NB#95749, properly manage new windows
[modest] / src / hildon2 / modest-hildon2-window-mgr.c
index 04823c1..8c7548d 100644 (file)
@@ -338,6 +338,7 @@ modest_hildon2_window_mgr_register_window (ModestWindowMgr *self,
        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);
@@ -354,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;
 
@@ -361,31 +364,30 @@ modest_hildon2_window_mgr_register_window (ModestWindowMgr *self,
        g_object_ref (window);
        priv->window_list = g_list_prepend (priv->window_list, window);
 
-       stack = hildon_window_stack_get_default ();
        current_top = hildon_window_stack_peek (stack);
 
-       /* policy is: if no parent, then we close all up message views, but no account/folder/header window */
-
-       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 = hildon_window_stack_peek (stack);
-                       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 */
@@ -441,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;
                }