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);
return TRUE;
}
+ stack = hildon_window_stack_get_default ();
+
if (!MODEST_WINDOW_MGR_CLASS (parent_class)->register_window (self, window, parent))
goto fail;
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 */
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;
}