From 134a7d4bbde9d96e1e002abebb667c5d3cde66ca Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 17 Dec 2009 20:17:04 +0100 Subject: Bug #593700 - Restore folder's last selected message as expected --- mail/message-list.c | 12 ++-- modules/mail/e-mail-shell-content.c | 136 ------------------------------------ 2 files changed, 6 insertions(+), 142 deletions(-) diff --git a/mail/message-list.c b/mail/message-list.c index bbffb44bde..dcf2e4fed1 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -3462,12 +3462,6 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g camel_exception_init (&ex); - /* remove the cursor activate idle handler */ - if (message_list->idle_id != 0) { - g_source_remove (message_list->idle_id); - message_list->idle_id = 0; - } - if (message_list->seen_id) { g_source_remove (message_list->seen_id); message_list->seen_id = 0; @@ -3487,6 +3481,12 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g clear_tree (message_list, TRUE); e_tree_memory_thaw(E_TREE_MEMORY(etm)); + /* remove the cursor activate idle handler */ + if (message_list->idle_id != 0) { + g_source_remove (message_list->idle_id); + message_list->idle_id = 0; + } + if (message_list->folder) { camel_object_unhook_event((CamelObject *)message_list->folder, "folder_changed", folder_changed, message_list); diff --git a/modules/mail/e-mail-shell-content.c b/modules/mail/e-mail-shell-content.c index 01b4811f2b..f9b0b7da80 100644 --- a/modules/mail/e-mail-shell-content.c +++ b/modules/mail/e-mail-shell-content.c @@ -46,7 +46,6 @@ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_MAIL_SHELL_CONTENT, EMailShellContentPrivate)) -#define STATE_KEY_SCROLLBAR_POSITION "ScrollbarPosition" #define STATE_KEY_SELECTED_MESSAGE "SelectedMessage" struct _EMailShellContentPrivate { @@ -63,11 +62,9 @@ struct _EMailShellContentPrivate { gdouble default_scrollbar_position; guint paned_binding_id; - guint scroll_timeout_id; /* Signal handler IDs */ guint message_list_built_id; - guint message_list_scrolled_id; guint preview_visible : 1; guint suppress_message_selection : 1; @@ -84,112 +81,6 @@ enum { static gpointer parent_class; static GType mail_shell_content_type; -static void -mail_shell_content_etree_unfreeze (MessageList *message_list, - GdkEvent *event) -{ - ETableItem *item; - GObject *object; - - item = e_tree_get_item (E_TREE (message_list)); - object = G_OBJECT (((GnomeCanvasItem *) item)->canvas); - - g_object_set_data (object, "freeze-cursor", 0); -} - -static void -mail_shell_content_message_list_scrolled_cb (EMailShellContent *mail_shell_content, - GtkScrollbar *vscrollbar) -{ - EShellContent *shell_content; - EShellView *shell_view; - EMailReader *reader; - GKeyFile *key_file; - const gchar *folder_uri; - const gchar *key; - gchar *group_name; - gdouble value; - - /* Save the scrollbar position for the current folder. */ - - reader = E_MAIL_READER (mail_shell_content); - folder_uri = e_mail_reader_get_folder_uri (reader); - - if (folder_uri == NULL) - return; - - shell_content = E_SHELL_CONTENT (mail_shell_content); - shell_view = e_shell_content_get_shell_view (shell_content); - key_file = e_shell_view_get_state_key_file (shell_view); - - key = STATE_KEY_SCROLLBAR_POSITION; - group_name = g_strdup_printf ("Folder %s", folder_uri); - value = gtk_range_get_value (GTK_RANGE (vscrollbar)); - - g_key_file_set_double (key_file, group_name, key, value); - e_shell_view_set_state_dirty (shell_view); - - g_free (group_name); -} - -static gboolean -mail_shell_content_scroll_timeout_cb (EMailShellContent *mail_shell_content) -{ - EMailShellContentPrivate *priv = mail_shell_content->priv; - EShellContent *shell_content; - EShellView *shell_view; - GtkScrolledWindow *scrolled_window; - GtkWidget *message_list; - GtkWidget *vscrollbar; - EMailReader *reader; - GKeyFile *key_file; - const gchar *folder_uri; - const gchar *key; - gchar *group_name; - - /* Initialize the scrollbar position for the current folder - * and setup a callback to handle scrollbar position changes. */ - - shell_content = E_SHELL_CONTENT (mail_shell_content); - shell_view = e_shell_content_get_shell_view (shell_content); - key_file = e_shell_view_get_state_key_file (shell_view); - - reader = E_MAIL_READER (mail_shell_content); - folder_uri = e_mail_reader_get_folder_uri (reader); - message_list = e_mail_reader_get_message_list (reader); - - scrolled_window = GTK_SCROLLED_WINDOW (priv->scrolled_window); - vscrollbar = gtk_scrolled_window_get_vscrollbar (scrolled_window); - - if (folder_uri == NULL) - goto skip; - - /* Restore the message list scrollbar position. */ - - key = STATE_KEY_SCROLLBAR_POSITION; - group_name = g_strdup_printf ("Folder %s", folder_uri); - - if (g_key_file_has_key (key_file, group_name, key, NULL)) { - gdouble value; - - value = g_key_file_get_double ( - key_file, group_name, key, NULL); - gtk_range_set_value (GTK_RANGE (vscrollbar), value); - } - - g_free (group_name); - -skip: - priv->message_list_scrolled_id = g_signal_connect_swapped ( - vscrollbar, "value-changed", - G_CALLBACK (mail_shell_content_message_list_scrolled_cb), - mail_shell_content); - - priv->scroll_timeout_id = 0; - - return FALSE; -} - static void mail_shell_content_message_list_built_cb (EMailShellContent *mail_shell_content, MessageList *message_list) @@ -250,33 +141,6 @@ mail_shell_content_message_list_built_cb (EMailShellContent *mail_shell_content, g_free (uid); } - - /* FIXME This is a gross workaround for an ETable bug that I can't - * fix (Ximian bug #55303). - * - * Since e_canvas_item_region_show_relay() uses a timeout, - * we have to use a timeout of the same interval but a lower - * priority. */ - priv->scroll_timeout_id = g_timeout_add_full ( - G_PRIORITY_LOW, 250, (GSourceFunc) - mail_shell_content_scroll_timeout_cb, - mail_shell_content, NULL); - - /* FIXME This prevents the message list from saving the scrollbar - * position before we've had a chance to restore the position. - * It gets restored in the timeout handler we just added. */ - if (priv->message_list_scrolled_id > 0) { - g_signal_handler_disconnect ( - vscrollbar, priv->message_list_scrolled_id); - priv->message_list_scrolled_id = 0; - } - - /* FIXME This is another ugly hack to hide a side-effect of the - * previous workaround. */ - g_signal_connect_swapped ( - vscrollbar, "button-press-event", - G_CALLBACK (mail_shell_content_etree_unfreeze), - message_list); } static void -- cgit