From 6e9e7b067618a22795db3d9a97f60705b8046353 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 5 Jun 2014 16:59:29 +0200 Subject: 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. --- e-util/e-web-view.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'e-util/e-web-view.c') 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); -- cgit v1.2.3