summaryrefslogtreecommitdiff
path: root/libpurple/purplebuddypresence.c
diff options
context:
space:
mode:
authorGary Kramlich <grim@reaperworld.com>2020-12-03 22:28:40 -0600
committerGary Kramlich <grim@reaperworld.com>2020-12-03 22:28:40 -0600
commit7ce89935fd60981926a43a24b58cada5ec1b217c (patch)
treedb9a90eaf23fde3e7e9977356fe21ab2f8a3a7b8 /libpurple/purplebuddypresence.c
parente39bfcd3513af588c78d587845c5eb6e30dd176e (diff)
downloadpidgin-7ce89935fd60981926a43a24b58cada5ec1b217c.tar.gz
Fix a bug where accounts were losing their active status.
Testing Done: Compiled and ran locally, verified that an accounts active status is actually saved in `accounts.xml` now. Reviewed at https://reviews.imfreedom.org/r/262/
Diffstat (limited to 'libpurple/purplebuddypresence.c')
-rw-r--r--libpurple/purplebuddypresence.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/libpurple/purplebuddypresence.c b/libpurple/purplebuddypresence.c
index 07c9ede42d..03051d7d27 100644
--- a/libpurple/purplebuddypresence.c
+++ b/libpurple/purplebuddypresence.c
@@ -29,6 +29,8 @@ struct _PurpleBuddyPresence {
PurplePresence parent;
PurpleBuddy *buddy;
+
+ GList *statuses;
};
enum {
@@ -197,13 +199,24 @@ purple_buddy_presence_update_idle(PurplePresence *presence, gboolean old_idle)
static GList *
purple_buddy_presence_get_statuses(PurplePresence *presence) {
- PurpleAccount *account = NULL;
PurpleBuddyPresence *buddy_presence = NULL;
buddy_presence = PURPLE_BUDDY_PRESENCE(presence);
- account = purple_buddy_get_account(buddy_presence->buddy);
- return purple_protocol_get_statuses(account, presence);
+ /* We cache purple_protocol_get_statuses because it creates all new
+ * statuses which loses at least the active attribute, which breaks all
+ * sorts of things.
+ */
+ if(buddy_presence->statuses == NULL) {
+ PurpleAccount *account = NULL;
+
+ account = purple_buddy_get_account(buddy_presence->buddy);
+
+ buddy_presence->statuses = purple_protocol_get_statuses(account,
+ presence);
+ }
+
+ return buddy_presence->statuses;
}
/******************************************************************************
@@ -250,6 +263,7 @@ purple_buddy_presence_finalize(GObject *obj) {
PurpleBuddyPresence *presence = PURPLE_BUDDY_PRESENCE(obj);
g_clear_object(&presence->buddy);
+ g_list_free_full(presence->statuses, g_object_unref);
G_OBJECT_CLASS(purple_buddy_presence_parent_class)->finalize(obj);
}