From 0e9bb570cb209bf7c1dd6df85ae69fbba23963b1 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Wed, 11 Jun 2014 18:47:46 +0200 Subject: Check whether value really changed in callbacks of GSettings::changed signal Just two more places, which are new after a merge of the webkit-composer branch changes. --- e-util/e-html-editor-view.c | 43 +++++++++++++++++++++++++++++----- modules/settings/e-settings-web-view.c | 37 ++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c index 88de44d820..6c68b70a1d 100644 --- a/e-util/e-html-editor-view.c +++ b/e-util/e-html-editor-view.c @@ -84,6 +84,8 @@ struct _EHTMLEditorViewPrivate { gboolean convertor_insert; WebKitWebView *convertor_web_view; + + GHashTable *old_settings; }; enum { @@ -1539,6 +1541,11 @@ html_editor_view_finalize (GObject *object) g_hash_table_destroy (priv->inline_images); + 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_html_editor_view_parent_class)->finalize (object); } @@ -2815,6 +2822,28 @@ html_plain_text_convertor_load_status_changed (WebKitWebView *web_view, view, document_convertor); } +static void +e_html_editor_settings_changed_cb (GSettings *settings, + const gchar *key, + EHTMLEditorView *view) +{ + GVariant *new_value, *old_value; + + new_value = g_settings_get_value (settings, key); + old_value = g_hash_table_lookup (view->priv->old_settings, key); + + if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) { + if (new_value) + g_hash_table_insert (view->priv->old_settings, g_strdup (key), new_value); + else + g_hash_table_remove (view->priv->old_settings, key); + + e_html_editor_view_update_fonts (view); + } else if (new_value) { + g_variant_unref (new_value); + } +} + static void e_html_editor_view_init (EHTMLEditorView *view) { @@ -2844,6 +2873,8 @@ e_html_editor_view_init (EHTMLEditorView *view) webkit_web_view_set_settings (WEBKIT_WEB_VIEW (view), settings); + view->priv->old_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + /* Override the spell-checker, use our own */ checker = e_spell_checker_new (); webkit_set_text_checker (G_OBJECT (checker)); @@ -2876,12 +2907,12 @@ e_html_editor_view_init (EHTMLEditorView *view) NULL); g_settings = g_settings_new ("org.gnome.desktop.interface"); - g_signal_connect_swapped ( + g_signal_connect ( g_settings, "changed::font-name", - G_CALLBACK (e_html_editor_view_update_fonts), view); - g_signal_connect_swapped ( + G_CALLBACK (e_html_editor_settings_changed_cb), view); + g_signal_connect ( g_settings, "changed::monospace-font-name", - G_CALLBACK (e_html_editor_view_update_fonts), view); + G_CALLBACK (e_html_editor_settings_changed_cb), view); view->priv->font_settings = g_settings; /* This schema is optional. Use if available. */ @@ -2890,9 +2921,9 @@ e_html_editor_view_init (EHTMLEditorView *view) "org.gnome.settings-daemon.plugins.xsettings", FALSE); if (settings_schema != NULL) { g_settings = g_settings_new ("org.gnome.settings-daemon.plugins.xsettings"); - g_signal_connect_swapped ( + g_signal_connect ( settings, "changed::antialiasing", - G_CALLBACK (e_html_editor_view_update_fonts), view); + G_CALLBACK (e_html_editor_settings_changed_cb), view); view->priv->aliasing_settings = g_settings; } diff --git a/modules/settings/e-settings-web-view.c b/modules/settings/e-settings-web-view.c index ff804f36b4..aa462f66b4 100644 --- a/modules/settings/e-settings-web-view.c +++ b/modules/settings/e-settings-web-view.c @@ -33,6 +33,8 @@ struct _ESettingsWebViewPrivate { GtkCssProvider *css_provider; GSettings *settings; + + GHashTable *old_settings; }; G_DEFINE_DYNAMIC_TYPE ( @@ -138,7 +140,21 @@ settings_web_view_changed_cb (GSettings *settings, const gchar *key, ESettingsWebView *extension) { - settings_web_view_load_style (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 @@ -214,6 +230,22 @@ settings_web_view_dispose (GObject *object) 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) { @@ -244,6 +276,7 @@ e_settings_web_view_class_init (ESettingsWebViewClass *class) 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); @@ -266,6 +299,8 @@ e_settings_web_view_init (ESettingsWebView *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 -- cgit v1.2.3