From: Sergio Villar Senin Date: Mon, 3 Nov 2008 15:37:30 +0000 (+0000) Subject: * Fixes NB#86569 + some memory leak fixes X-Git-Url: http://vcs.maemo.org/git/?a=commitdiff_plain;h=ceccbe192b41154b50a1341e8bba6547814c5611;p=modest * Fixes NB#86569 + some memory leak fixes pmo-diablo-r6215 --- diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index dcd8e63..7e300e5 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -742,12 +742,13 @@ modest_msg_view_window_finalize (GObject *obj) static gboolean select_next_valid_row (GtkTreeModel *model, GtkTreeRowReference **row_reference, - gboolean cycle) + gboolean cycle, + gboolean is_outbox) { GtkTreeIter tmp_iter; GtkTreePath *path; GtkTreePath *next = NULL; - gboolean retval = FALSE; + gboolean retval = FALSE, finished; g_return_val_if_fail (gtk_tree_row_reference_valid (*row_reference), FALSE); @@ -756,24 +757,60 @@ select_next_valid_row (GtkTreeModel *model, gtk_tree_row_reference_free (*row_reference); *row_reference = NULL; - if (gtk_tree_model_iter_next (model, &tmp_iter)) { - next = gtk_tree_model_get_path (model, &tmp_iter); - *row_reference = gtk_tree_row_reference_new (model, next); - retval = TRUE; - } else if (cycle && gtk_tree_model_get_iter_first (model, &tmp_iter)) { - next = gtk_tree_model_get_path (model, &tmp_iter); - - /* Ensure that we are not selecting the same */ - if (gtk_tree_path_compare (path, next) != 0) { - *row_reference = gtk_tree_row_reference_new (model, next); - retval = TRUE; + finished = FALSE; + do { + TnyHeader *header = NULL; + + if (gtk_tree_model_iter_next (model, &tmp_iter)) { + gtk_tree_model_get (model, &tmp_iter, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, + &header, -1); + + if (header) { + if (msg_is_visible (header, is_outbox)) { + next = gtk_tree_model_get_path (model, &tmp_iter); + *row_reference = gtk_tree_row_reference_new (model, next); + gtk_tree_path_free (next); + retval = TRUE; + finished = TRUE; + } + g_object_unref (header); + header = NULL; + } + } else if (cycle && gtk_tree_model_get_iter_first (model, &tmp_iter)) { + next = gtk_tree_model_get_path (model, &tmp_iter); + + /* Ensure that we are not selecting the same */ + if (gtk_tree_path_compare (path, next) != 0) { + gtk_tree_model_get (model, &tmp_iter, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, + &header, -1); + if (header) { + if (msg_is_visible (header, is_outbox)) { + *row_reference = gtk_tree_row_reference_new (model, next); + retval = TRUE; + finished = TRUE; + } + g_object_unref (header); + header = NULL; + } + } else { + /* If we ended up in the same message + then there is no valid next + message */ + finished = TRUE; + } + gtk_tree_path_free (next); + } else { + /* If there are no more messages and we don't + want to start again in the first one then + there is no valid next message */ + finished = TRUE; } - } + } while (!finished); /* Free */ gtk_tree_path_free (path); - if (next) - gtk_tree_path_free (next); return retval; } @@ -943,7 +980,7 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, if (row_reference) { priv->row_reference = gtk_tree_row_reference_copy (row_reference); priv->next_row_reference = gtk_tree_row_reference_copy (row_reference); - select_next_valid_row (model, &(priv->next_row_reference), TRUE); + select_next_valid_row (model, &(priv->next_row_reference), TRUE, priv->is_outbox); } else { priv->row_reference = NULL; priv->next_row_reference = NULL; @@ -1159,7 +1196,7 @@ modest_msg_view_window_on_row_inserted (GtkTreeModel *model, priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference); select_next_valid_row (priv->header_model, - &(priv->next_row_reference), FALSE); + &(priv->next_row_reference), FALSE, priv->is_outbox); /* Connect the remaining callbacks to become able to detect * changes in header-view. */ @@ -1202,7 +1239,7 @@ modest_msg_view_window_on_row_reordered (GtkTreeModel *header_model, gtk_tree_row_reference_free (priv->next_row_reference); } priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference); - select_next_valid_row (header_model, &(priv->next_row_reference), FALSE); + select_next_valid_row (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox); already_changed = TRUE; } gtk_tree_path_free (path); @@ -1217,7 +1254,7 @@ modest_msg_view_window_on_row_reordered (GtkTreeModel *header_model, gtk_tree_row_reference_free (priv->next_row_reference); } priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference); - select_next_valid_row (header_model, &(priv->next_row_reference), FALSE); + select_next_valid_row (header_model, &(priv->next_row_reference), FALSE, priv->is_outbox); } gtk_tree_path_free (path); } @@ -1893,7 +1930,7 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) if (!gtk_tree_row_reference_valid (priv->next_row_reference)) { if (gtk_tree_row_reference_valid (priv->row_reference)) { priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference); - select_next_valid_row (priv->header_model, &(priv->next_row_reference), FALSE); + select_next_valid_row (priv->header_model, &(priv->next_row_reference), FALSE, priv->is_outbox); } } if (priv->next_row_reference) @@ -2007,7 +2044,7 @@ view_msg_cb (ModestMailOperation *mail_op, gtk_tree_row_reference_free (priv->next_row_reference); } priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference); - select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE); + select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE, priv->is_outbox); } /* Mark header as read */