diff options
-rw-r--r-- | e-util/e-html-editor-view.c | 101 | ||||
-rw-r--r-- | e-util/e-web-view.c | 165 | ||||
-rw-r--r-- | modules/settings/Makefile.am | 4 | ||||
-rw-r--r-- | modules/settings/e-settings-html-editor-view.c | 218 | ||||
-rw-r--r-- | modules/settings/e-settings-html-editor-view.h | 64 | ||||
-rw-r--r-- | modules/settings/e-settings-web-view.c | 313 | ||||
-rw-r--r-- | modules/settings/e-settings-web-view.h | 63 | ||||
-rw-r--r-- | modules/settings/evolution-module-settings.c | 4 |
8 files changed, 358 insertions, 574 deletions
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c index c46560f3b4..940f38eadb 100644 --- a/e-util/e-html-editor-view.c +++ b/e-util/e-html-editor-view.c @@ -80,6 +80,7 @@ struct _EHTMLEditorViewPrivate { GHashTable *inline_images; + GSettings *mail_settings; GSettings *font_settings; GSettings *aliasing_settings; @@ -239,6 +240,9 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie WebKitDOMRange *end_range, *actual; WebKitDOMText *text; + if (!view->priv->inline_spelling) + return; + document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); window = webkit_dom_document_get_default_view (document); dom_selection = webkit_dom_dom_window_get_selection (window); @@ -431,7 +435,8 @@ e_html_editor_view_turn_spell_check_off (EHTMLEditorView *view) void e_html_editor_view_force_spell_check (EHTMLEditorView *view) { - refresh_spell_check (view, TRUE); + if (view->priv->inline_spelling) + refresh_spell_check (view, TRUE); } static gint @@ -1158,6 +1163,9 @@ html_editor_view_load_status_changed (EHTMLEditorView *view) if (view->priv->html_mode) change_cid_images_src_to_base64 (view); + + if (!view->priv->inline_spelling) + e_html_editor_view_turn_spell_check_off (view); } /* Based on original use_pictograms() from GtkHTML */ @@ -2044,21 +2052,23 @@ html_editor_view_dispose (GObject *object) } if (priv->aliasing_settings != NULL) { - g_signal_handlers_disconnect_matched ( - priv->aliasing_settings, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, object); + g_signal_handlers_disconnect_by_data (priv->aliasing_settings, object); g_object_unref (priv->aliasing_settings); priv->aliasing_settings = NULL; } if (priv->font_settings != NULL) { - g_signal_handlers_disconnect_matched ( - priv->font_settings, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, object); + g_signal_handlers_disconnect_by_data (priv->font_settings, object); g_object_unref (priv->font_settings); priv->font_settings = NULL; } + if (priv->mail_settings != NULL) { + g_signal_handlers_disconnect_by_data (priv->mail_settings, object); + g_object_unref (priv->mail_settings); + priv->mail_settings = NULL; + } + g_hash_table_remove_all (priv->inline_images); /* Chain up to parent's dispose() method. */ @@ -4646,6 +4656,9 @@ e_html_editor_view_init (EHTMLEditorView *view) G_CALLBACK (e_html_editor_settings_changed_cb), view); view->priv->font_settings = g_settings; + g_settings = g_settings_new ("org.gnome.evolution.mail"); + view->priv->mail_settings = g_settings; + /* This schema is optional. Use if available. */ settings_schema = g_settings_schema_source_lookup ( g_settings_schema_source_get_default (), @@ -6551,6 +6564,11 @@ e_html_editor_view_set_inline_spelling (EHTMLEditorView *view, view->priv->inline_spelling = inline_spelling; + if (inline_spelling) + e_html_editor_view_force_spell_check (view); + else + e_html_editor_view_turn_spell_check_off (view); + g_object_notify (G_OBJECT (view), "inline-spelling"); } @@ -6905,33 +6923,47 @@ citation_color_level_5 (void) void e_html_editor_view_update_fonts (EHTMLEditorView *view) { - GString *stylesheet; - gchar *base64; - gchar *aa = NULL; - WebKitWebSettings *settings; - PangoFontDescription *ms, *vw; + gboolean mark_citations, use_custom_font; + GdkColor *link = NULL; + GdkColor *visited = NULL; + gchar *base64, *font, *aa = NULL, *citation_color; const gchar *styles[] = { "normal", "oblique", "italic" }; const gchar *smoothing = NULL; + GString *stylesheet; GtkStyleContext *context; - GdkColor *link = NULL; - GdkColor *visited = NULL; - gchar *font; + PangoFontDescription *ms, *vw; + WebKitWebSettings *settings; - font = g_settings_get_string ( - view->priv->font_settings, - "monospace-font-name"); - ms = pango_font_description_from_string ( - font ? font : "monospace 10"); - g_free (font); + g_return_if_fail (E_IS_HTML_EDITOR_VIEW (view)); - if (view->priv->html_mode) { + use_custom_font = g_settings_get_boolean ( + view->priv->mail_settings, "use-custom-font"); + + if (use_custom_font) { font = g_settings_get_string ( - view->priv->font_settings, - "font-name"); - vw = pango_font_description_from_string ( - font ? font : "serif 10"); + view->priv->mail_settings, "monospace-font"); + ms = pango_font_description_from_string (font ? font : "monospace 10"); g_free (font); } else { + font = g_settings_get_string ( + view->priv->font_settings, "monospace-font-name"); + ms = pango_font_description_from_string (font ? font : "monospace 10"); + g_free (font); + } + + if (view->priv->html_mode) { + if (use_custom_font) { + font = g_settings_get_string ( + view->priv->mail_settings, "variable-width-font"); + vw = pango_font_description_from_string (font ? font : "serif 10"); + g_free (font); + } else { + font = g_settings_get_string ( + view->priv->font_settings, "font-name"); + vw = pango_font_description_from_string (font ? font : "serif 10"); + g_free (font); + } + } else { /* When in plain text mode, force monospace font */ vw = pango_font_description_copy (ms); } @@ -7092,6 +7124,11 @@ e_html_editor_view_update_fonts (EHTMLEditorView *view) " -webkit-margin-after: 0em; \n" "}\n"); + citation_color = g_settings_get_string ( + view->priv->mail_settings, "citation-color"); + mark_citations = g_settings_get_boolean ( + view->priv->mail_settings, "mark-citations"); + g_string_append ( stylesheet, "blockquote[type=cite] " @@ -7099,9 +7136,15 @@ e_html_editor_view_update_fonts (EHTMLEditorView *view) " padding: 0.0ex 0ex;\n" " margin: 0ex;\n" " -webkit-margin-start: 0em; \n" - " -webkit-margin-end : 0em; \n" - " color: #737373 !important;\n" - "}\n"); + " -webkit-margin-end : 0em; \n"); + + if (mark_citations && citation_color) + g_string_append_printf ( + stylesheet, + " color: %s !important; \n", + citation_color); + + g_string_append (stylesheet, "}\n"); g_string_append ( stylesheet, diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c index fb644418db..ed8324c1b1 100644 --- a/e-util/e-web-view.c +++ b/e-util/e-web-view.c @@ -86,9 +86,6 @@ enum { PROP_CURSOR_IMAGE_SRC, PROP_DISABLE_PRINTING, PROP_DISABLE_SAVE_TO_DISK, - PROP_INLINE_SPELLING, - PROP_MAGIC_LINKS, - PROP_MAGIC_SMILEYS, PROP_OPEN_PROXY, PROP_PRINT_PROXY, PROP_SAVE_AS_PROXY, @@ -712,24 +709,6 @@ web_view_set_property (GObject *object, g_value_get_boolean (value)); return; - case PROP_INLINE_SPELLING: - e_web_view_set_inline_spelling ( - E_WEB_VIEW (object), - g_value_get_boolean (value)); - return; - - case PROP_MAGIC_LINKS: - e_web_view_set_magic_links ( - E_WEB_VIEW (object), - g_value_get_boolean (value)); - return; - - case PROP_MAGIC_SMILEYS: - e_web_view_set_magic_smileys ( - E_WEB_VIEW (object), - g_value_get_boolean (value)); - return; - case PROP_OPEN_PROXY: e_web_view_set_open_proxy ( E_WEB_VIEW (object), @@ -788,24 +767,6 @@ web_view_get_property (GObject *object, E_WEB_VIEW (object))); return; - case PROP_INLINE_SPELLING: - g_value_set_boolean ( - value, e_web_view_get_inline_spelling ( - E_WEB_VIEW (object))); - return; - - case PROP_MAGIC_LINKS: - g_value_set_boolean ( - value, e_web_view_get_magic_links ( - E_WEB_VIEW (object))); - return; - - case PROP_MAGIC_SMILEYS: - g_value_set_boolean ( - value, e_web_view_get_magic_smileys ( - E_WEB_VIEW (object))); - return; - case PROP_OPEN_PROXY: g_value_set_object ( value, e_web_view_get_open_proxy ( @@ -1522,36 +1483,6 @@ e_web_view_class_init (EWebViewClass *class) g_object_class_install_property ( object_class, - PROP_INLINE_SPELLING, - g_param_spec_boolean ( - "inline-spelling", - "Inline Spelling", - NULL, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_MAGIC_LINKS, - g_param_spec_boolean ( - "magic-links", - "Magic Links", - NULL, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_MAGIC_SMILEYS, - g_param_spec_boolean ( - "magic-smileys", - "Magic Smileys", - NULL, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, PROP_OPEN_PROXY, g_param_spec_object ( "open-proxy", @@ -2116,102 +2047,6 @@ e_web_view_set_editable (EWebView *web_view, webkit_web_view_set_editable (WEBKIT_WEB_VIEW (web_view), editable); } -gboolean -e_web_view_get_inline_spelling (EWebView *web_view) -{ -#if 0 /* WEBKIT - XXX No equivalent property? */ - /* XXX This is just here to maintain symmetry - * with e_web_view_set_inline_spelling(). */ - - g_return_val_if_fail (E_IS_WEB_VIEW (web_view), FALSE); - - return gtk_html_get_inline_spelling (GTK_HTML (web_view)); -#endif - - return FALSE; -} - -void -e_web_view_set_inline_spelling (EWebView *web_view, - gboolean inline_spelling) -{ -#if 0 /* WEBKIT - XXX No equivalent property? */ - /* XXX GtkHTML does not utilize GObject properties as well - * as it could. This just wraps gtk_html_set_inline_spelling() - * so we get a "notify::inline-spelling" signal. */ - - g_return_if_fail (E_IS_WEB_VIEW (web_view)); - - gtk_html_set_inline_spelling (GTK_HTML (web_view), inline_spelling); - - g_object_notify (G_OBJECT (web_view), "inline-spelling"); -#endif -} - -gboolean -e_web_view_get_magic_links (EWebView *web_view) -{ -#if 0 /* WEBKIT - XXX No equivalent property? */ - /* XXX This is just here to maintain symmetry - * with e_web_view_set_magic_links(). */ - - g_return_val_if_fail (E_IS_WEB_VIEW (web_view), FALSE); - - return gtk_html_get_magic_links (GTK_HTML (web_view)); -#endif - - return FALSE; -} - -void -e_web_view_set_magic_links (EWebView *web_view, - gboolean magic_links) -{ -#if 0 /* WEBKIT - XXX No equivalent property? */ - /* XXX GtkHTML does not utilize GObject properties as well - * as it could. This just wraps gtk_html_set_magic_links() - * so we can get a "notify::magic-links" signal. */ - - g_return_if_fail (E_IS_WEB_VIEW (web_view)); - - gtk_html_set_magic_links (GTK_HTML (web_view), magic_links); - - g_object_notify (G_OBJECT (web_view), "magic-links"); -#endif -} - -gboolean -e_web_view_get_magic_smileys (EWebView *web_view) -{ -#if 0 /* WEBKIT - No equivalent property? */ - /* XXX This is just here to maintain symmetry - * with e_web_view_set_magic_smileys(). */ - - g_return_val_if_fail (E_IS_WEB_VIEW (web_view), FALSE); - - return gtk_html_get_magic_smileys (GTK_HTML (web_view)); -#endif - - return FALSE; -} - -void -e_web_view_set_magic_smileys (EWebView *web_view, - gboolean magic_smileys) -{ -#if 0 /* WEBKIT - No equivalent property? */ - /* XXX GtkHTML does not utilize GObject properties as well - * as it could. This just wraps gtk_html_set_magic_smileys() - * so we can get a "notify::magic-smileys" signal. */ - - g_return_if_fail (E_IS_WEB_VIEW (web_view)); - - gtk_html_set_magic_smileys (GTK_HTML (web_view), magic_smileys); - - g_object_notify (G_OBJECT (web_view), "magic-smileys"); -#endif -} - const gchar * e_web_view_get_selected_uri (EWebView *web_view) { diff --git a/modules/settings/Makefile.am b/modules/settings/Makefile.am index c03253db9e..507ddc9daa 100644 --- a/modules/settings/Makefile.am +++ b/modules/settings/Makefile.am @@ -27,6 +27,8 @@ module_settings_la_SOURCES = \ e-settings-date-edit.h \ e-settings-deprecated.c \ e-settings-deprecated.h \ + e-settings-html-editor-view.c \ + e-settings-html-editor-view.h \ e-settings-mail-browser.c \ e-settings-mail-browser.h \ e-settings-mail-formatter.c \ @@ -49,8 +51,6 @@ module_settings_la_SOURCES = \ e-settings-spell-checker.h \ e-settings-spell-entry.c \ e-settings-spell-entry.h \ - e-settings-web-view.c \ - e-settings-web-view.h \ e-settings-weekday-chooser.c \ e-settings-weekday-chooser.h \ $(NULL) diff --git a/modules/settings/e-settings-html-editor-view.c b/modules/settings/e-settings-html-editor-view.c new file mode 100644 index 0000000000..97a8c081be --- /dev/null +++ b/modules/settings/e-settings-html-editor-view.c @@ -0,0 +1,218 @@ +/* + * e-settings-html-editor-web-view.c + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <string.h> + +#include "e-settings-html-editor-view.h" + +#include <e-util/e-util.h> + +#define E_SETTINGS_HTML_EDITOR_VIEW_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_SETTINGS_HTML_EDITOR_VIEW, ESettingsHTMLEditorViewPrivate)) + +struct _ESettingsHTMLEditorViewPrivate { + GSettings *settings; + + GHashTable *old_settings; +}; + +G_DEFINE_DYNAMIC_TYPE ( + ESettingsHTMLEditorView, + e_settings_html_editor_view, + E_TYPE_EXTENSION) + +static void +settings_html_editor_view_load_style (ESettingsHTMLEditorView *extension) +{ + EExtensible *extensible; + + extensible = e_extension_get_extensible (E_EXTENSION (extension)); + + e_html_editor_view_update_fonts (E_HTML_EDITOR_VIEW (extensible)); +} + +static void +settings_html_editor_view_changed_cb (GSettings *settings, + const gchar *key, + ESettingsHTMLEditorView *extension) +{ + GVariant *new_value, *old_value; + + new_value = g_settings_get_value (settings, key); + old_value = g_hash_table_lookup (extension->priv->old_settings, key); + + if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) { + if (new_value) + g_hash_table_insert (extension->priv->old_settings, g_strdup (key), new_value); + else + g_hash_table_remove (extension->priv->old_settings, key); + + settings_html_editor_view_load_style (extension); + } else if (new_value) { + g_variant_unref (new_value); + } +} + +static void +settings_html_editor_view_realize (GtkWidget *widget, + ESettingsHTMLEditorView *extension) +{ + GSettings *settings; + + settings = extension->priv->settings; + + g_settings_bind ( + settings, "composer-inline-spelling", + widget, "inline-spelling", + G_SETTINGS_BIND_GET); + + g_settings_bind ( + settings, "composer-magic-links", + widget, "magic-links", + G_SETTINGS_BIND_GET); + + g_settings_bind ( + settings, "composer-magic-smileys", + widget, "magic-smileys", + G_SETTINGS_BIND_GET); + + settings_html_editor_view_load_style (extension); + + /* Reload the web view when certain settings change. */ + + g_signal_connect ( + settings, "changed::use-custom-font", + G_CALLBACK (settings_html_editor_view_changed_cb), extension); + + g_signal_connect ( + settings, "changed::monospace-font", + G_CALLBACK (settings_html_editor_view_changed_cb), extension); + + g_signal_connect ( + settings, "changed::variable-width-font", + G_CALLBACK (settings_html_editor_view_changed_cb), extension); + + g_signal_connect ( + settings, "changed::mark-citations", + G_CALLBACK (settings_html_editor_view_changed_cb), extension); + + g_signal_connect ( + settings, "changed::citation-color", + G_CALLBACK (settings_html_editor_view_changed_cb), extension); +} + +static void +settings_html_editor_view_dispose (GObject *object) +{ + ESettingsHTMLEditorViewPrivate *priv; + + priv = E_SETTINGS_HTML_EDITOR_VIEW_GET_PRIVATE (object); + + if (priv->settings != NULL) { + g_signal_handlers_disconnect_by_func ( + priv->settings, + settings_html_editor_view_changed_cb, object); + } + + g_clear_object (&priv->settings); + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_settings_html_editor_view_parent_class)->dispose (object); +} + +static void +settings_html_editor_view_finalize (GObject *object) +{ + ESettingsHTMLEditorViewPrivate *priv; + + priv = E_SETTINGS_HTML_EDITOR_VIEW_GET_PRIVATE (object); + + if (priv->old_settings) { + g_hash_table_destroy (priv->old_settings); + priv->old_settings = NULL; + } + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (e_settings_html_editor_view_parent_class)->finalize (object); +} + +static void +settings_html_editor_view_constructed (GObject *object) +{ + EExtensible *extensible; + + extensible = e_extension_get_extensible (E_EXTENSION (object)); + + g_signal_connect ( + extensible, "realize", + G_CALLBACK (settings_html_editor_view_realize), object); + + /* Chain up to parent's constructed() method. */ + G_OBJECT_CLASS (e_settings_html_editor_view_parent_class)->constructed (object); +} + +static void +e_settings_html_editor_view_class_init (ESettingsHTMLEditorViewClass *class) +{ + GObjectClass *object_class; + EExtensionClass *extension_class; + + g_type_class_add_private (class, sizeof (ESettingsHTMLEditorViewPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->dispose = settings_html_editor_view_dispose; + object_class->finalize = settings_html_editor_view_finalize; + object_class->constructed = settings_html_editor_view_constructed; + + extension_class = E_EXTENSION_CLASS (class); + extension_class->extensible_type = E_TYPE_HTML_EDITOR_VIEW; +} + +static void +e_settings_html_editor_view_class_finalize (ESettingsHTMLEditorViewClass *class) +{ +} + +static void +e_settings_html_editor_view_init (ESettingsHTMLEditorView *extension) +{ + GSettings *settings; + + extension->priv = E_SETTINGS_HTML_EDITOR_VIEW_GET_PRIVATE (extension); + + settings = g_settings_new ("org.gnome.evolution.mail"); + extension->priv->settings = settings; + + extension->priv->old_settings = g_hash_table_new_full ( + g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); +} + +void +e_settings_html_editor_view_type_register (GTypeModule *type_module) +{ + /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration + * function, so we have to wrap it with a public function in + * order to register types from a separate compilation unit. */ + e_settings_html_editor_view_register_type (type_module); +} + diff --git a/modules/settings/e-settings-html-editor-view.h b/modules/settings/e-settings-html-editor-view.h new file mode 100644 index 0000000000..1848794fcc --- /dev/null +++ b/modules/settings/e-settings-html-editor-view.h @@ -0,0 +1,64 @@ +/* + * e-settings-html-editor-view.h + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * + */ + +#ifndef E_SETTINGS_HTML_EDITOR_VIEW_H +#define E_SETTINGS_HTML_EDITOR_VIEW_H + +#include <libebackend/libebackend.h> + +/* Standard GObject macros */ +#define E_TYPE_SETTINGS_HTML_EDITOR_VIEW \ + (e_settings_html_editor_view_get_type ()) +#define E_SETTINGS_HTML_EDITOR_VIEW(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_SETTINGS_HTML_EDITOR_VIEW, ESettingsHTMLEditorView)) +#define E_SETTINGS_HTML_EDITOR_VIEW_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_SETTINGS_HTML_EDITOR_VIEW, ESettingsHTMLEditorViewClass)) +#define E_IS_SETTINGS_HTML_EDITOR_VIEW(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_SETTINGS_HTML_EDITOR_VIEW)) +#define E_IS_SETTINGS_HTML_EDITOR_VIEW_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_SETTINGS_HTML_EDITOR_VIEW)) +#define E_SETTINGS_HTML_EDITOR_VIEW_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_SETTINGS_HTML_EDITOR_VIEW, ESettingsHTMLEditorViewClass)) + +G_BEGIN_DECLS + +typedef struct _ESettingsHTMLEditorView ESettingsHTMLEditorView; +typedef struct _ESettingsHTMLEditorViewClass ESettingsHTMLEditorViewClass; +typedef struct _ESettingsHTMLEditorViewPrivate ESettingsHTMLEditorViewPrivate; + +struct _ESettingsHTMLEditorView { + EExtension parent; + ESettingsHTMLEditorViewPrivate *priv; +}; + +struct _ESettingsHTMLEditorViewClass { + EExtensionClass parent_class; +}; + +GType e_settings_html_editor_view_get_type + (void) G_GNUC_CONST; +void e_settings_html_editor_view_type_register + (GTypeModule *type_module); + +G_END_DECLS + +#endif /* E_SETTINGS_HTML_EDITOR_VIEW_H */ diff --git a/modules/settings/e-settings-web-view.c b/modules/settings/e-settings-web-view.c deleted file mode 100644 index 06cabb63fe..0000000000 --- a/modules/settings/e-settings-web-view.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - * e-settings-web-view.c - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <string.h> - -#include "e-settings-web-view.h" - -#include <e-util/e-util.h> - -#define E_SETTINGS_WEB_VIEW_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), E_TYPE_SETTINGS_WEB_VIEW, ESettingsWebViewPrivate)) - -struct _ESettingsWebViewPrivate { - GtkCssProvider *css_provider; - GSettings *settings; - - GHashTable *old_settings; -}; - -G_DEFINE_DYNAMIC_TYPE ( - ESettingsWebView, - e_settings_web_view, - E_TYPE_EXTENSION) - -/* replaces content of color string */ -static void -settings_web_view_fix_color_string (gchar *color_string) -{ - GdkColor color; - - if (color_string == NULL) - return; - - if (strlen (color_string) < 13) - return; - - if (!gdk_color_parse (color_string, &color)) - return; - - sprintf ( - color_string, "#%02x%02x%02x", - (gint) color.red * 256 / 65536, - (gint) color.green * 256 / 65536, - (gint) color.blue * 256 / 65536); -} - -static void -settings_web_view_load_style (ESettingsWebView *extension) -{ - GString *buffer; - gchar *citation_color; - gchar *monospace_font; - gchar *variable_font; - gboolean custom_fonts; - gboolean mark_citations; - EExtensible *extensible; - GtkStyleContext *style_context; - GSettings *settings; - GError *error = NULL; - - /* Some of our mail and composer preferences are passed down to - * GtkHtml through style properties, unfortunately. This builds - * a style sheet for the EWebView using values from GSettings. */ - - settings = extension->priv->settings; - - custom_fonts = - g_settings_get_boolean (settings, "use-custom-font"); - monospace_font = - g_settings_get_string (settings, "monospace-font"); - variable_font = - g_settings_get_string (settings, "variable-width-font"); - mark_citations = - g_settings_get_boolean (settings, "mark-citations"); - citation_color = - g_settings_get_string (settings, "citation-color"); - - buffer = g_string_new ("EWebViewGtkHTML {\n"); - - settings_web_view_fix_color_string (citation_color); - - if (custom_fonts && variable_font != NULL) - g_string_append_printf ( - buffer, " font: %s;\n", variable_font); - - if (custom_fonts && monospace_font != NULL) - g_string_append_printf ( - buffer, " -GtkHTML-fixed-font-name: '%s';\n", - monospace_font); - - if (mark_citations && citation_color != NULL) - g_string_append_printf ( - buffer, " -GtkHTML-cite-color: %s;\n", - citation_color); - - g_string_append (buffer, "}\n"); - - gtk_css_provider_load_from_data ( - extension->priv->css_provider, - buffer->str, buffer->len, &error); - - if (error != NULL) { - g_warning ("%s", error->message); - g_error_free (error); - } - - g_string_free (buffer, TRUE); - - g_free (monospace_font); - g_free (variable_font); - g_free (citation_color); - - extensible = e_extension_get_extensible (E_EXTENSION (extension)); - style_context = gtk_widget_get_style_context (GTK_WIDGET (extensible)); - gtk_style_context_invalidate (style_context); -} - -static void -settings_web_view_changed_cb (GSettings *settings, - const gchar *key, - ESettingsWebView *extension) -{ - GVariant *new_value, *old_value; - - new_value = g_settings_get_value (settings, key); - old_value = g_hash_table_lookup (extension->priv->old_settings, key); - - if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) { - if (new_value) - g_hash_table_insert (extension->priv->old_settings, g_strdup (key), new_value); - else - g_hash_table_remove (extension->priv->old_settings, key); - - settings_web_view_load_style (extension); - } else if (new_value) { - g_variant_unref (new_value); - } -} - -static void -settings_web_view_realize (GtkWidget *widget, - ESettingsWebView *extension) -{ - GSettings *settings; - - settings = extension->priv->settings; - - g_settings_bind ( - settings, "composer-inline-spelling", - widget, "inline-spelling", - G_SETTINGS_BIND_GET); - - g_settings_bind ( - settings, "composer-magic-links", - widget, "magic-links", - G_SETTINGS_BIND_GET); - - g_settings_bind ( - settings, "composer-magic-smileys", - widget, "magic-smileys", - G_SETTINGS_BIND_GET); - - gtk_style_context_add_provider ( - gtk_widget_get_style_context (widget), - GTK_STYLE_PROVIDER (extension->priv->css_provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - - settings_web_view_load_style (extension); - - /* Reload the style sheet when certain settings change. */ - - g_signal_connect ( - settings, "changed::use-custom-font", - G_CALLBACK (settings_web_view_changed_cb), extension); - - g_signal_connect ( - settings, "changed::monospace-font", - G_CALLBACK (settings_web_view_changed_cb), extension); - - g_signal_connect ( - settings, "changed::variable-width-font", - G_CALLBACK (settings_web_view_changed_cb), extension); - - g_signal_connect ( - settings, "changed::mark-citations", - G_CALLBACK (settings_web_view_changed_cb), extension); - - g_signal_connect ( - settings, "changed::citation-color", - G_CALLBACK (settings_web_view_changed_cb), extension); -} - -static void -settings_web_view_dispose (GObject *object) -{ - ESettingsWebViewPrivate *priv; - - priv = E_SETTINGS_WEB_VIEW_GET_PRIVATE (object); - - if (priv->settings != NULL) { - g_signal_handlers_disconnect_by_func ( - priv->settings, - settings_web_view_changed_cb, object); - } - - g_clear_object (&priv->css_provider); - g_clear_object (&priv->settings); - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (e_settings_web_view_parent_class)->dispose (object); -} - -static void -settings_web_view_finalize (GObject *object) -{ - ESettingsWebViewPrivate *priv; - - priv = E_SETTINGS_WEB_VIEW_GET_PRIVATE (object); - - if (priv->old_settings) { - g_hash_table_destroy (priv->old_settings); - priv->old_settings = NULL; - } - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (e_settings_web_view_parent_class)->finalize (object); -} - -static void -settings_web_view_constructed (GObject *object) -{ - EExtensible *extensible; - - extensible = e_extension_get_extensible (E_EXTENSION (object)); - - /* Wait to bind settings until the EWebView is realized so - * GtkhtmlEditor has a chance to install a GtkHTMLEditorAPI. - * Otherwise our settings will have no effect. */ - - g_signal_connect ( - extensible, "realize", - G_CALLBACK (settings_web_view_realize), object); - - /* Chain up to parent's constructed() method. */ - G_OBJECT_CLASS (e_settings_web_view_parent_class)->constructed (object); -} - -static void -e_settings_web_view_class_init (ESettingsWebViewClass *class) -{ - GObjectClass *object_class; - EExtensionClass *extension_class; - - g_type_class_add_private (class, sizeof (ESettingsWebViewPrivate)); - - object_class = G_OBJECT_CLASS (class); - object_class->dispose = settings_web_view_dispose; - object_class->finalize = settings_web_view_finalize; - object_class->constructed = settings_web_view_constructed; - - extension_class = E_EXTENSION_CLASS (class); - extension_class->extensible_type = E_TYPE_WEB_VIEW; -} - -static void -e_settings_web_view_class_finalize (ESettingsWebViewClass *class) -{ -} - -static void -e_settings_web_view_init (ESettingsWebView *extension) -{ - GSettings *settings; - - extension->priv = E_SETTINGS_WEB_VIEW_GET_PRIVATE (extension); - - extension->priv->css_provider = gtk_css_provider_new (); - - settings = g_settings_new ("org.gnome.evolution.mail"); - extension->priv->settings = settings; - - extension->priv->old_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); -} - -void -e_settings_web_view_type_register (GTypeModule *type_module) -{ - /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration - * function, so we have to wrap it with a public function in - * order to register types from a separate compilation unit. */ - e_settings_web_view_register_type (type_module); -} - diff --git a/modules/settings/e-settings-web-view.h b/modules/settings/e-settings-web-view.h deleted file mode 100644 index 367262ce0e..0000000000 --- a/modules/settings/e-settings-web-view.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * e-settings-web-view.h - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - * - */ - -#ifndef E_SETTINGS_WEB_VIEW_H -#define E_SETTINGS_WEB_VIEW_H - -#include <libebackend/libebackend.h> - -/* Standard GObject macros */ -#define E_TYPE_SETTINGS_WEB_VIEW \ - (e_settings_web_view_get_type ()) -#define E_SETTINGS_WEB_VIEW(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST \ - ((obj), E_TYPE_SETTINGS_WEB_VIEW, ESettingsWebView)) -#define E_SETTINGS_WEB_VIEW_CLASS(cls) \ - (G_TYPE_CHECK_CLASS_CAST \ - ((cls), E_TYPE_SETTINGS_WEB_VIEW, ESettingsWebViewClass)) -#define E_IS_SETTINGS_WEB_VIEW(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE \ - ((obj), E_TYPE_SETTINGS_WEB_VIEW)) -#define E_IS_SETTINGS_WEB_VIEW_CLASS(cls) \ - (G_TYPE_CHECK_CLASS_TYPE \ - ((cls), E_TYPE_SETTINGS_WEB_VIEW)) -#define E_SETTINGS_WEB_VIEW_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS \ - ((obj), E_TYPE_SETTINGS_WEB_VIEW, ESettingsWebViewClass)) - -G_BEGIN_DECLS - -typedef struct _ESettingsWebView ESettingsWebView; -typedef struct _ESettingsWebViewClass ESettingsWebViewClass; -typedef struct _ESettingsWebViewPrivate ESettingsWebViewPrivate; - -struct _ESettingsWebView { - EExtension parent; - ESettingsWebViewPrivate *priv; -}; - -struct _ESettingsWebViewClass { - EExtensionClass parent_class; -}; - -GType e_settings_web_view_get_type (void) G_GNUC_CONST; -void e_settings_web_view_type_register - (GTypeModule *type_module); - -G_END_DECLS - -#endif /* E_SETTINGS_WEB_VIEW_H */ diff --git a/modules/settings/evolution-module-settings.c b/modules/settings/evolution-module-settings.c index 88101b56c1..e6fce74d9b 100644 --- a/modules/settings/evolution-module-settings.c +++ b/modules/settings/evolution-module-settings.c @@ -22,6 +22,7 @@ #include "e-settings-comp-editor.h" #include "e-settings-date-edit.h" #include "e-settings-deprecated.h" +#include "e-settings-html-editor-view.h" #include "e-settings-mail-browser.h" #include "e-settings-mail-formatter.h" #include "e-settings-mail-part-headers.h" @@ -33,7 +34,6 @@ #include "e-settings-name-selector-entry.h" #include "e-settings-spell-checker.h" #include "e-settings-spell-entry.h" -#include "e-settings-web-view.h" #include "e-settings-weekday-chooser.h" /* Module Entry Points */ @@ -50,6 +50,7 @@ e_module_load (GTypeModule *type_module) e_settings_comp_editor_type_register (type_module); e_settings_date_edit_type_register (type_module); e_settings_deprecated_type_register (type_module); + e_settings_html_editor_view_type_register (type_module); e_settings_mail_browser_type_register (type_module); e_settings_mail_formatter_type_register (type_module); e_settings_mail_part_headers_type_register (type_module); @@ -61,7 +62,6 @@ e_module_load (GTypeModule *type_module) e_settings_name_selector_entry_type_register (type_module); e_settings_spell_checker_type_register (type_module); e_settings_spell_entry_type_register (type_module); - e_settings_web_view_type_register (type_module); e_settings_weekday_chooser_type_register (type_module); } |