diff options
-rw-r--r-- | em-format/e-mail-formatter.c | 20 | ||||
-rw-r--r-- | em-format/e-mail-formatter.h | 2 | ||||
-rw-r--r-- | mail/e-mail-display.c | 2 | ||||
-rw-r--r-- | mail/e-mail-reader-utils.c | 107 | ||||
-rw-r--r-- | mail/e-mail-reader-utils.h | 3 | ||||
-rw-r--r-- | mail/e-mail-reader.c | 1 | ||||
-rw-r--r-- | modules/mail/e-mail-config-format-html.c | 75 |
7 files changed, 99 insertions, 111 deletions
diff --git a/em-format/e-mail-formatter.c b/em-format/e-mail-formatter.c index a08504a21f..0c8a0e7068 100644 --- a/em-format/e-mail-formatter.c +++ b/em-format/e-mail-formatter.c @@ -72,6 +72,13 @@ enum { PROP_DEFAULT_CHARSET }; +enum { + NEED_REDRAW, + LAST_SIGNAL +}; + +static int signals[LAST_SIGNAL]; + static void mail_formatter_run (EMailFormatter *formatter, EMailFormatterContext *context, @@ -492,6 +499,7 @@ e_mail_formatter_base_init (EMailFormatterClass *klass) CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS | CAMEL_MIME_FILTER_TOHTML_CONVERT_NL | CAMEL_MIME_FILTER_TOHTML_CONVERT_SPACES | + CAMEL_MIME_FILTER_TOHTML_CONVERT_ADDRESSES | CAMEL_MIME_FILTER_TOHTML_MARK_CITATION; } @@ -691,6 +699,16 @@ e_mail_formatter_class_init (EMailFormatterClass *klass) NULL, NULL, G_PARAM_READWRITE)); + + signals[NEED_REDRAW] = g_signal_new ( + "need-redraw", + E_TYPE_MAIL_FORMATTER, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (EMailFormatterClass, need_redraw), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, NULL); } static void @@ -1414,6 +1432,8 @@ e_mail_formatter_add_header (EMailFormatter *formatter, h = e_mail_formatter_header_new (name, value); h->flags = flags; g_queue_push_tail (formatter->priv->header_list, h); + + g_signal_emit (formatter, signals[NEED_REDRAW], 0, NULL); } void diff --git a/em-format/e-mail-formatter.h b/em-format/e-mail-formatter.h index aea18439b2..c0c21c13b0 100644 --- a/em-format/e-mail-formatter.h +++ b/em-format/e-mail-formatter.h @@ -126,6 +126,8 @@ struct _EMailFormatterClass { GtkStyle *style, GtkStateType state); + /* Signals */ + void (*need_redraw) (EMailFormatter *formatter); }; GType e_mail_formatter_get_type (void); diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c index 4f72e843f6..33922d8c0a 100644 --- a/mail/e-mail-display.c +++ b/mail/e-mail-display.c @@ -1552,6 +1552,8 @@ e_mail_display_set_mode (EMailDisplay *display, G_CALLBACK (e_mail_display_reload), display, "swapped-signal::notify::header-color", G_CALLBACK (e_mail_display_reload), display, + "swapped-signal::need-redraw", + G_CALLBACK (e_mail_display_reload), display, NULL); e_mail_display_reload (display); diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c index f18d881ba2..d1c3d3d7e5 100644 --- a/mail/e-mail-reader-utils.c +++ b/mail/e-mail-reader-utils.c @@ -1536,113 +1536,6 @@ e_mail_reader_header_free (EMailReaderHeader *header) g_free (header); } -struct headers_changed_closure { - EMailFormatter *formatter; - EMailDisplay *display; -}; - -static void -free_headers_changed_closure (struct headers_changed_closure *closure) -{ - g_clear_object (&closure->formatter); - g_clear_object (&closure->display); - - g_free (closure); -} - -static void -headers_changed_cb (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - struct headers_changed_closure *closure) -{ - GSList *header_config_list, *p; - - g_return_if_fail (client != NULL); - - header_config_list = gconf_client_get_list ( - client, "/apps/evolution/mail/display/headers", - GCONF_VALUE_STRING, NULL); - - e_mail_formatter_clear_headers (closure->formatter); - for (p = header_config_list; p; p = g_slist_next (p)) { - EMailReaderHeader *h; - gchar *xml = (gchar *) p->data; - - h = e_mail_reader_header_from_xml (xml); - if (h && h->enabled) - e_mail_formatter_add_header ( - closure->formatter, h->name, NULL, - E_MAIL_FORMATTER_HEADER_FLAG_BOLD); - - e_mail_reader_header_free (h); - } - - if (!header_config_list) - e_mail_formatter_set_default_headers (closure->formatter); - - g_slist_foreach (header_config_list, (GFunc) g_free, NULL); - g_slist_free (header_config_list); - - /* force a redraw */ - if (closure->display) { - e_mail_display_reload (closure->display); - } -} - -static void -remove_header_notify_cb (gpointer data) -{ - GConfClient *client; - guint notify_id; - - notify_id = GPOINTER_TO_INT (data); - g_return_if_fail (notify_id != 0); - - client = gconf_client_get_default (); - gconf_client_notify_remove (client, notify_id); - gconf_client_remove_dir (client, "/apps/evolution/mail/display", NULL); - g_object_unref (client); -} - -/** - * e_mail_reader_connect_headers - * @reader: an #EMailReader - * - * Connects @reader to listening for changes in headers and - * updates the EMFormat whenever it changes and on this call too. - **/ -void -e_mail_reader_connect_headers (EMailReader *reader, - EMailFormatter *formatter) -{ - GConfClient *client; - guint notify_id; - struct headers_changed_closure *closure; - - client = gconf_client_get_default (); - - closure = g_new0 (struct headers_changed_closure, 1); - closure->display = g_object_ref (e_mail_reader_get_mail_display (reader)); - closure->formatter = g_object_ref (formatter); - - gconf_client_add_dir ( - client, "/apps/evolution/mail/display", - GCONF_CLIENT_PRELOAD_NONE, NULL); - notify_id = gconf_client_notify_add ( - client, "/apps/evolution/mail/display/headers", - (GConfClientNotifyFunc) headers_changed_cb, - closure, (GFreeFunc) free_headers_changed_closure, NULL); - - g_object_set_data_full ( - G_OBJECT (formatter), "reader-header-notify-id", - GINT_TO_POINTER (notify_id), remove_header_notify_cb); - - headers_changed_cb (client, 0, NULL, closure); - - g_object_unref (client); -} - static GHashTable * mail_reader_get_mail_register (void) { diff --git a/mail/e-mail-reader-utils.h b/mail/e-mail-reader-utils.h index 887e399451..a3a1cdb86d 100644 --- a/mail/e-mail-reader-utils.h +++ b/mail/e-mail-reader-utils.h @@ -67,9 +67,6 @@ EMailReaderHeader * gchar * e_mail_reader_header_to_xml (EMailReaderHeader *header); void e_mail_reader_header_free (EMailReaderHeader *header); -void e_mail_reader_connect_headers (EMailReader *reader, - EMailFormatter *formatter); - EMailPartList * e_mail_reader_lookup_part_list (EMailReader *reader, const gchar *uri); diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index 3d0911b1fc..069f064953 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -4768,5 +4768,4 @@ e_mail_reader_set_formatter (EMailReader *reader, priv->formatter = formatter; - e_mail_reader_connect_headers (reader, formatter); } diff --git a/modules/mail/e-mail-config-format-html.c b/modules/mail/e-mail-config-format-html.c index cbedecf914..a764e7d729 100644 --- a/modules/mail/e-mail-config-format-html.c +++ b/modules/mail/e-mail-config-format-html.c @@ -27,16 +27,74 @@ #include <shell/e-shell.h> #include <e-util/e-util.h> #include <em-format/e-mail-formatter.h> +#include <mail/e-mail-reader-utils.h> static gpointer parent_class; static void +headers_changed_cb (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) +{ + GSList *header_config_list, *p; + EExtension *extension; + EMailFormatter *formatter; + + g_return_if_fail (client != NULL); + + extension = user_data; + formatter = E_MAIL_FORMATTER (e_extension_get_extensible (extension)); + + header_config_list = gconf_client_get_list ( + client, "/apps/evolution/mail/display/headers", + GCONF_VALUE_STRING, NULL); + + e_mail_formatter_clear_headers (formatter); + for (p = header_config_list; p; p = g_slist_next (p)) { + EMailReaderHeader *h; + gchar *xml = (gchar *) p->data; + + h = e_mail_reader_header_from_xml (xml); + if (h && h->enabled) + e_mail_formatter_add_header ( + formatter, h->name, NULL, + E_MAIL_FORMATTER_HEADER_FLAG_BOLD); + + e_mail_reader_header_free (h); + } + + if (!header_config_list) + e_mail_formatter_set_default_headers (formatter); + + g_slist_foreach (header_config_list, (GFunc) g_free, NULL); + g_slist_free (header_config_list); +} + +static void +remove_header_notify_cb (gpointer data) +{ + GConfClient *client; + guint notify_id; + + notify_id = GPOINTER_TO_INT (data); + g_return_if_fail (notify_id != 0); + + client = gconf_client_get_default (); + gconf_client_notify_remove (client, notify_id); + gconf_client_remove_dir (client, "/apps/evolution/mail/display", NULL); + g_object_unref (client); +} + +static void mail_config_format_html_constructed (GObject *object) { EExtension *extension; EExtensible *extensible; EShellSettings *shell_settings; EShell *shell; + GConfClient *client; + guint notify_id; extension = E_EXTENSION (object); extensible = e_extension_get_extensible (extension); @@ -81,6 +139,23 @@ mail_config_format_html_constructed (GObject *object) extensible, "animate-images", G_BINDING_SYNC_CREATE); + + client = gconf_client_get_default (); + gconf_client_add_dir ( + client, "/apps/evolution/mail/display", + GCONF_CLIENT_PRELOAD_NONE, NULL); + notify_id = gconf_client_notify_add ( + client, "/apps/evolution/mail/display/headers", + (GConfClientNotifyFunc) headers_changed_cb, + object, NULL, NULL); + + g_object_set_data_full ( + G_OBJECT (extensible), "reader-header-notify-id", + GINT_TO_POINTER (notify_id), remove_header_notify_cb); + + /* Initial synchronization */ + headers_changed_cb (client, 0, NULL, object); + /* Chain up to parent's constructed() method. */ G_OBJECT_CLASS (parent_class)->constructed (object); } |