[evolution] Bug #706008 - Workaround gnome-shell style change on focus change
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Bug #706008 - Workaround gnome-shell style change on focus change
- Date: Thu, 12 Sep 2013 13:33:16 +0000 (UTC)
commit 68f27ce0c8a3ed44d1f1105970cc68326df6bad3
Author: Tomas Popela <tpopela redhat com>
Date: Thu Sep 12 15:29:58 2013 +0200
Bug #706008 - Workaround gnome-shell style change on focus change
Avoid redrawing (thus loosing the selection and scroll position) of
preview window on style change by defining the colors through CSS styles.
On style change we just update the CSS color definitions and preview will
update itself without redraw.
addressbook/gui/widgets/eab-contact-formatter.c | 4 +-
calendar/gui/e-cal-component-preview.c | 10 +-
data/webview.css | 2 -
e-util/e-web-view.c | 263 ++++++++++++++++++--
e-util/e-web-view.h | 7 +-
em-format/e-mail-formatter-error.c | 14 +-
em-format/e-mail-formatter-headers.c | 20 +--
em-format/e-mail-formatter-message-rfc822.c | 10 +-
em-format/e-mail-formatter-source.c | 29 +--
em-format/e-mail-formatter-text-enriched.c | 14 +-
em-format/e-mail-formatter-text-html.c | 8 +-
em-format/e-mail-formatter-text-plain.c | 35 +--
em-format/e-mail-formatter.c | 33 ++-
em-format/e-mail-formatter.h | 2 +
mail/e-mail-display.c | 101 +++++++--
.../e-mail-formatter-text-highlight.c | 11 +-
16 files changed, 398 insertions(+), 165 deletions(-)
---
diff --git a/addressbook/gui/widgets/eab-contact-formatter.c b/addressbook/gui/widgets/eab-contact-formatter.c
index 60beefa..71f7275 100644
--- a/addressbook/gui/widgets/eab-contact-formatter.c
+++ b/addressbook/gui/widgets/eab-contact-formatter.c
@@ -747,7 +747,7 @@ render_normal (EABContactFormatter *formatter,
GString *buffer)
{
g_string_append (buffer, HTML_HEADER);
- g_string_append (buffer, "<body bgcolor=\"white\">");
+ g_string_append (buffer,"<body class=\"-e-web-view-background-color -e-web-view-text-color\">");
if (contact != NULL) {
if (e_contact_get (contact, E_CONTACT_IS_LIST))
@@ -769,7 +769,7 @@ render_compact (EABContactFormatter *formatter,
EContactPhoto *photo;
g_string_append (buffer, HTML_HEADER);
- g_string_append (buffer, "<body>\n");
+ g_string_append (buffer,"<body class=\"-e-web-view-background-color -e-web-view-text-color\">");
if (contact == NULL) {
g_string_append (buffer, "</body></html>");
diff --git a/calendar/gui/e-cal-component-preview.c b/calendar/gui/e-cal-component-preview.c
index ffaba3f..c96e064 100644
--- a/calendar/gui/e-cal-component-preview.c
+++ b/calendar/gui/e-cal-component-preview.c
@@ -205,8 +205,6 @@ cal_component_preview_write_html (ECalComponentPreview *preview,
icalproperty_status status;
const gchar *location;
gint *priority_value;
- GtkStyle *style;
- GtkStateType state;
client = preview->priv->client;
comp = preview->priv->comp;
@@ -216,14 +214,8 @@ cal_component_preview_write_html (ECalComponentPreview *preview,
/* write document header */
e_cal_component_get_summary (comp, &text);
- style = gtk_widget_get_style (GTK_WIDGET (preview));
- state = gtk_widget_get_state (GTK_WIDGET (preview));
-
g_string_append (buffer, HTML_HEADER);
- g_string_append_printf (
- buffer, "<body bgcolor=\"#%06x\" text=\"#%06x\">",
- e_color_to_value (&style->base[state]),
- e_color_to_value (&style->text[state]));
+ g_string_append (buffer, "<body class=\"-e-web-view-background-color -e-web-view-text-color\">");
if (text.value)
g_string_append_printf (buffer, "<h2>%s</h2>", text.value);
diff --git a/data/webview.css b/data/webview.css
index f28ed3d..9d381a8 100644
--- a/data/webview.css
+++ b/data/webview.css
@@ -14,7 +14,6 @@ body {
th {
text-align: left;
- font-weight: normal;
vertical-align: top;
}
@@ -50,7 +49,6 @@ img.navigable {
.part-container {
height: 100%;
- background: #FFF;
margin-top: 2px;
margin-bottom: 3px;
border-width: 1px;
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c
index 4257152..668b395 100644
--- a/e-util/e-web-view.c
+++ b/e-util/e-web-view.c
@@ -564,6 +564,59 @@ web_view_navigation_policy_decision_requested_cb (EWebView *web_view,
}
static void
+style_updated_cb (EWebView *web_view)
+{
+ GdkRGBA color;
+ gchar *color_value;
+ gchar *style;
+ GtkStateFlags state_flags;
+ GtkStyleContext *style_context;
+ GtkWidgetPath *widget_path;
+
+ state_flags = gtk_widget_get_state_flags (GTK_WIDGET (web_view));
+ style_context = gtk_style_context_new ();
+ widget_path = gtk_widget_path_new ();
+ gtk_widget_path_append_type (widget_path, GTK_TYPE_WINDOW);
+ gtk_style_context_set_path (style_context, widget_path);
+ gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_ENTRY);
+
+ gtk_style_context_get_background_color (
+ style_context,
+ state_flags | GTK_STATE_FLAG_FOCUSED,
+ &color);
+ color_value = g_strdup_printf ("#%06x", e_rgba_to_value (&color));
+ style = g_strconcat ("background-color: ", color_value, ";", NULL);
+
+ e_web_view_add_css_rule_into_style_sheet (
+ web_view,
+ "-e-web-view-css-sheet",
+ ".-e-web-view-background-color",
+ style);
+
+ g_free (color_value);
+ g_free (style);
+
+ gtk_style_context_get_color (
+ style_context,
+ state_flags | GTK_STATE_FLAG_FOCUSED,
+ &color);
+ color_value = g_strdup_printf ("#%06x", e_rgba_to_value (&color));
+ style = g_strconcat ("color: ", color_value, ";", NULL);
+
+ e_web_view_add_css_rule_into_style_sheet (
+ web_view,
+ "-e-web-view-css-sheet",
+ ".-e-web-view-text-color",
+ style);
+
+ gtk_widget_path_free (widget_path);
+ g_object_unref (style_context);
+
+ g_free (color_value);
+ g_free (style);
+}
+
+static void
web_view_load_status_changed_cb (WebKitWebView *webkit_web_view,
GParamSpec *pspec,
gpointer user_data)
@@ -575,14 +628,17 @@ web_view_load_status_changed_cb (WebKitWebView *webkit_web_view,
status = webkit_web_view_get_load_status (webkit_web_view);
- if (status == WEBKIT_LOAD_FINISHED) {
- web_view_update_document_highlights (web_view);
+ if (status != WEBKIT_LOAD_FINISHED)
+ return;
- /* Workaround webkit bug:
- * https://bugs.webkit.org/show_bug.cgi?id=89553 */
- e_web_view_zoom_in (web_view);
- e_web_view_zoom_out (web_view);
- }
+ style_updated_cb (web_view);
+
+ web_view_update_document_highlights (web_view);
+
+ /* Workaround webkit bug:
+ * https://bugs.webkit.org/show_bug.cgi?id=89553 */
+ e_web_view_zoom_in (web_view);
+ e_web_view_zoom_out (web_view);
}
static void
@@ -1579,6 +1635,14 @@ e_web_view_init (EWebView *web_view)
web_view, "notify::load-status",
G_CALLBACK (web_view_load_status_changed_cb), NULL);
+ g_signal_connect (
+ web_view, "style-updated",
+ G_CALLBACK (style_updated_cb), NULL);
+
+ g_signal_connect (
+ web_view, "state-flags-changed",
+ G_CALLBACK (style_updated_cb), NULL);
+
ui_manager = gtk_ui_manager_new ();
web_view->priv->ui_manager = ui_manager;
@@ -1725,6 +1789,8 @@ e_web_view_init (EWebView *web_view)
id = "org.gnome.evolution.webview";
e_plugin_ui_register_manager (ui_manager, id, web_view);
e_plugin_ui_enable_manager (ui_manager, id);
+
+ e_web_view_clear (E_WEB_VIEW (web_view));
}
GtkWidget *
@@ -1736,21 +1802,15 @@ e_web_view_new (void)
void
e_web_view_clear (EWebView *web_view)
{
- GtkStyle *style;
- gchar *html;
-
g_return_if_fail (E_IS_WEB_VIEW (web_view));
- style = gtk_widget_get_style (GTK_WIDGET (web_view));
-
- html = g_strdup_printf (
- "<html><head></head><body bgcolor=\"#%06x\"></body></html>",
- e_color_to_value (&style->base[GTK_STATE_NORMAL]));
-
webkit_web_view_load_html_string (
- WEBKIT_WEB_VIEW (web_view), html, NULL);
-
- g_free (html);
+ WEBKIT_WEB_VIEW (web_view),
+ "<html> \
+ <head></head> \
+ <body class=\"-e-web-view-background-color -e-web-view-text-color\"></body> \
+ </html>",
+ NULL);
}
void
@@ -3234,3 +3294,168 @@ e_web_view_install_request_handler (EWebView *web_view,
g_object_unref (feature);
}
+static void
+create_and_add_css_style_sheet (WebKitDOMDocument *document,
+ const gchar *style_sheet_id)
+{
+ WebKitDOMElement *style_element;
+
+ style_element = webkit_dom_document_get_element_by_id (document, style_sheet_id);
+
+ if (!style_element) {
+ /* Create new <style> element */
+ style_element = webkit_dom_document_create_element (document, "style", NULL);
+ webkit_dom_html_element_set_id (
+ WEBKIT_DOM_HTML_ELEMENT (style_element),
+ style_sheet_id);
+ webkit_dom_html_style_element_set_media (
+ WEBKIT_DOM_HTML_STYLE_ELEMENT (style_element),
+ "screen");
+ webkit_dom_node_append_child (
+ WEBKIT_DOM_NODE (style_element),
+ /* WebKit hack - we have to insert empty TextNode into style element */
+ WEBKIT_DOM_NODE (webkit_dom_document_create_text_node (document, "")),
+ NULL);
+
+ webkit_dom_node_append_child (
+ WEBKIT_DOM_NODE (webkit_dom_document_get_head (document)),
+ WEBKIT_DOM_NODE (style_element),
+ NULL);
+ }
+}
+
+static void
+add_css_rule_into_style_sheet (WebKitDOMDocument *document,
+ const gchar *style_sheet_id,
+ const gchar *selector,
+ const gchar *style)
+{
+ WebKitDOMElement *style_element;
+ WebKitDOMStyleSheet *sheet;
+ WebKitDOMCSSRuleList *rules_list;
+ gint length, ii;
+
+ style_element = webkit_dom_document_get_element_by_id (document, style_sheet_id);
+
+ if (!style_element) {
+ create_and_add_css_style_sheet (document, style_sheet_id);
+ style_element = webkit_dom_document_get_element_by_id (document, style_sheet_id);
+ }
+
+ /* Get sheet that is associated with style element */
+ sheet = webkit_dom_html_style_element_get_sheet (WEBKIT_DOM_HTML_STYLE_ELEMENT (style_element));
+
+ rules_list = webkit_dom_css_style_sheet_get_css_rules (WEBKIT_DOM_CSS_STYLE_SHEET (sheet));
+ length = webkit_dom_css_rule_list_get_length (rules_list);
+
+ /* Check if rule exists */
+ for (ii = 0; ii < length; ii++) {
+ WebKitDOMCSSRule *rule;
+ const gchar *rule_text;
+ gchar *rule_selector, *selector_end;
+
+ rule = webkit_dom_css_rule_list_item (rules_list, ii);
+
+ if (!WEBKIT_DOM_IS_CSS_RULE (rule))
+ continue;
+
+ rule_text = webkit_dom_css_rule_get_css_text (rule);
+
+ /* Find the start of the style => end of the selector */
+ selector_end = g_strstr_len (rule_text, -1, " {");
+ if (!selector_end)
+ continue;
+
+ rule_selector =
+ g_utf8_substring (
+ rule_text,
+ 0,
+ g_utf8_pointer_to_offset (rule_text, selector_end));
+
+ if (g_strcmp0 (rule_selector, selector) == 0) {
+ /* If exists remove it */
+ webkit_dom_css_style_sheet_remove_rule (
+ WEBKIT_DOM_CSS_STYLE_SHEET (sheet),
+ ii, NULL);
+ }
+
+ g_free (rule_selector);
+ }
+
+ /* Insert the rule at the end, so it will override previously inserted */
+ webkit_dom_css_style_sheet_add_rule (
+ WEBKIT_DOM_CSS_STYLE_SHEET (sheet),
+ selector,
+ style,
+ webkit_dom_css_rule_list_get_length (
+ webkit_dom_css_style_sheet_get_css_rules (
+ WEBKIT_DOM_CSS_STYLE_SHEET (sheet))), /* Index */
+ NULL);
+}
+
+static void
+add_css_rule_into_style_sheet_recursive (WebKitDOMDocument *document,
+ const gchar *style_sheet_id,
+ const gchar *selector,
+ const gchar *style)
+{
+ WebKitDOMNodeList *frames;
+ gint ii, length;
+
+ /* Add rule to document */
+ add_css_rule_into_style_sheet (
+ document,
+ style_sheet_id,
+ selector,
+ style);
+
+ frames = webkit_dom_document_query_selector_all (document, "iframe", NULL);
+ length = webkit_dom_node_list_get_length (frames);
+
+ /* Add rules to every sub document */
+ for (ii = 0; ii < length; ii++) {
+ WebKitDOMDocument *iframe_document;
+ WebKitDOMNode *node;
+
+ node = webkit_dom_node_list_item (frames, ii);
+ iframe_document = webkit_dom_html_iframe_element_get_content_document (
+ WEBKIT_DOM_HTML_IFRAME_ELEMENT (node));
+
+ add_css_rule_into_style_sheet_recursive (
+ iframe_document,
+ style_sheet_id,
+ selector,
+ style);
+ }
+}
+
+/**
+ * e_web_view_add_css_rule_into_style_sheet:
+ * @web_view: an #EWebView
+ * @style_sheet_id: CSS style sheet's id
+ * @selector: CSS selector
+ * @style: style for given selector
+ *
+ * Insert new CSS rule (defined with @selector and @style) into CSS style sheet
+ * with given @style_sheet_id. If style sheet doesn't exist, it's created.
+ *
+ * The rule is inserted to every DOM document that is in page. That means also into
+ * DOM documents inside iframe elements.
+ **/
+void
+e_web_view_add_css_rule_into_style_sheet (EWebView *view,
+ const gchar *style_sheet_id,
+ const gchar *selector,
+ const gchar *style)
+{
+ g_return_if_fail (E_IS_WEB_VIEW (view));
+ g_return_if_fail (style_sheet_id && *style_sheet_id);
+ g_return_if_fail (selector && *selector);
+ g_return_if_fail (style && *style);
+
+ add_css_rule_into_style_sheet_recursive (
+ webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)),
+ style_sheet_id,
+ selector,
+ style);
+}
diff --git a/e-util/e-web-view.h b/e-util/e-web-view.h
index 2f99b7a..51826a7 100644
--- a/e-util/e-web-view.h
+++ b/e-util/e-web-view.h
@@ -195,11 +195,14 @@ void e_web_view_request (EWebView *web_view,
GInputStream * e_web_view_request_finish (EWebView *web_view,
GAsyncResult *result,
GError **error);
-
void e_web_view_install_request_handler
(EWebView *web_view,
GType handler_type);
-
+void e_web_view_add_css_rule_into_style_sheet
+ (EWebView *view,
+ const gchar *style_sheet_id,
+ const gchar *selector,
+ const gchar *style);
G_END_DECLS
#endif /* E_WEB_VIEW_H */
diff --git a/em-format/e-mail-formatter-error.c b/em-format/e-mail-formatter-error.c
index 8669c11..f349283 100644
--- a/em-format/e-mail-formatter-error.c
+++ b/em-format/e-mail-formatter-error.c
@@ -59,24 +59,14 @@ emfe_error_format (EMailFormatterExtension *extension,
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
html = g_strdup_printf (
- "<div class=\"part-container\" style=\""
- "border-color: #%06x;"
- "background-color: #%06x; color: #%06x;\">"
+ "<div class=\"part-container -e-mail-formatter-frame-color "
+ "-e-mail-formatter-body-color -e-web-view-text-color\">"
"<div class=\"part-container-inner-margin pre\">\n"
"<table border=\"0\" cellspacing=\"10\" "
"cellpadding=\"0\" width=\"100%%\">\n"
"<tr valign=\"top\"><td width=50>"
"<img src=\"gtk-stock://%s/?size=%d\" /></td>\n"
"<td style=\"color: red;\">",
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_FRAME)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_BODY)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_TEXT)),
GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
camel_stream_write_string (stream, html, cancellable, NULL);
diff --git a/em-format/e-mail-formatter-headers.c b/em-format/e-mail-formatter-headers.c
index e9f8870..3117bec 100644
--- a/em-format/e-mail-formatter-headers.c
+++ b/em-format/e-mail-formatter-headers.c
@@ -490,9 +490,6 @@ emfe_headers_format (EMailFormatterExtension *extension,
{
CamelMimePart *mime_part;
GString *buffer;
- const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
- const GdkRGBA *body_rgba = &white;
- const GdkRGBA *header_rgba;
const gchar *direction;
gboolean is_collapsable;
gboolean is_collapsed;
@@ -524,22 +521,15 @@ emfe_headers_format (EMailFormatterExtension *extension,
buffer = g_string_new ("");
- if (context->mode != E_MAIL_FORMATTER_MODE_PRINTING)
- body_rgba = e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_BODY);
-
- header_rgba = e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_HEADER);
-
g_string_append_printf (
buffer,
- "<div class=\"headers\" style=\"background: #%06x;\" id=\"%s\">"
- "<table border=\"0\" width=\"100%%\" "
- "style=\"color: #%06x; direction: %s\">"
+ "%s id=\"%s\"><table class=\"-e-mail-formatter-header-color\" border=\"0\" width=\"100%%\" "
+ "style=\"direction: %s\">"
"<tr>",
- e_rgba_to_value (body_rgba),
+ (context->mode != E_MAIL_FORMATTER_MODE_PRINTING) ?
+ "<div class=\"headers -e-mail-formatter-body-color\"" :
+ "<div class=\"headers\" style=\"background-color: #ffffff;\"",
e_mail_part_get_id (part),
- e_rgba_to_value (header_rgba),
direction);
if (is_collapsable)
diff --git a/em-format/e-mail-formatter-message-rfc822.c b/em-format/e-mail-formatter-message-rfc822.c
index 0477e61..6b9f4ee 100644
--- a/em-format/e-mail-formatter-message-rfc822.c
+++ b/em-format/e-mail-formatter-message-rfc822.c
@@ -221,18 +221,12 @@ emfe_message_rfc822_format (EMailFormatterExtension *extension,
NULL);
str = g_strdup_printf (
- "<div class=\"part-container\" style=\"border-color: #%06x; "
- "background-color: #%06x;\">\n"
+ "<div class=\"part-container -e-mail-formatter-frame-color "
+ "-e-mail-formatter-body-color\">\n"
"<iframe width=\"100%%\" height=\"10\""
" id=\"%s.iframe\" "
" frameborder=\"0\" src=\"%s\" name=\"%s\"></iframe>"
"</div>",
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_FRAME)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_BODY)),
part_id, uri, part_id);
camel_stream_write_string (stream, str, cancellable, NULL);
diff --git a/em-format/e-mail-formatter-source.c b/em-format/e-mail-formatter-source.c
index 944f9a4..12eaa4a 100644
--- a/em-format/e-mail-formatter-source.c
+++ b/em-format/e-mail-formatter-source.c
@@ -70,31 +70,16 @@ emfe_source_format (EMailFormatterExtension *extension,
buffer = g_string_new ("");
if (CAMEL_IS_MIME_MESSAGE (mime_part)) {
- g_string_append_printf (
+ g_string_append (
buffer,
- "<div class=\"part-container\" "
- "style=\"border: 0; background: #%06x; color: #%06x;\" >",
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_BODY)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_TEXT)));
+ "<div class=\"part-container -e-mail-formatter-body-color "
+ "-e-web-view-text-color\" style=\"border: 0;\" >");
} else {
- g_string_append_printf (
+ g_string_append (
buffer,
- "<div class=\"part-container\" "
- "style=\"border-color: #%06x; background: #%06x; color: #%06x;\">"
- "<div class=\"part-container-inner-margin pre\">\n",
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_FRAME)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_BODY)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_TEXT)));
+ "<div class=\"part-container -e-mail-formatter-body-color "
+ " -e-web-view-text-color -e-mail-formatter-frame-color\">"
+ "<div class=\"part-container-inner-margin pre\">\n");
}
camel_stream_write_string (
diff --git a/em-format/e-mail-formatter-text-enriched.c b/em-format/e-mail-formatter-text-enriched.c
index 6c3b033..168522e 100644
--- a/em-format/e-mail-formatter-text-enriched.c
+++ b/em-format/e-mail-formatter-text-enriched.c
@@ -73,17 +73,11 @@ emfe_text_enriched_format (EMailFormatterExtension *extension,
buffer = g_string_new ("");
- g_string_append_printf (
+ g_string_append (
buffer,
- "<div class=\"part-container\" style=\"border-color: #%06x; "
- "background-color: #%06x; color: #%06x;\">"
- "<div class=\"part-container-inner-margin\">\n",
- e_rgba_to_value (
- e_mail_formatter_get_color (formatter, E_MAIL_FORMATTER_COLOR_FRAME)),
- e_rgba_to_value (
- e_mail_formatter_get_color (formatter, E_MAIL_FORMATTER_COLOR_CONTENT)),
- e_rgba_to_value (
- e_mail_formatter_get_color (formatter, E_MAIL_FORMATTER_COLOR_TEXT)));
+ "<div class=\"part-container -e-mail-formatter-frame-color "
+ "-e-web-view-background-color -e-web-view-text-color\">"
+ "<div class=\"part-container-inner-margin\">\n");
camel_stream_write_string (stream, buffer->str, cancellable, NULL);
g_string_free (buffer, TRUE);
diff --git a/em-format/e-mail-formatter-text-html.c b/em-format/e-mail-formatter-text-html.c
index 0a58111..17632fa 100644
--- a/em-format/e-mail-formatter-text-html.c
+++ b/em-format/e-mail-formatter-text-html.c
@@ -328,15 +328,13 @@ emfe_text_html_format (EMailFormatterExtension *extension,
"<iframe width=\"100%%\" height=\"10\" "
" frameborder=\"0\" src=\"%s\" "
" id=\"%s.iframe\" name=\"%s\" "
- " style=\"border: 1px solid #%06x; background-color: #ffffff;\">"
+ " class=\"-e-mail-formatter-frame-color\" "
+ " style=\"background-color: #ffffff; border: 1px solid;\">"
"</iframe>"
"</div>",
uri,
e_mail_part_get_id (part),
- e_mail_part_get_id (part),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_FRAME)));
+ e_mail_part_get_id (part));
camel_stream_write_string (stream, str, cancellable, NULL);
diff --git a/em-format/e-mail-formatter-text-plain.c b/em-format/e-mail-formatter-text-plain.c
index 638f011..487dd34 100644
--- a/em-format/e-mail-formatter-text-plain.c
+++ b/em-format/e-mail-formatter-text-plain.c
@@ -70,10 +70,11 @@ emfe_text_plain_format (EMailFormatterExtension *extension,
CamelDataWrapper *dw;
if (context->mode == E_MAIL_FORMATTER_MODE_RAW) {
- gchar *header;
- header = e_mail_formatter_get_html_header (formatter);
- camel_stream_write_string (stream, header, cancellable, NULL);
- g_free (header);
+ camel_stream_write_string (
+ stream,
+ e_mail_formatter_get_sub_html_header (formatter),
+ cancellable,
+ NULL);
/* No need for body margins within <iframe> */
camel_stream_write_string (
@@ -107,16 +108,10 @@ emfe_text_plain_format (EMailFormatterExtension *extension,
CAMEL_STREAM_FILTER (filtered_stream), html_filter);
g_object_unref (html_filter);
- content = g_strdup_printf (
- "<div class=\"part-container pre\" style=\""
- "border: none; padding: 8px; margin: 0; "
- "background-color: #%06x; color: #%06x;\">\n",
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_CONTENT)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_TEXT)));
+ content = g_strdup (
+ "<div class=\"part-container pre "
+ "-e-web-view-background-color -e-web-view-text-color\" "
+ "style=\"border: none; padding: 8px; margin: 0;\">");
camel_stream_write_string (stream, content, cancellable, NULL);
e_mail_formatter_format_text (formatter, part, filtered_stream, cancellable);
@@ -166,18 +161,14 @@ emfe_text_plain_format (EMailFormatterExtension *extension,
"<iframe width=\"100%%\" height=\"10\""
" id=\"%s.iframe\" name=\"%s\" "
" frameborder=\"0\" src=\"%s\" "
- " style=\"border: 1px solid #%06x; background-color: #%06x;\">"
+ " class=\"-e-mail-formatter-frame-color"
+ " -e-web-view-text-color\" "
+ " style=\"border: 1px solid;\">"
"</iframe>"
"</div>",
e_mail_part_get_id (part),
e_mail_part_get_id (part),
- uri,
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_FRAME)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_CONTENT)));
+ uri);
camel_stream_write_string (stream, str, cancellable, NULL);
diff --git a/em-format/e-mail-formatter.c b/em-format/e-mail-formatter.c
index f3f0967..0cbfaf2 100644
--- a/em-format/e-mail-formatter.c
+++ b/em-format/e-mail-formatter.c
@@ -1105,10 +1105,27 @@ e_mail_formatter_format_text (EMailFormatter *formatter,
g_object_unref (mime_part);
}
+const gchar *
+e_mail_formatter_get_sub_html_header (EMailFormatter *formatter)
+{
+ return "<!DOCTYPE HTML>\n"
+ "<html>\n"
+ "<head>\n"
+ "<meta name=\"generator\" content=\"Evolution Mail\"/>\n"
+ "<title>Evolution Mail Display</title>\n"
+ "<link type=\"text/css\" rel=\"stylesheet\" "
+ " href=\"" STYLESHEET_URI "\"/>\n"
+ "<style type=\"text/css\">\n"
+ " table th { font-weight: bold; }\n"
+ "</style>\n"
+ "</head>"
+ "<body class=\"-e-web-view-background-color -e-web-view-text-color\">";
+}
+
gchar *
e_mail_formatter_get_html_header (EMailFormatter *formatter)
{
- return g_strdup_printf (
+ return g_strdup (
"<!DOCTYPE HTML>\n"
"<html>\n"
"<head>\n"
@@ -1117,19 +1134,11 @@ e_mail_formatter_get_html_header (EMailFormatter *formatter)
"<link type=\"text/css\" rel=\"stylesheet\" "
" href=\"" STYLESHEET_URI "\"/>\n"
"<style type=\"text/css\">\n"
- " table th { color: #%06x; font-weight: bold; }\n"
+ " table th { font-weight: bold; }\n"
"</style>\n"
"</head>"
- "<body bgcolor=\"#%06x\" text=\"#%06x\">",
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_HEADER)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_BODY)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_TEXT)));
+ "<body class=\"-e-mail-formatter-body-color "
+ "-e-web-view-background-color -e-web-view-text-color\">");
}
EMailExtensionRegistry *
diff --git a/em-format/e-mail-formatter.h b/em-format/e-mail-formatter.h
index 9405789..5c9d6ff 100644
--- a/em-format/e-mail-formatter.h
+++ b/em-format/e-mail-formatter.h
@@ -125,6 +125,8 @@ void e_mail_formatter_format_text (EMailFormatter *formatter,
EMailPart *part,
CamelStream *stream,
GCancellable *cancellable);
+const gchar * e_mail_formatter_get_sub_html_header
+ (EMailFormatter *formatter);
gchar * e_mail_formatter_get_html_header
(EMailFormatter *formatter);
EMailExtensionRegistry *
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index 9343ac0..919ba68 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -832,6 +832,60 @@ toggle_address_visibility (WebKitDOMElement *button,
}
static void
+add_color_css_rule_for_web_view (EWebView *view,
+ const char *color_name,
+ const char *color_value)
+{
+ gchar *selector;
+ gchar *style;
+
+ selector = g_strconcat (".-e-mail-formatter-", color_name, NULL);
+
+ if (g_strstr_len (color_name, -1, "header"))
+ style = g_strconcat ("color: ", color_value, " !important;", NULL);
+ else if (g_strstr_len (color_name, -1, "frame"))
+ style = g_strconcat ("border-color: ", color_value, " !important;", NULL);
+ else
+ style = g_strconcat ("background-color: ", color_value, " !important;", NULL);
+
+ e_web_view_add_css_rule_into_style_sheet (
+ view,
+ "-e-mail-formatter-style-sheet",
+ selector,
+ style);
+
+ g_free (style);
+ g_free (selector);
+}
+
+static void
+initialize_web_view_colors (EMailDisplay *display)
+{
+ EMailFormatter *formatter;
+ const gchar *color_names [] = { "body-color", "citation-color",
+ "frame-color", "header-color", NULL };
+ gint ii;
+
+ formatter = e_mail_display_get_formatter (display);
+
+ for (ii = 0; color_names[ii]; ii++) {
+ GdkRGBA *color = NULL;
+ gchar *color_value;
+
+ g_object_get (formatter, color_names[ii], &color, NULL);
+ color_value = g_strdup_printf ("#%06x", e_rgba_to_value (color));
+
+ add_color_css_rule_for_web_view (
+ E_WEB_VIEW (display),
+ color_names[ii],
+ color_value);
+
+ gdk_rgba_free (color);
+ g_free (color_value);
+ }
+}
+
+static void
setup_dom_bindings (GObject *object,
GParamSpec *pspec,
gpointer user_data)
@@ -914,6 +968,7 @@ mail_parts_bind_dom (GObject *object,
if (display->priv->part_list == NULL)
return;
+ initialize_web_view_colors (display);
frame_name = webkit_web_frame_get_name (frame);
if (frame_name == NULL || *frame_name == '\0')
frame_name = ".message.headers";
@@ -1535,6 +1590,30 @@ e_mail_display_init (EMailDisplay *display)
}
}
+static void
+e_mail_display_update_colors (EMailDisplay *display,
+ GParamSpec *param_spec,
+ EMailFormatter *formatter)
+{
+ GdkRGBA *color = NULL;
+ gchar *color_value;
+
+ g_return_if_fail (E_IS_MAIL_DISPLAY (display));
+ g_return_if_fail (E_IS_MAIL_FORMATTER (formatter));
+
+ g_object_get (formatter, param_spec->name, &color, NULL);
+
+ color_value = g_strdup_printf ("#%06x", e_rgba_to_value (color));
+
+ add_color_css_rule_for_web_view (
+ E_WEB_VIEW (display),
+ param_spec->name,
+ color_value);
+
+ gdk_rgba_free (color);
+ g_free (color_value);
+}
+
GtkWidget *
e_mail_display_new (void)
{
@@ -1592,18 +1671,14 @@ e_mail_display_set_mode (EMailDisplay *display,
G_CALLBACK (e_mail_display_reload), display,
"swapped-object-signal::notify::animate-images",
G_CALLBACK (e_mail_display_reload), display,
- "swapped-object-signal::notify::text-color",
- G_CALLBACK (e_mail_display_reload), display,
"swapped-object-signal::notify::body-color",
- G_CALLBACK (e_mail_display_reload), display,
+ G_CALLBACK (e_mail_display_update_colors), display,
"swapped-object-signal::notify::citation-color",
- G_CALLBACK (e_mail_display_reload), display,
- "swapped-object-signal::notify::content-color",
- G_CALLBACK (e_mail_display_reload), display,
+ G_CALLBACK (e_mail_display_update_colors), display,
"swapped-object-signal::notify::frame-color",
- G_CALLBACK (e_mail_display_reload), display,
+ G_CALLBACK (e_mail_display_update_colors), display,
"swapped-object-signal::notify::header-color",
- G_CALLBACK (e_mail_display_reload), display,
+ G_CALLBACK (e_mail_display_update_colors), display,
"swapped-object-signal::need-redraw",
G_CALLBACK (e_mail_display_reload), display,
NULL);
@@ -1854,7 +1929,7 @@ e_mail_display_set_status (EMailDisplay *display,
"<meta name=\"generator\" content=\"Evolution Mail\"/>\n"
"<title>Evolution Mail Display</title>\n"
"</head>\n"
- "<body bgcolor=\"#%06x\" text=\"#%06x\">"
+ "<body class=\"-e-web-view-background-color e-web-view-text-color\">"
" <style>html, body { height: 100%%; }</style>\n"
" <table border=\"0\" width=\"100%%\" height=\"100%%\">\n"
" <tr height=\"100%%\" valign=\"middle\">\n"
@@ -1865,14 +1940,6 @@ e_mail_display_set_status (EMailDisplay *display,
" </table>\n"
"</body>\n"
"</html>\n",
- e_rgba_to_value (
- e_mail_formatter_get_color (
- display->priv->formatter,
- E_MAIL_FORMATTER_COLOR_CONTENT)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- display->priv->formatter,
- E_MAIL_FORMATTER_COLOR_TEXT)),
status);
e_web_view_load_string (E_WEB_VIEW (display), str);
diff --git a/modules/text-highlight/e-mail-formatter-text-highlight.c
b/modules/text-highlight/e-mail-formatter-text-highlight.c
index de1d89b..b387408 100644
--- a/modules/text-highlight/e-mail-formatter-text-highlight.c
+++ b/modules/text-highlight/e-mail-formatter-text-highlight.c
@@ -333,19 +333,14 @@ emfe_text_highlight_format (EMailFormatterExtension *extension,
"<div class=\"part-container-nostyle\" >"
"<iframe width=\"100%%\" height=\"10\""
" id=\"%s\" name=\"%s\" "
+ " class=\"-e-mail-formatter-frame-color -e-web-view-background-color\" "
" frameborder=\"0\" src=\"%s\" "
- " style=\"border: 1px solid #%06x; background-color: #%06x;\">"
+ " style=\"border: 1px solid;\">"
"</iframe>"
"</div>",
e_mail_part_get_id (part),
e_mail_part_get_id (part),
- uri,
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_FRAME)),
- e_rgba_to_value (
- e_mail_formatter_get_color (
- formatter, E_MAIL_FORMATTER_COLOR_CONTENT)));
+ uri);
camel_stream_write_string (stream, str, cancellable, NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]