aboutsummaryrefslogtreecommitdiffstats
path: root/modules/settings/e-settings-web-view-gtkhtml.c
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-06-05 17:47:13 +0800
committerMilan Crha <mcrha@redhat.com>2014-06-05 17:47:13 +0800
commit2e71c861438a25ceac5811d9d3aa528691e71410 (patch)
tree88acf6b67904de4caae1034cebb7c040f3fab804 /modules/settings/e-settings-web-view-gtkhtml.c
parent2f3fbdd6c6ff42a6c71ebe1d1d78108affe59d0f (diff)
downloadgsoc2013-evolution-2e71c861438a25ceac5811d9d3aa528691e71410.tar
gsoc2013-evolution-2e71c861438a25ceac5811d9d3aa528691e71410.tar.gz
gsoc2013-evolution-2e71c861438a25ceac5811d9d3aa528691e71410.tar.bz2
gsoc2013-evolution-2e71c861438a25ceac5811d9d3aa528691e71410.tar.lz
gsoc2013-evolution-2e71c861438a25ceac5811d9d3aa528691e71410.tar.xz
gsoc2013-evolution-2e71c861438a25ceac5811d9d3aa528691e71410.tar.zst
gsoc2013-evolution-2e71c861438a25ceac5811d9d3aa528691e71410.zip
Properly disconnect signal handlers added with e_signal_connect_notify*()
This is a follow-up for the previous commit, where e_signal_connect_notify*() functions had been added. Due to a different callback and user data being attached to the 'notify' signal, the g_signal_handlers_*() functions do not work properly, thus these e_signal_connect_notify*() functions need a different way for a signal handler disconnect. A side-change was done in e-settings-web-view-gtkhtml.c, checking for a real key change from GSettings.
Diffstat (limited to 'modules/settings/e-settings-web-view-gtkhtml.c')
-rw-r--r--modules/settings/e-settings-web-view-gtkhtml.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/modules/settings/e-settings-web-view-gtkhtml.c b/modules/settings/e-settings-web-view-gtkhtml.c
index b551b3e881..7815eb6a17 100644
--- a/modules/settings/e-settings-web-view-gtkhtml.c
+++ b/modules/settings/e-settings-web-view-gtkhtml.c
@@ -33,6 +33,7 @@
struct _ESettingsWebViewGtkHTMLPrivate {
GtkCssProvider *css_provider;
GSettings *settings;
+ GHashTable *old_values;
};
G_DEFINE_DYNAMIC_TYPE (
@@ -148,7 +149,21 @@ settings_web_view_gtkhtml_changed_cb (GSettings *settings,
const gchar *key,
ESettingsWebViewGtkHTML *extension)
{
- settings_web_view_gtkhtml_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_values, key);
+
+ if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) {
+ if (new_value)
+ g_hash_table_insert (extension->priv->old_values, g_strdup (key), new_value);
+ else
+ g_hash_table_remove (extension->priv->old_values, key);
+
+ settings_web_view_gtkhtml_load_style (extension);
+ } else if (new_value) {
+ g_variant_unref (new_value);
+ }
}
static void
@@ -227,6 +242,11 @@ settings_web_view_gtkhtml_dispose (GObject *object)
settings_web_view_gtkhtml_changed_cb, object);
}
+ if (priv->old_values) {
+ g_hash_table_destroy (priv->old_values);
+ priv->old_values = NULL;
+ }
+
g_clear_object (&priv->css_provider);
g_clear_object (&priv->settings);
@@ -289,6 +309,8 @@ e_settings_web_view_gtkhtml_init (ESettingsWebViewGtkHTML *extension)
settings = g_settings_new ("org.gnome.evolution.mail");
extension->priv->settings = settings;
+
+ extension->priv->old_values = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
}
void