From 6c05b09be16ac8eceb17653c3c26c0c6f963ef10 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 18 Jun 2012 15:34:33 +0200 Subject: Do not call g_object_notify() when property didn't change --- shell/e-shell-searchbar.c | 27 +++++++++++++++++++ shell/e-shell-settings.c | 60 ++++++++++++++++++++++++++++++++++++++++++ shell/e-shell-sidebar.c | 9 +++++++ shell/e-shell-switcher.c | 3 +++ shell/e-shell-view.c | 6 +++++ shell/e-shell-window-private.c | 3 +++ shell/e-shell-window.c | 15 +++++++++++ shell/e-shell.c | 2 +- 8 files changed, 124 insertions(+), 1 deletion(-) (limited to 'shell') diff --git a/shell/e-shell-searchbar.c b/shell/e-shell-searchbar.c index 644293b2a2..9d9ad5a0cb 100644 --- a/shell/e-shell-searchbar.c +++ b/shell/e-shell-searchbar.c @@ -1102,6 +1102,9 @@ e_shell_searchbar_set_express_mode (EShellSearchbar *searchbar, { g_return_if_fail (E_IS_SHELL_SEARCHBAR (searchbar)); + if ((searchbar->priv->express_mode ? 1 : 0) == (express_mode ? 1 : 0)) + return; + searchbar->priv->express_mode = express_mode; /* Emit "notify" on all the properties we override. */ @@ -1139,6 +1142,9 @@ e_shell_searchbar_set_labels_visible (EShellSearchbar *searchbar, { g_return_if_fail (E_IS_SHELL_SEARCHBAR (searchbar)); + if ((searchbar->priv->labels_visible ? 1 : 0) == (labels_visible ? 1 : 0)) + return; + searchbar->priv->labels_visible = labels_visible; g_object_notify (G_OBJECT (searchbar), "labels-visible"); @@ -1162,6 +1168,9 @@ e_shell_searchbar_set_filter_visible (EShellSearchbar *searchbar, { g_return_if_fail (E_IS_SHELL_SEARCHBAR (searchbar)); + if ((searchbar->priv->filter_visible ? 1 : 0) == (filter_visible ? 1 : 0)) + return; + searchbar->priv->filter_visible = filter_visible; g_object_notify (G_OBJECT (searchbar), "filter-visible"); @@ -1189,6 +1198,9 @@ e_shell_searchbar_set_search_hint (EShellSearchbar *searchbar, entry = GTK_ENTRY (searchbar->priv->search_entry); + if (g_strcmp0 (gtk_entry_get_placeholder_text (entry), search_hint) == 0) + return; + gtk_entry_set_placeholder_text (entry, search_hint); g_object_notify (G_OBJECT (searchbar), "search-hint"); @@ -1208,6 +1220,9 @@ e_shell_searchbar_set_search_option (EShellSearchbar *searchbar, { g_return_if_fail (E_IS_SHELL_SEARCHBAR (searchbar)); + if (searchbar->priv->search_option == search_option) + return; + if (search_option != NULL) { g_return_if_fail (GTK_IS_RADIO_ACTION (search_option)); g_object_ref (search_option); @@ -1259,6 +1274,9 @@ e_shell_searchbar_set_search_text (EShellSearchbar *searchbar, if (search_text == NULL) search_text = ""; + if (g_strcmp0 (gtk_entry_get_text (entry), search_text) == 0) + return; + gtk_entry_set_text (entry, search_text); shell_searchbar_update_search_widgets (searchbar); @@ -1280,6 +1298,9 @@ e_shell_searchbar_set_search_visible (EShellSearchbar *searchbar, { g_return_if_fail (E_IS_SHELL_SEARCHBAR (searchbar)); + if ((searchbar->priv->search_visible ? 1 : 0) == (search_visible ? 1 : 0)) + return; + searchbar->priv->search_visible = search_visible; g_object_notify (G_OBJECT (searchbar), "search-visible"); @@ -1321,6 +1342,9 @@ e_shell_searchbar_set_scope_visible (EShellSearchbar *searchbar, { g_return_if_fail (E_IS_SHELL_SEARCHBAR (searchbar)); + if ((searchbar->priv->scope_visible ? 1 : 0) == (scope_visible ? 1 : 0)) + return; + searchbar->priv->scope_visible = scope_visible; g_object_notify (G_OBJECT (searchbar), "scope-visible"); @@ -1351,6 +1375,9 @@ e_shell_searchbar_set_state_group (EShellSearchbar *searchbar, if (state_group == NULL) state_group = STATE_GROUP_DEFAULT; + if (g_strcmp0 (searchbar->priv->state_group, state_group) == 0) + return; + g_free (searchbar->priv->state_group); searchbar->priv->state_group = g_strdup (state_group); diff --git a/shell/e-shell-settings.c b/shell/e-shell-settings.c index bae19f1309..6338e9886d 100644 --- a/shell/e-shell-settings.c +++ b/shell/e-shell-settings.c @@ -48,6 +48,60 @@ static GList *instances; static guint property_count; static gpointer parent_class; +static gboolean +shell_settings_value_equal (const GValue *v1, + const GValue *v2, + gboolean is_debug) +{ + if (!v1 || !v2) + return v1 == v2; + + if (G_VALUE_HOLDS_STRING (v1) && + G_VALUE_HOLDS_STRING (v2)) { + return g_strcmp0 (g_value_get_string (v1), + g_value_get_string (v2)) == 0; + } else if (G_VALUE_HOLDS_UCHAR (v1) && + G_VALUE_HOLDS_UCHAR (v2)) { + return g_value_get_uchar (v1) == g_value_get_uchar (v2); + } else if (G_VALUE_HOLDS_CHAR (v1) && + G_VALUE_HOLDS_CHAR (v2)) { + return g_value_get_schar (v1) == g_value_get_schar (v2); + } else if (G_VALUE_HOLDS_INT (v1) && + G_VALUE_HOLDS_INT (v2)) { + return g_value_get_int (v1) == g_value_get_int (v2); + } else if (G_VALUE_HOLDS_UINT (v1) && + G_VALUE_HOLDS_UINT (v2)) { + return g_value_get_uint (v1) == g_value_get_uint (v2); + } else if (G_VALUE_HOLDS_LONG (v1) && + G_VALUE_HOLDS_LONG (v2)) { + return g_value_get_long (v1) == g_value_get_long (v2); + } else if (G_VALUE_HOLDS_ULONG (v1) && + G_VALUE_HOLDS_ULONG (v2)) { + return g_value_get_ulong (v1) == g_value_get_ulong (v2); + } else if (G_VALUE_HOLDS_INT64 (v1) && + G_VALUE_HOLDS_INT64 (v2)) { + return g_value_get_int64 (v1) == g_value_get_int64 (v2); + } else if (G_VALUE_HOLDS_UINT64 (v1) && + G_VALUE_HOLDS_UINT64 (v2)) { + return g_value_get_uint64 (v1) == g_value_get_uint64 (v2); + } else if (G_VALUE_HOLDS_DOUBLE (v1) && + G_VALUE_HOLDS_DOUBLE (v2)) { + return g_value_get_double (v1) == g_value_get_double (v2); + } else if (G_VALUE_HOLDS_BOOLEAN (v1) && + G_VALUE_HOLDS_BOOLEAN (v2)) { + return (g_value_get_boolean (v1) ? 1 : 0) == (g_value_get_boolean (v2) ? 1 : 0); + } else if (G_VALUE_HOLDS_POINTER (v1) && + G_VALUE_HOLDS_POINTER (v2)) { + return g_value_get_pointer (v1) == g_value_get_pointer (v2); + } + + if (is_debug) + g_debug ("%s: Cannot compare '%s' with '%s'", + G_STRFUNC, G_VALUE_TYPE_NAME (v1), G_VALUE_TYPE_NAME (v2)); + + return FALSE; +} + static GParamSpec * shell_settings_pspec_for_key (const gchar *property_name, const gchar *schema, @@ -151,6 +205,12 @@ shell_settings_set_property (GObject *object, dest_value = &g_array_index ( priv->value_array, GValue, property_id - 1); + if (shell_settings_value_equal (value, dest_value, priv->debug)) { + if (priv->debug) + g_debug ("Setting '%s' set, but it didn't change", pspec->name); + return; + } + g_value_copy (value, dest_value); g_object_notify (object, pspec->name); diff --git a/shell/e-shell-sidebar.c b/shell/e-shell-sidebar.c index d869a2a63a..362321069a 100644 --- a/shell/e-shell-sidebar.c +++ b/shell/e-shell-sidebar.c @@ -594,6 +594,9 @@ e_shell_sidebar_set_icon_name (EShellSidebar *shell_sidebar, { g_return_if_fail (E_IS_SHELL_SIDEBAR (shell_sidebar)); + if (g_strcmp0 (shell_sidebar->priv->icon_name, icon_name) == 0) + return; + g_free (shell_sidebar->priv->icon_name); shell_sidebar->priv->icon_name = g_strdup (icon_name); @@ -637,6 +640,9 @@ e_shell_sidebar_set_primary_text (EShellSidebar *shell_sidebar, { g_return_if_fail (E_IS_SHELL_SIDEBAR (shell_sidebar)); + if (g_strcmp0 (shell_sidebar->priv->primary_text, primary_text) == 0) + return; + g_free (shell_sidebar->priv->primary_text); shell_sidebar->priv->primary_text = e_utf8_ensure_valid (primary_text); @@ -683,6 +689,9 @@ e_shell_sidebar_set_secondary_text (EShellSidebar *shell_sidebar, { g_return_if_fail (E_IS_SHELL_SIDEBAR (shell_sidebar)); + if (g_strcmp0 (shell_sidebar->priv->secondary_text, secondary_text) == 0) + return; + g_free (shell_sidebar->priv->secondary_text); shell_sidebar->priv->secondary_text = e_utf8_ensure_valid (secondary_text); diff --git a/shell/e-shell-switcher.c b/shell/e-shell-switcher.c index efbc311945..b2830cac02 100644 --- a/shell/e-shell-switcher.c +++ b/shell/e-shell-switcher.c @@ -773,6 +773,9 @@ e_shell_switcher_set_visible (EShellSwitcher *switcher, g_return_if_fail (E_IS_SHELL_SWITCHER (switcher)); + if ((switcher->priv->toolbar_visible ? 1 : 0) == (visible ? 1 : 0)) + return; + switcher->priv->toolbar_visible = visible; for (iter = switcher->priv->proxies; iter != NULL; iter = iter->next) diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c index fdad1cbd19..06e99a8270 100644 --- a/shell/e-shell-view.c +++ b/shell/e-shell-view.c @@ -1367,6 +1367,9 @@ e_shell_view_set_page_num (EShellView *shell_view, { g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); + if (shell_view->priv->page_num == page_num) + return; + shell_view->priv->page_num = page_num; g_object_notify (G_OBJECT (shell_view), "page-num"); @@ -1440,6 +1443,9 @@ e_shell_view_set_search_rule (EShellView *shell_view, { g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); + if (shell_view->priv->search_rule == search_rule) + return; + if (search_rule != NULL) { g_return_if_fail (E_IS_FILTER_RULE (search_rule)); g_object_ref (search_rule); diff --git a/shell/e-shell-window-private.c b/shell/e-shell-window-private.c index 572fbaf4f3..a0404f9915 100644 --- a/shell/e-shell-window-private.c +++ b/shell/e-shell-window-private.c @@ -537,6 +537,9 @@ e_shell_window_switch_to_view (EShellWindow *shell_window, g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); g_return_if_fail (view_name != NULL); + if (shell_window->priv->active_view == view_name) + return; + shell_view = e_shell_window_get_shell_view (shell_window, view_name); shell_window->priv->active_view = view_name; diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c index abc3d085fd..ede1400fcb 100644 --- a/shell/e-shell-window.c +++ b/shell/e-shell-window.c @@ -1386,6 +1386,9 @@ e_shell_window_set_safe_mode (EShellWindow *shell_window, { g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); + if ((shell_window->priv->safe_mode ? 1 : 0) == (safe_mode ? 1 : 0)) + return; + shell_window->priv->safe_mode = safe_mode; g_object_notify (G_OBJECT (shell_window), "safe-mode"); @@ -1449,6 +1452,9 @@ e_shell_window_set_sidebar_visible (EShellWindow *shell_window, { g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); + if ((shell_window->priv->sidebar_visible ? 1 : 0) == (sidebar_visible ? 1 : 0)) + return; + shell_window->priv->sidebar_visible = sidebar_visible; g_object_notify (G_OBJECT (shell_window), "sidebar-visible"); @@ -1483,6 +1489,9 @@ e_shell_window_set_switcher_visible (EShellWindow *shell_window, { g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); + if ((shell_window->priv->switcher_visible ? 1 : 0) == (switcher_visible ? 1 : 0)) + return; + shell_window->priv->switcher_visible = switcher_visible; g_object_notify (G_OBJECT (shell_window), "switcher-visible"); @@ -1517,6 +1526,9 @@ e_shell_window_set_taskbar_visible (EShellWindow *shell_window, { g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); + if ((shell_window->priv->taskbar_visible ? 1 : 0) == (taskbar_visible ? 1 : 0)) + return; + shell_window->priv->taskbar_visible = taskbar_visible; g_object_notify (G_OBJECT (shell_window), "taskbar-visible"); @@ -1551,6 +1563,9 @@ e_shell_window_set_toolbar_visible (EShellWindow *shell_window, { g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); + if ((shell_window->priv->toolbar_visible ? 1 : 0) == (toolbar_visible ? 1 : 0)) + return; + shell_window->priv->toolbar_visible = toolbar_visible; g_object_notify (G_OBJECT (shell_window), "toolbar-visible"); diff --git a/shell/e-shell.c b/shell/e-shell.c index 7ab685ab27..0f11c16903 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -1744,7 +1744,7 @@ e_shell_set_network_available (EShell *shell, if (shell->priv->network_available_locked) return; - if (network_available == shell->priv->network_available) + if ((network_available ? 1 : 0) == (shell->priv->network_available ? 1 : 0)) return; shell->priv->network_available = network_available; -- cgit v1.2.3