diff options
author | Milan Crha <mcrha@redhat.com> | 2009-12-18 03:17:04 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2009-12-18 03:17:04 +0800 |
commit | 134a7d4bbde9d96e1e002abebb667c5d3cde66ca (patch) | |
tree | 1aff7b0f1f64949193459fde96b2a997ee49c6cf | |
parent | fe15c797a036820ac4b5e8cf232ad0a559fcd06b (diff) | |
download | gsoc2013-evolution-134a7d4bbde9d96e1e002abebb667c5d3cde66ca.tar gsoc2013-evolution-134a7d4bbde9d96e1e002abebb667c5d3cde66ca.tar.gz gsoc2013-evolution-134a7d4bbde9d96e1e002abebb667c5d3cde66ca.tar.bz2 gsoc2013-evolution-134a7d4bbde9d96e1e002abebb667c5d3cde66ca.tar.lz gsoc2013-evolution-134a7d4bbde9d96e1e002abebb667c5d3cde66ca.tar.xz gsoc2013-evolution-134a7d4bbde9d96e1e002abebb667c5d3cde66ca.tar.zst gsoc2013-evolution-134a7d4bbde9d96e1e002abebb667c5d3cde66ca.zip |
Bug #593700 - Restore folder's last selected message as expected
-rw-r--r-- | mail/message-list.c | 12 | ||||
-rw-r--r-- | 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; @@ -85,112 +82,6 @@ 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 |