summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Atallah <datallah@pidgin.im>2009-01-27 04:22:53 +0000
committerDaniel Atallah <datallah@pidgin.im>2009-01-27 04:22:53 +0000
commit03902898693d13f96fe4d46f440f9c0cecb57339 (patch)
treeb482adda9af3743c5c9b5f66208e9226b6143ad9
parenteaa66193989cd40c25e8b15d15feef8216bf81a7 (diff)
downloadpidgin-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--COPYRIGHT1
-rw-r--r--libpurple/status.c44
2 files changed, 30 insertions, 15 deletions
diff --git a/COPYRIGHT b/COPYRIGHT
index 03baf6994c..ee1e30572b 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -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);