From 68f27ce0c8a3ed44d1f1105970cc68326df6bad3 Mon Sep 17 00:00:00 2001 From: Tomas Popela Date: Thu, 12 Sep 2013 15:29:58 +0200 Subject: 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. --- mail/e-mail-display.c | 101 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 17 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c index 9343ac01ba..919ba681a6 100644 --- a/mail/e-mail-display.c +++ b/mail/e-mail-display.c @@ -831,6 +831,60 @@ toggle_address_visibility (WebKitDOMElement *button, WEBKIT_DOM_HTML_IMAGE_ELEMENT (button), path); } +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, @@ -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, "\n" "Evolution Mail Display\n" "\n" - "" + "" " \n" " \n" " \n" @@ -1865,14 +1940,6 @@ e_mail_display_set_status (EMailDisplay *display, "
\n" "\n" "\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); -- cgit v1.2.3