aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-06-05 22:59:29 +0800
committerMilan Crha <mcrha@redhat.com>2014-06-05 22:59:29 +0800
commit6e9e7b067618a22795db3d9a97f60705b8046353 (patch)
treed5049d2833f0b75de95030452fafed13a06a44e3
parent2e71c861438a25ceac5811d9d3aa528691e71410 (diff)
downloadgsoc2013-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.
-rw-r--r--calendar/gui/e-day-view-time-item.c9
-rw-r--r--e-util/e-web-view.c37
-rw-r--r--libemail-engine/mail-config.c18
-rw-r--r--mail/e-mail-display.c49
-rw-r--r--modules/calendar/e-cal-shell-backend.c12
-rw-r--r--modules/calendar/e-task-shell-view-private.c24
-rw-r--r--modules/calendar/e-task-shell-view-private.h2
7 files changed, 139 insertions, 12 deletions
diff --git a/calendar/gui/e-day-view-time-item.c b/calendar/gui/e-day-view-time-item.c
index f85b09eebd..b30951bb5b 100644
--- a/calendar/gui/e-day-view-time-item.c
+++ b/calendar/gui/e-day-view-time-item.c
@@ -727,16 +727,21 @@ edvti_second_zone_changed_cb (GSettings *settings,
{
EDayViewTimeItem *time_item = user_data;
EDayView *day_view;
+ icaltimezone *second_zone;
gchar *location;
g_return_if_fail (user_data != NULL);
g_return_if_fail (E_IS_DAY_VIEW_TIME_ITEM (time_item));
location = calendar_config_get_day_second_zone ();
- time_item->priv->second_zone =
- location ? icaltimezone_get_builtin_timezone (location) : NULL;
+ second_zone = location ? icaltimezone_get_builtin_timezone (location) : NULL;
g_free (location);
+ if (second_zone == time_item->priv->second_zone)
+ return;
+
+ time_item->priv->second_zone = second_zone;
+
day_view = e_day_view_time_item_get_day_view (time_item);
gtk_widget_set_size_request (
day_view->time_canvas,
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);
diff --git a/libemail-engine/mail-config.c b/libemail-engine/mail-config.c
index 17532f2b3b..e9f3e8e998 100644
--- a/libemail-engine/mail-config.c
+++ b/libemail-engine/mail-config.c
@@ -73,11 +73,24 @@ settings_jh_headers_changed (GSettings *settings,
gchar **strv;
gint i;
+ strv = g_settings_get_strv (settings, "junk-custom-header");
+ if (key) {
+ for (i = 0, node = config->jh_header; strv[i] && node; i++, node = g_slist_next (node)) {
+ if (g_strcmp0 (node->data, strv[i]) != 0)
+ break;
+ }
+
+ /* both lists are read to the end, thus they are the same */
+ if (!node && !strv[i]) {
+ g_strfreev (strv);
+ return;
+ }
+ }
+
g_slist_foreach (config->jh_header, (GFunc) g_free, NULL);
g_slist_free (config->jh_header);
config->jh_header = NULL;
- strv = g_settings_get_strv (settings, "junk-custom-header");
for (i = 0; strv[i] != NULL; i++)
config->jh_header = g_slist_append (config->jh_header, g_strdup (strv[i]));
g_strfreev (strv);
@@ -108,6 +121,9 @@ settings_jh_check_changed (GSettings *settings,
const gchar *key,
EMailSession *session)
{
+ if (key && config->jh_check == g_settings_get_boolean (settings, "junk-check-custom-header"))
+ return;
+
config->jh_check = g_settings_get_boolean (settings, "junk-check-custom-header");
if (!config->jh_check) {
camel_session_set_junk_headers (
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index 5dc02860c7..61751dfbee 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -59,6 +59,8 @@ struct _EMailDisplayPrivate {
GHashTable *widgets;
guint scheduled_reload;
+
+ GHashTable *old_settings;
};
enum {
@@ -1135,6 +1137,22 @@ mail_display_dispose (GObject *object)
}
static void
+mail_display_finalize (GObject *object)
+{
+ EMailDisplayPrivate *priv;
+
+ priv = E_MAIL_DISPLAY_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_mail_display_parent_class)->finalize (object);
+}
+
+static void
mail_display_constructed (GObject *object)
{
e_extensible_load_extensions (E_EXTENSIBLE (object));
@@ -1406,6 +1424,28 @@ mail_display_set_fonts (EWebView *web_view,
}
static void
+e_mail_display_test_change_and_update_fonts_cb (EMailDisplay *mail_display,
+ const gchar *key,
+ GSettings *settings)
+{
+ GVariant *new_value, *old_value;
+
+ new_value = g_settings_get_value (settings, key);
+ old_value = g_hash_table_lookup (mail_display->priv->old_settings, key);
+
+ if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) {
+ if (new_value)
+ g_hash_table_insert (mail_display->priv->old_settings, g_strdup (key), new_value);
+ else
+ g_hash_table_remove (mail_display->priv->old_settings, key);
+
+ e_web_view_update_fonts (E_WEB_VIEW (mail_display));
+ } else if (new_value) {
+ g_variant_unref (new_value);
+ }
+}
+
+static void
e_mail_display_class_init (EMailDisplayClass *class)
{
GObjectClass *object_class;
@@ -1419,6 +1459,7 @@ e_mail_display_class_init (EMailDisplayClass *class)
object_class->set_property = mail_display_set_property;
object_class->get_property = mail_display_get_property;
object_class->dispose = mail_display_dispose;
+ object_class->finalize = mail_display_finalize;
widget_class = GTK_WIDGET_CLASS (class);
widget_class->realize = mail_display_realize;
@@ -1496,6 +1537,8 @@ e_mail_display_init (EMailDisplay *display)
display->priv = E_MAIL_DISPLAY_GET_PRIVATE (display);
+ display->priv->old_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
+
/* Set invalid mode so that MODE property initialization is run
* completely (see e_mail_display_set_mode) */
display->priv->mode = E_MAIL_FORMATTER_MODE_INVALID;
@@ -1536,13 +1579,13 @@ e_mail_display_init (EMailDisplay *display)
display->priv->settings = g_settings_new ("org.gnome.evolution.mail");
g_signal_connect_swapped (
display->priv->settings , "changed::monospace-font",
- G_CALLBACK (e_web_view_update_fonts), display);
+ G_CALLBACK (e_mail_display_test_change_and_update_fonts_cb), display);
g_signal_connect_swapped (
display->priv->settings , "changed::variable-width-font",
- G_CALLBACK (e_web_view_update_fonts), display);
+ G_CALLBACK (e_mail_display_test_change_and_update_fonts_cb), display);
g_signal_connect_swapped (
display->priv->settings , "changed::use-custom-font",
- G_CALLBACK (e_web_view_update_fonts), display);
+ G_CALLBACK (e_mail_display_test_change_and_update_fonts_cb), display);
e_web_view_update_fonts (E_WEB_VIEW (display));
diff --git a/modules/calendar/e-cal-shell-backend.c b/modules/calendar/e-cal-shell-backend.c
index 0a9c80fb3d..65f88022d8 100644
--- a/modules/calendar/e-cal-shell-backend.c
+++ b/modules/calendar/e-cal-shell-backend.c
@@ -666,7 +666,17 @@ static void
cal_shell_backend_use_system_timezone_changed_cb (GSettings *settings,
const gchar *key)
{
- g_signal_emit_by_name (settings, "changed::timezone", timezone);
+ /* the '-1' is a trick to emit the change the first time */
+ static gint old_value = -1;
+ gboolean value;
+
+ value = g_settings_get_boolean (settings, key);
+
+ if ((value ? 1 : 0) != old_value) {
+ old_value = value ? 1 : 0;
+
+ g_signal_emit_by_name (settings, "changed::timezone", timezone);
+ }
}
static void
diff --git a/modules/calendar/e-task-shell-view-private.c b/modules/calendar/e-task-shell-view-private.c
index 863fd0136e..5a26284575 100644
--- a/modules/calendar/e-task-shell-view-private.c
+++ b/modules/calendar/e-task-shell-view-private.c
@@ -88,7 +88,21 @@ task_shell_view_hide_completed_tasks_changed_cb (GSettings *settings,
const gchar *key,
ETaskShellView *task_shell_view)
{
- task_shell_view_process_completed_tasks (task_shell_view);
+ GVariant *new_value, *old_value;
+
+ new_value = g_settings_get_value (settings, key);
+ old_value = g_hash_table_lookup (task_shell_view->priv->old_settings, key);
+
+ if (!new_value || !old_value || !g_variant_equal (new_value, old_value)) {
+ if (new_value)
+ g_hash_table_insert (task_shell_view->priv->old_settings, g_strdup (key), new_value);
+ else
+ g_hash_table_remove (task_shell_view->priv->old_settings, key);
+
+ task_shell_view_process_completed_tasks (task_shell_view);
+ } else if (new_value) {
+ g_variant_unref (new_value);
+ }
}
static void
@@ -210,6 +224,8 @@ task_shell_view_notify_view_id_cb (EShellView *shell_view)
void
e_task_shell_view_private_init (ETaskShellView *task_shell_view)
{
+ task_shell_view->priv->old_settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
+
e_signal_connect_notify (
task_shell_view, "notify::view-id",
G_CALLBACK (task_shell_view_notify_view_id_cb), NULL);
@@ -553,7 +569,11 @@ e_task_shell_view_private_dispose (ETaskShellView *task_shell_view)
void
e_task_shell_view_private_finalize (ETaskShellView *task_shell_view)
{
- /* XXX Nothing to do? */
+ if (task_shell_view->priv->old_settings) {
+ g_hash_table_destroy (task_shell_view->priv->old_settings);
+ task_shell_view->priv->old_settings = NULL;
+ }
+
}
void
diff --git a/modules/calendar/e-task-shell-view-private.h b/modules/calendar/e-task-shell-view-private.h
index b2a1511c9a..d29bd2e771 100644
--- a/modules/calendar/e-task-shell-view-private.h
+++ b/modules/calendar/e-task-shell-view-private.h
@@ -120,6 +120,8 @@ struct _ETaskShellViewPrivate {
guint update_completed_timeout;
guint confirm_purge : 1;
+
+ GHashTable *old_settings;
};
void e_task_shell_view_private_init