Mercurial > pidgin
comparison src/status.c @ 10754:8a97b59f0071
[gaim-migrate @ 12357]
Some fairly clutch changes to how accounts set their statuses. This
gets rid of a lot of those g_assertion warnings.
My Girlfriend: Dad, why do we have so many forks?
Her Dad: Well, it's like the lord said, "Go fork and multiply."
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 27 Mar 2005 19:12:52 +0000 |
| parents | 55af3fa46329 |
| children | f93ed7f6ecc7 |
comparison
equal
deleted
inserted
replaced
| 10753:b40a67d45dbb | 10754:8a97b59f0071 |
|---|---|
| 581 } | 581 } |
| 582 | 582 |
| 583 return status; | 583 return status; |
| 584 } | 584 } |
| 585 | 585 |
| 586 /* | |
| 587 * TODO: If the GaimStatus is in a GaimPresence, then | |
| 588 * remove it from the GaimPresence? | |
| 589 */ | |
| 586 void | 590 void |
| 587 gaim_status_destroy(GaimStatus *status) | 591 gaim_status_destroy(GaimStatus *status) |
| 588 { | 592 { |
| 589 g_return_if_fail(status != NULL); | 593 g_return_if_fail(status != NULL); |
| 590 | 594 |
| 595 /* TODO: Don't do this is if the status is exclusive */ | |
| 591 gaim_status_set_active(status, FALSE); | 596 gaim_status_set_active(status, FALSE); |
| 592 | 597 |
| 593 g_hash_table_destroy(status->attr_values); | 598 g_hash_table_destroy(status->attr_values); |
| 594 | 599 |
| 595 g_free(status); | 600 g_free(status); |
| 706 { | 711 { |
| 707 GaimPresence *presence; | 712 GaimPresence *presence; |
| 708 GaimStatus *old_status; | 713 GaimStatus *old_status; |
| 709 | 714 |
| 710 presence = gaim_status_get_presence(status); | 715 presence = gaim_status_get_presence(status); |
| 711 old_status = gaim_presence_get_active_status(presence); | |
| 712 | 716 |
| 713 /* | 717 /* |
| 714 * If this status is exclusive, then we must be setting it to "active." | 718 * If this status is exclusive, then we must be setting it to "active." |
| 715 * Since we are setting it to active, we want to set the currently | 719 * Since we are setting it to active, we want to set the currently |
| 716 * active status to "inactive." | 720 * active status to "inactive." |
| 717 */ | 721 */ |
| 718 if (gaim_status_is_exclusive(status)) | 722 if (gaim_status_is_exclusive(status)) |
| 719 { | 723 { |
| 720 const GList *l; | 724 old_status = gaim_presence_get_active_status(presence); |
| 721 | 725 if (old_status != NULL) |
| 722 for (l = gaim_presence_get_statuses(presence); l != NULL; l = l->next) | 726 old_status->active = FALSE; |
| 723 { | 727 presence->active_status = status; |
| 724 GaimStatus *temp_status = l->data; | 728 } |
| 725 | 729 else |
| 726 if (temp_status == status) | 730 old_status = NULL; |
| 727 continue; | |
| 728 | |
| 729 if (gaim_status_is_independent(temp_status)) | |
| 730 continue; | |
| 731 | |
| 732 if (gaim_status_is_active(temp_status)) | |
| 733 { | |
| 734 /* | |
| 735 * Since we don't want infinite recursion, we have to set | |
| 736 * the active variable ourself instead of calling | |
| 737 * gaim_status_set_active(). | |
| 738 */ | |
| 739 temp_status->active = FALSE; | |
| 740 | |
| 741 notify_status_update(presence, old_status, temp_status); | |
| 742 | |
| 743 break; | |
| 744 } | |
| 745 } | |
| 746 } | |
| 747 | 731 |
| 748 notify_status_update(presence, old_status, status); | 732 notify_status_update(presence, old_status, status); |
| 749 } | 733 } |
| 750 | 734 |
| 751 void | 735 void |
| 752 gaim_status_set_active(GaimStatus *status, gboolean active) | 736 gaim_status_set_active(GaimStatus *status, gboolean active) |
| 753 { | 737 { |
| 738 gaim_status_set_active_with_attrs(status, active, NULL); | |
| 739 } | |
| 740 | |
| 741 void | |
| 742 gaim_status_set_active_with_attrs(GaimStatus *status, gboolean active, va_list args) | |
| 743 { | |
| 744 gboolean changed = FALSE; | |
| 745 const gchar *id; | |
| 746 | |
| 747 g_return_if_fail(status != NULL); | |
| 748 | |
| 754 if (!active && gaim_status_is_exclusive(status)) | 749 if (!active && gaim_status_is_exclusive(status)) |
| 755 { | 750 { |
| 756 gaim_debug_error("status", | 751 gaim_debug_error("status", |
| 757 "Cannot deactivate an exclusive status (%s).\n", | 752 "Cannot deactivate an exclusive status (%s).\n", |
| 758 gaim_status_get_id(status)); | 753 gaim_status_get_id(status)); |
| 759 return; | 754 return; |
| 760 } | 755 } |
| 761 | 756 |
| 762 g_return_if_fail(status != NULL); | 757 if (status->active != active) |
| 763 | 758 { |
| 764 if (status->active == active) | 759 changed = TRUE; |
| 765 return; | 760 } |
| 766 | 761 |
| 767 status->active = active; | 762 status->active = active; |
| 768 | 763 |
| 769 status_has_changed(status); | |
| 770 } | |
| 771 | |
| 772 void | |
| 773 gaim_status_set_active_with_attrs(GaimStatus *status, gboolean active, va_list args) | |
| 774 { | |
| 775 gboolean changed = FALSE; | |
| 776 const gchar *id; | |
| 777 | |
| 778 g_return_if_fail(status != NULL); | |
| 779 | |
| 780 if (!active && gaim_status_is_exclusive(status)) | |
| 781 { | |
| 782 gaim_debug_error("status", | |
| 783 "Cannot deactivate an exclusive status (%s).\n", | |
| 784 gaim_status_get_id(status)); | |
| 785 return; | |
| 786 } | |
| 787 | |
| 788 if (status->active != active) | |
| 789 { | |
| 790 changed = TRUE; | |
| 791 } | |
| 792 | |
| 793 status->active = active; | |
| 794 | |
| 795 /* Set any attributes */ | 764 /* Set any attributes */ |
| 765 if (args != NULL) | |
| 796 while ((id = va_arg(args, const char *)) != NULL) | 766 while ((id = va_arg(args, const char *)) != NULL) |
| 797 { | 767 { |
| 798 GaimValue *value; | 768 GaimValue *value; |
| 799 value = gaim_status_get_attr_value(status, id); | 769 value = gaim_status_get_attr_value(status, id); |
| 800 if (value == NULL) | 770 if (value == NULL) |
| 1274 "(%s) inactive. Only independent statuses " | 1244 "(%s) inactive. Only independent statuses " |
| 1275 "can be specifically marked inactive.", | 1245 "can be specifically marked inactive.", |
| 1276 status_id); | 1246 status_id); |
| 1277 return; | 1247 return; |
| 1278 } | 1248 } |
| 1279 | |
| 1280 if (presence->active_status != NULL) | |
| 1281 gaim_status_set_active(presence->active_status, FALSE); | |
| 1282 presence->active_status = status; | |
| 1283 } | 1249 } |
| 1284 | 1250 |
| 1285 gaim_status_set_active(status, active); | 1251 gaim_status_set_active(status, active); |
| 1286 } | 1252 } |
| 1287 | 1253 |
| 1288 void | 1254 void |
| 1289 gaim_presence_switch_status(GaimPresence *presence, const char *status_id) | 1255 gaim_presence_switch_status(GaimPresence *presence, const char *status_id) |
| 1290 { | 1256 { |
| 1291 GaimStatus *status; | 1257 gaim_presence_set_status_active(presence, status_id, TRUE); |
| 1292 | |
| 1293 g_return_if_fail(presence != NULL); | |
| 1294 g_return_if_fail(status_id != NULL); | |
| 1295 | |
| 1296 status = gaim_presence_get_status(presence, status_id); | |
| 1297 | |
| 1298 g_return_if_fail(status != NULL); | |
| 1299 | |
| 1300 if (gaim_status_is_independent(status)) | |
| 1301 return; | |
| 1302 | |
| 1303 if (presence->active_status != NULL) | |
| 1304 gaim_status_set_active(presence->active_status, FALSE); | |
| 1305 | |
| 1306 gaim_status_set_active(status, TRUE); | |
| 1307 } | 1258 } |
| 1308 | 1259 |
| 1309 static void | 1260 static void |
| 1310 update_buddy_idle(GaimBuddy *buddy, GaimPresence *presence, | 1261 update_buddy_idle(GaimBuddy *buddy, GaimPresence *presence, |
| 1311 time_t current_time, gboolean old_idle, gboolean idle) | 1262 time_t current_time, gboolean old_idle, gboolean idle) |
