diff options
author | Daniel Atallah <datallah@pidgin.im> | 2009-01-27 04:22:53 +0000 |
---|---|---|
committer | Daniel Atallah <datallah@pidgin.im> | 2009-01-27 04:22:53 +0000 |
commit | 03902898693d13f96fe4d46f440f9c0cecb57339 (patch) | |
tree | b482adda9af3743c5c9b5f66208e9226b6143ad9 | |
parent | eaa66193989cd40c25e8b15d15feef8216bf81a7 (diff) | |
download | pidgin-03902898693d13f96fe4d46f440f9c0cecb57339.tar.gz |
A slightly "warmenhoved" patch from Jon Turney to prevent some unnecessary
processing of status changes when there haven't been any actual changes.
Fixes #7081
-rw-r--r-- | COPYRIGHT | 1 | ||||
-rw-r--r-- | libpurple/status.c | 44 |
2 files changed, 30 insertions, 15 deletions
@@ -444,6 +444,7 @@ Tom Tromey Todd Troxell Brad Turcotte Kyle Turman +Jon Turney Junichi Uekawa Igor Vlasenko István Váradi diff --git a/libpurple/status.c b/libpurple/status.c index 11dc119f1c..5feb311e7d 100644 --- a/libpurple/status.c +++ b/libpurple/status.c @@ -816,28 +816,42 @@ purple_status_set_active_with_attrs_list(PurpleStatus *status, gboolean active, /* Reset any unspecified attributes to their default value */ status_type = purple_status_get_type(status); l = purple_status_type_get_attrs(status_type); - while (l != NULL) - { + while (l != NULL) { PurpleStatusAttr *attr; attr = l->data; - if (!g_list_find_custom(specified_attr_ids, attr->id, (GCompareFunc)strcmp)) - { + l = l->next; + + if (!g_list_find_custom(specified_attr_ids, attr->id, (GCompareFunc)strcmp)) { PurpleValue *default_value; default_value = purple_status_attr_get_value(attr); - if (default_value->type == PURPLE_TYPE_STRING) - purple_status_set_attr_string(status, attr->id, - purple_value_get_string(default_value)); - else if (default_value->type == PURPLE_TYPE_INT) - purple_status_set_attr_int(status, attr->id, - purple_value_get_int(default_value)); - else if (default_value->type == PURPLE_TYPE_BOOLEAN) - purple_status_set_attr_boolean(status, attr->id, - purple_value_get_boolean(default_value)); + if (default_value->type == PURPLE_TYPE_STRING) { + const char *cur = purple_status_get_attr_string(status, attr->id); + const char *def = purple_value_get_string(default_value); + if ((cur == NULL && def == NULL) + || (cur != NULL && def != NULL + && !strcmp(cur, def))) { + continue; + } + + purple_status_set_attr_string(status, attr->id, def); + } else if (default_value->type == PURPLE_TYPE_INT) { + int cur = purple_status_get_attr_int(status, attr->id); + int def = purple_value_get_int(default_value); + if (cur == def) + continue; + + purple_status_set_attr_int(status, attr->id, def); + } else if (default_value->type == PURPLE_TYPE_BOOLEAN) { + gboolean cur = purple_status_get_attr_boolean(status, attr->id); + gboolean def = purple_value_get_boolean(default_value); + if (cur == def) + continue; + + purple_status_set_attr_boolean(status, attr->id, def); + } changed = TRUE; } - - l = l->next; } g_list_free(specified_attr_ids); |