diff options
author | Milan Crha <mcrha@redhat.com> | 2014-06-05 22:59:29 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2014-06-05 22:59:29 +0800 |
commit | 6e9e7b067618a22795db3d9a97f60705b8046353 (patch) | |
tree | d5049d2833f0b75de95030452fafed13a06a44e3 /e-util/e-web-view.c | |
parent | 2e71c861438a25ceac5811d9d3aa528691e71410 (diff) | |
download | gsoc2013-evolution-6e9e7b067618a22795db3d9a97f60705b8046353.tar gsoc2013-evolution-6e9e7b067618a22795db3d9a97f60705b8046353.tar.gz gsoc2013-evolution-6e9e7b067618a22795db3d9a97f60705b8046353.tar.bz2 gsoc2013-evolution-6e9e7b067618a22795db3d9a97f60705b8046353.tar.lz gsoc2013-evolution-6e9e7b067618a22795db3d9a97f60705b8046353.tar.xz gsoc2013-evolution-6e9e7b067618a22795db3d9a97f60705b8046353.tar.zst gsoc2013-evolution-6e9e7b067618a22795db3d9a97f60705b8046353.zip |
Ignore false GSettings key change notifications
Similar to GObject::notify, the GSettings::changed can be emitted
even if a key didn't change. It's up to the user (aka evolution)
to test for real changes, thus let's do it. It may have certain
performance positive impact too.
Diffstat (limited to 'e-util/e-web-view.c')
-rw-r--r-- | e-util/e-web-view.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c index 398540128d..afb3cc9fef 100644 --- a/e-util/e-web-view.c +++ b/e-util/e-web-view.c @@ -69,6 +69,8 @@ struct _EWebViewPrivate { GSettings *aliasing_settings; gulong antialiasing_changed_handler_id; + + GHashTable *old_settings; }; struct _AsyncContext { @@ -897,6 +899,11 @@ web_view_finalize (GObject *object) while (!g_queue_is_empty (&priv->highlights)) g_free (g_queue_pop_head (&priv->highlights)); + 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_web_view_parent_class)->finalize (object); } @@ -1407,6 +1414,28 @@ web_view_selectable_select_all (ESelectable *selectable) e_web_view_select_all (E_WEB_VIEW (selectable)); } +static void +e_web_view_test_change_and_update_fonts_cb (EWebView *web_view, + const gchar *key, + GSettings *settings) +{ + GVariant *new_value, *old_value; + + new_value = g_settings_get_value (settings, key); + old_value = g_hash_table_lookup (web_view->priv->old_settings, key); + + if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) { + if (new_value) + g_hash_table_insert (web_view->priv->old_settings, g_strdup (key), new_value); + else + g_hash_table_remove (web_view->priv->old_settings, key); + + e_web_view_update_fonts (web_view); + } else if (new_value) { + g_variant_unref (new_value); + } +} + static gpointer web_view_disable_webkit_3rd_party_plugins (gpointer unused) { @@ -1670,6 +1699,8 @@ e_web_view_init (EWebView *web_view) web_view->priv = E_WEB_VIEW_GET_PRIVATE (web_view); + web_view->priv->old_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + /* XXX No WebKitWebView class method pointers to * override so we have to use signal handlers. */ @@ -1727,11 +1758,11 @@ e_web_view_init (EWebView *web_view) web_view->priv->font_settings = g_object_ref (settings); handler_id = g_signal_connect_swapped ( settings, "changed::font-name", - G_CALLBACK (e_web_view_update_fonts), web_view); + G_CALLBACK (e_web_view_test_change_and_update_fonts_cb), web_view); web_view->priv->font_name_changed_handler_id = handler_id; handler_id = g_signal_connect_swapped ( settings, "changed::monospace-font-name", - G_CALLBACK (e_web_view_update_fonts), web_view); + G_CALLBACK (e_web_view_test_change_and_update_fonts_cb), web_view); web_view->priv->monospace_font_name_changed_handler_id = handler_id; g_object_unref (settings); @@ -1744,7 +1775,7 @@ e_web_view_init (EWebView *web_view) web_view->priv->aliasing_settings = g_object_ref (settings); handler_id = g_signal_connect_swapped ( settings, "changed::antialiasing", - G_CALLBACK (e_web_view_update_fonts), web_view); + G_CALLBACK (e_web_view_test_change_and_update_fonts_cb), web_view); web_view->priv->antialiasing_changed_handler_id = handler_id; g_object_unref (settings); g_settings_schema_unref (settings_schema); |