aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog15
-rw-r--r--mail/em-folder-browser.c96
-rw-r--r--mail/em-folder-tree.c10
3 files changed, 103 insertions, 18 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 8ad0ad7749..f13d686e40 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,5 +1,20 @@
2004-05-04 Jeffrey Stedfast <fejj@ximian.com>
+ Fix for bug #55303, but ideally there would be a nicer way of
+ doing this - likely with some added ETree API but that's not
+ likely to happen anytime soon.
+
+ * em-folder-browser.c (scroll_idle_cb): Recall the saved scrollbar
+ position state and set it, then reconnect to the
+ message_list_scrolled signal.
+ (emfb_list_built): Calculate a default scrollbar position for
+ scroll_idle_cb to use if there's no saved state.
+ (emfb_set_folder): Disconnect from the message_list_scrolled
+ signal and the idle_scroll_id.
+ (emfb_list_scrolled): Save the scrollbar position state.
+ (emfb_destroy): Disconnect from list_scrolled_id and
+ idle_scroll_id.
+
Fix for bug #58004.
* mail-account-gui.c (display_license): Fixed to compile.
diff --git a/mail/em-folder-browser.c b/mail/em-folder-browser.c
index 1943d99941..e3082509ca 100644
--- a/mail/em-folder-browser.c
+++ b/mail/em-folder-browser.c
@@ -49,14 +49,7 @@
#include <e-util/e-dialog-utils.h>
#include <e-util/e-icon-factory.h>
-/*#include <camel/camel-mime-message.h>*/
#include <camel/camel-stream.h>
-/*#include <camel/camel-stream-filter.h>
-#include <camel/camel-mime-filter.h>
-#include <camel/camel-mime-filter-tohtml.h>
-#include <camel/camel-mime-filter-enriched.h>
-#include <camel/camel-multipart.h>
-#include <camel/camel-stream-mem.h>*/
#include <camel/camel-url.h>
#include <bonobo/bonobo-main.h>
@@ -107,7 +100,11 @@ struct _EMFolderBrowserPrivate {
guint search_menu_activated_id;
guint search_activated_id;
guint search_query_changed_id;
-
+
+ double default_scroll_position;
+ guint idle_scroll_id;
+ guint list_scrolled_id;
+
guint vpane_resize_id;
guint list_built_id; /* hook onto list-built for delayed 'select first unread' stuff */
@@ -251,7 +248,17 @@ emfb_destroy(GtkObject *o)
g_signal_handler_disconnect(((EMFolderView *)emfb)->list, emfb->priv->list_built_id);
emfb->priv->list_built_id = 0;
}
-
+
+ if (emfb->priv->list_scrolled_id) {
+ g_signal_handler_disconnect (((EMFolderView *) emfb)->list, emfb->priv->list_scrolled_id);
+ emfb->priv->list_scrolled_id = 0;
+ }
+
+ if (emfb->priv->idle_scroll_id) {
+ g_source_remove (emfb->priv->idle_scroll_id);
+ emfb->priv->idle_scroll_id = 0;
+ }
+
((GtkObjectClass *)emfb_parent)->destroy(o);
}
@@ -788,12 +795,52 @@ emfb_view_preview(BonoboUIComponent *uic, const char *path, Bonobo_UIComponent_E
em_folder_browser_show_preview((EMFolderBrowser *)emfv, state[0] != '0');
}
+static void
+emfb_list_scrolled (MessageList *ml, EMFolderBrowser *emfb)
+{
+ EMFolderView *emfv = (EMFolderView *) emfb;
+ double position;
+ char *state;
+
+ position = message_list_get_scrollbar_position (ml);
+ state = g_strdup_printf ("%f", position);
+
+ if (camel_object_meta_set (emfv->folder, "evolution:list_scroll_position", state))
+ camel_object_state_write (emfv->folder);
+
+ g_free (state);
+}
+
+static gboolean
+scroll_idle_cb (EMFolderBrowser *emfb)
+{
+ EMFolderView *emfv = (EMFolderView *) emfb;
+ double position;
+ char *state;
+
+ if ((state = camel_object_meta_get (emfv->folder, "evolution:list_scroll_position"))) {
+ position = strtod (state, NULL);
+ g_free (state);
+ } else {
+ position = emfb->priv->default_scroll_position;
+ }
+
+ message_list_set_scrollbar_position (emfv->list, position);
+
+ emfb->priv->list_scrolled_id = g_signal_connect (emfv->list, "message_list_scrolled", G_CALLBACK (emfb_list_scrolled), emfb);
+
+ emfb->priv->idle_scroll_id = 0;
+
+ return FALSE;
+}
+
/* TODO: This should probably be handled by message-list, by storing/queueing
up the select operation if its busy rebuilding the message-list */
static void
emfb_list_built (MessageList *ml, EMFolderBrowser *emfb)
{
EMFolderView *emfv = (EMFolderView *) emfb;
+ double position = 0.0f;
g_signal_handler_disconnect (ml, emfb->priv->list_built_id);
emfb->priv->list_built_id = 0;
@@ -803,12 +850,23 @@ emfb_list_built (MessageList *ml, EMFolderBrowser *emfb)
message_list_select_uid (ml, emfb->priv->select_uid);
g_free (emfb->priv->select_uid);
emfb->priv->select_uid = NULL;
+
+ /* change the default to the current position */
+ position = message_list_get_scrollbar_position (ml);
} else {
/* NOTE: not all users want this, so we need a preference for it perhaps? see bug #52887 */
/* FIXME: if the 1st message in the list is unread, this will actually select the second unread msg */
/*message_list_select (ml, MESSAGE_LIST_SELECT_NEXT, 0, CAMEL_MESSAGE_SEEN, TRUE);*/
}
}
+
+ emfb->priv->default_scroll_position = position;
+
+ /* FIXME: this is a gross workaround for an etable bug that I can't fix - bug #55303 */
+ /* this needs to be a lower priority than anything in e-table-item/e-canvas, since
+ * e_canvas_item_region_show_relay() uses a timeout, we have to use a timeout of the
+ * same interval but a lower priority. */
+ emfb->priv->idle_scroll_id = g_timeout_add_full (G_PRIORITY_LOW, 250, (GSourceFunc) scroll_idle_cb, emfb, NULL);
}
@@ -922,9 +980,19 @@ emfb_set_folder(EMFolderView *emfv, CamelFolder *folder, const char *uri)
{
EMFolderBrowser *emfb = (EMFolderBrowser *) emfv;
struct _EMFolderBrowserPrivate *p = emfb->priv;
-
+
message_list_freeze(emfv->list);
-
+
+ if (emfb->priv->list_scrolled_id) {
+ g_signal_handler_disconnect (emfv->list, emfb->priv->list_scrolled_id);
+ emfb->priv->list_scrolled_id = 0;
+ }
+
+ if (emfb->priv->idle_scroll_id) {
+ g_source_remove (emfb->priv->idle_scroll_id);
+ emfb->priv->idle_scroll_id = 0;
+ }
+
emfb_parent->set_folder(emfv, folder, uri);
/* This is required since we get activated the first time
@@ -968,15 +1036,15 @@ emfb_set_folder(EMFolderView *emfv, CamelFolder *folder, const char *uri)
message_list_set_search(emfb->view.list, sstate);
g_free(sstate);
- if ((sstate = camel_object_meta_get (folder, "evolution:selected_uid")))
+ if ((sstate = camel_object_meta_get (folder, "evolution:selected_uid"))) {
emfb->priv->select_uid = sstate;
- else {
+ } else {
g_free(p->select_uid);
p->select_uid = NULL;
}
if (emfv->list->cursor_uid == NULL && emfb->priv->list_built_id == 0)
- emfb->priv->list_built_id = g_signal_connect(emfv->list, "message_list_built", G_CALLBACK (emfb_list_built), emfv);
+ p->list_built_id = g_signal_connect(emfv->list, "message_list_built", G_CALLBACK (emfb_list_built), emfv);
/*emfb_create_view_instance (emfb, folder, uri);*/
if (emfv->uic)
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 714329327e..58d7bb1c44 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -46,6 +46,7 @@
#include <camel/camel-vtrash-folder.h>
#include <camel/camel-stream-mem.h>
#include <camel/camel-file-utils.h>
+#include <camel/camel-stream-fs.h>
#include "e-util/e-mktemp.h"
#include "e-util/e-request.h"
@@ -1404,6 +1405,7 @@ static gboolean
tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y, guint time, EMFolderTree *emft)
{
struct _EMFolderTreePrivate *priv = emft->priv;
+ GtkTreeModel *model = (GtkTreeModel *) priv->model;
GtkTreeViewDropPosition pos;
GdkDragAction action = 0;
GtkTreePath *path;
@@ -1417,9 +1419,9 @@ tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y, guin
if (priv->autoscroll_id == 0)
priv->autoscroll_id = g_timeout_add (150, (GSourceFunc) tree_autoscroll, emft);
- gtk_tree_model_get_iter (priv->model, &iter, path);
+ gtk_tree_model_get_iter (model, &iter, path);
- if (gtk_tree_model_iter_has_child (priv->model, &iter) && !gtk_tree_view_row_expanded (priv->treeview, path)) {
+ if (gtk_tree_model_iter_has_child (model, &iter) && !gtk_tree_view_row_expanded (priv->treeview, path)) {
if (priv->autoexpand_id != 0) {
GtkTreePath *autoexpand_path;
@@ -1427,7 +1429,7 @@ tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y, guin
if (gtk_tree_path_compare (autoexpand_path, path) != 0) {
/* row changed, restart timer */
gtk_tree_row_reference_free (priv->autoexpand_row);
- priv->autoexpand_row = gtk_tree_row_reference_new (priv->model, path);
+ priv->autoexpand_row = gtk_tree_row_reference_new (model, path);
g_source_remove (priv->autoexpand_id);
priv->autoexpand_id = g_timeout_add (600, (GSourceFunc) tree_autoexpand, emft);
}
@@ -1435,7 +1437,7 @@ tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y, guin
gtk_tree_path_free (autoexpand_path);
} else {
priv->autoexpand_id = g_timeout_add (600, (GSourceFunc) tree_autoexpand, emft);
- priv->autoexpand_row = gtk_tree_row_reference_new (priv->model, path);
+ priv->autoexpand_row = gtk_tree_row_reference_new (model, path);
}
} else if (priv->autoexpand_id != 0) {
gtk_tree_row_reference_free (priv->autoexpand_row);