From: <aar...@us...> - 2006-07-24 23:20:01
|
Revision: 16564 Author: aaronsheldon Date: 2006-07-24 16:19:55 -0700 (Mon, 24 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16564&view=rev Log Message: ----------- Adds a buddy-privacy-changed signal so the UI can tell a buddy has been blocked even when the buddy's online/offline state does not change as a result of it. This bug still exists in trunk, and it requires fairly extensive changes to work properly. Corrects all other known bugs with the gtkblist that I caused. Modified Paths: -------------- branches/soc-2006-blist-efficiency/src/blist.c branches/soc-2006-blist-efficiency/src/gtkblist.c branches/soc-2006-blist-efficiency/src/gtkconv.c branches/soc-2006-blist-efficiency/src/privacy.c Modified: branches/soc-2006-blist-efficiency/src/blist.c =================================================================== --- branches/soc-2006-blist-efficiency/src/blist.c 2006-07-24 16:19:16 UTC (rev 16563) +++ branches/soc-2006-blist-efficiency/src/blist.c 2006-07-24 23:19:55 UTC (rev 16564) @@ -2637,6 +2637,11 @@ GAIM_SUBTYPE_STATUS), gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_STATUS)); + gaim_signal_register(handle, "buddy-privacy-changed", + gaim_marshal_VOID__POINTER, NULL, + 1, + gaim_value_new(GAIM_TYPE_SUBTYPE, + GAIM_SUBTYPE_BLIST_BUDDY)); gaim_signal_register(handle, "buddy-idle-changed", gaim_marshal_VOID__POINTER_INT_INT, NULL, Modified: branches/soc-2006-blist-efficiency/src/gtkblist.c =================================================================== --- branches/soc-2006-blist-efficiency/src/gtkblist.c 2006-07-24 16:19:16 UTC (rev 16563) +++ branches/soc-2006-blist-efficiency/src/gtkblist.c 2006-07-24 23:19:55 UTC (rev 16564) @@ -538,6 +538,12 @@ } static void +gaim_gtk_blist_update_privacy_cb(GaimBuddy *buddy) +{ + gaim_gtk_blist_update_buddy(gaim_get_blist(), (GaimBlistNode*)(buddy), TRUE); +} + +static void rebuild_joinchat_entries(GaimGtkJoinChatData *data) { GaimConnection *gc; @@ -2711,43 +2717,30 @@ static void gaim_gtk_blist_update_buddy_status_icon_key(GaimBlistNode *node, GaimStatusIconSize size) { - int i; - GaimAccount *account; - GaimPlugin *prpl; - GaimPluginProtocolInfo *prpl_info; - GString *key = g_string_sized_new(16); - GaimBuddy *buddy; - const char *protoname = NULL; - struct _gaim_gtk_blist_node *gtknode = node->ui_data; - struct _gaim_gtk_blist_node *gtkbuddynode = NULL; - struct _emblem_data emblems[4] = {{NULL, 15, 15}, {NULL, 0, 15}, - {NULL, 0, 0}, {NULL, 15, 0}}; + int i; + GaimAccount *account; + GaimPlugin *prpl; + GaimPluginProtocolInfo *prpl_info; + GString *key = g_string_sized_new(16); + GaimBuddy *buddy; + const char *protoname = NULL; + struct _gaim_gtk_blist_node *gtknode = node->ui_data; + struct _gaim_gtk_blist_node *gtkbuddynode = NULL; + struct _emblem_data emblems[4] = {{NULL, 15, 15}, {NULL, 0, 15}, + {NULL, 0, 0}, {NULL, 15, 0}}; - buddy = (GaimBuddy*)node; - gtkbuddynode = node->ui_data; + buddy = (GaimBuddy*)node; + gtkbuddynode = node->ui_data; if (gtkbuddynode && gtkbuddynode->recent_signonoff) { if (GAIM_BUDDY_IS_ONLINE(buddy)) - g_string_printf(key, "%s/login", protoname); + g_string_printf(key, "login"); else - g_string_printf(key, "%s/logout", protoname); + g_string_printf(key, "logout"); } else { GaimConversation *conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, gaim_buddy_get_name(buddy), gaim_buddy_get_account(buddy)); - if(conv != NULL) { - GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); - if(gtkconv != NULL && gaim_gtkconv_is_hidden(gtkconv)) { - /* add pending emblem */ - if(size == GAIM_STATUS_ICON_SMALL) { - emblems[0].filename="pending"; - } - else { - emblems[3].filename=emblems[2].filename; - emblems[2].filename="pending"; - } - } - } account = buddy->account; prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); @@ -2760,20 +2753,34 @@ if(prpl_info && prpl_info->list_icon) { protoname = prpl_info->list_icon(account, buddy); } - if(prpl_info && prpl_info->list_emblems && buddy) { - if(gtknode && !gtknode->recent_signonoff) + if(prpl_info && prpl_info->list_emblems) { + if(gtknode) prpl_info->list_emblems(buddy, &emblems[0].filename, &emblems[1].filename, &emblems[2].filename, &emblems[3].filename); } + g_string_assign(key, protoname); + + if(conv != NULL) { + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); + if(gtkconv != NULL && gaim_gtkconv_is_hidden(gtkconv)) { + /* add pending emblem */ + if(size == GAIM_STATUS_ICON_SMALL) { + emblems[0].filename="pending"; + } + else { + emblems[3].filename=emblems[2].filename; + emblems[2].filename="pending"; + } + } + } + if(size == GAIM_STATUS_ICON_SMALL) { /* So that only the se icon will composite */ emblems[1].filename = emblems[2].filename = emblems[3].filename = NULL; } - g_string_assign(key, protoname); - for(i=0; i<4; i++) { if(emblems[i].filename) { g_string_append_printf(key, "/%s", emblems[i].filename); @@ -2934,19 +2941,6 @@ gaim_buddy_get_name(buddy), gaim_buddy_get_account(buddy)); - if(conv != NULL) { - GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); - if(gtkconv != NULL && gaim_gtkconv_is_hidden(gtkconv)) { - /* add pending emblem */ - if(size == GAIM_STATUS_ICON_SMALL) { - emblems[0].filename="pending"; - } - else { - emblems[3].filename=emblems[2].filename; - emblems[2].filename="pending"; - } - } - } account = buddy->account; prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); @@ -2964,6 +2958,20 @@ &emblems[1].filename, &emblems[2].filename, &emblems[3].filename); } + + if(conv != NULL) { + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); + if(gtkconv != NULL && gaim_gtkconv_is_hidden(gtkconv)) { + /* add pending emblem */ + if(size == GAIM_STATUS_ICON_SMALL) { + emblems[0].filename="pending"; + } + else { + emblems[3].filename=emblems[2].filename; + emblems[2].filename="pending"; + } + } + } } if(size == GAIM_STATUS_ICON_SMALL) { @@ -5431,6 +5439,7 @@ gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", gtk_blist_handle, GAIM_CALLBACK(buddy_signonoff_cb), NULL); gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-off", gtk_blist_handle, GAIM_CALLBACK(buddy_signonoff_cb), NULL); + gaim_signal_connect(gaim_blist_get_handle(), "buddy-privacy-changed", gtk_blist_handle, GAIM_CALLBACK(gaim_gtk_blist_update_privacy_cb), NULL); } void Modified: branches/soc-2006-blist-efficiency/src/gtkconv.c =================================================================== --- branches/soc-2006-blist-efficiency/src/gtkconv.c 2006-07-24 16:19:16 UTC (rev 16563) +++ branches/soc-2006-blist-efficiency/src/gtkconv.c 2006-07-24 23:19:55 UTC (rev 16564) @@ -2189,6 +2189,8 @@ GaimAccount *account = NULL; const char *name = NULL; GdkPixbuf *status = NULL; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); + g_return_val_if_fail(conv != NULL, NULL); @@ -2202,6 +2204,12 @@ if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { GaimBuddy *b = gaim_find_buddy(account, name); if (b != NULL) { + /* I hate this hack. It fixes a bug where the pending message icon + * displays in the conv tab even though it shouldn't. + * A better solution would be great. */ + if (ops && ops->update) + ops->update(NULL, (GaimBlistNode*)b); + status = gaim_gtk_blist_get_status_icon((GaimBlistNode*)b, (small_icon ? GAIM_STATUS_ICON_SMALL : GAIM_STATUS_ICON_LARGE)); } @@ -6339,6 +6347,20 @@ } static void +update_buddy_privacy_changed(GaimBuddy *buddy) +{ + GaimGtkConversation *gtkconv; + GaimConversation *conv; + + gtkconv = get_gtkconv_with_contact(gaim_buddy_get_contact(buddy)); + if (gtkconv) + { + conv = gtkconv->active_conv; + gaim_gtkconv_update_fields(conv, GAIM_GTKCONV_TAB_ICON); + } +} + +static void update_buddy_idle_changed(GaimBuddy *buddy, gboolean old, gboolean newidle) { GaimConversation *conv; @@ -6614,6 +6636,8 @@ handle, GAIM_CALLBACK(update_buddy_sign), "off"); gaim_signal_connect(blist_handle, "buddy-status-changed", handle, GAIM_CALLBACK(update_buddy_status_changed), NULL); + gaim_signal_connect(blist_handle, "buddy-privacy-changed", + handle, GAIM_CALLBACK(update_buddy_privacy_changed), NULL); gaim_signal_connect(blist_handle, "buddy-idle-changed", handle, GAIM_CALLBACK(update_buddy_idle_changed), NULL); gaim_signal_connect(blist_handle, "buddy-icon-changed", Modified: branches/soc-2006-blist-efficiency/src/privacy.c =================================================================== --- branches/soc-2006-blist-efficiency/src/privacy.c 2006-07-24 16:19:16 UTC (rev 16563) +++ branches/soc-2006-blist-efficiency/src/privacy.c 2006-07-24 23:19:55 UTC (rev 16564) @@ -34,6 +34,7 @@ { GSList *l; char *name; + GaimBuddy *buddy; g_return_val_if_fail(account != NULL, FALSE); g_return_val_if_fail(who != NULL, FALSE); @@ -44,6 +45,7 @@ if (!gaim_utf8_strcasecmp(name, gaim_normalize(account, (char *)l->data))) break; } + buddy = gaim_find_buddy(account, name); g_free(name); @@ -60,6 +62,11 @@ gaim_blist_schedule_save(); + /* This lets the UI know a buddy has had its privacy setting changed */ + if (buddy != NULL) { + gaim_signal_emit(gaim_blist_get_handle(), + "buddy-privacy-changed", buddy); + } return TRUE; } @@ -69,6 +76,7 @@ { GSList *l; char *name; + GaimBuddy *buddy; g_return_val_if_fail(account != NULL, FALSE); g_return_val_if_fail(who != NULL, FALSE); @@ -80,6 +88,8 @@ break; } + buddy = gaim_find_buddy(account, name); + g_free(name); if (l == NULL) @@ -96,6 +106,10 @@ gaim_blist_schedule_save(); + if (buddy != NULL) { + gaim_signal_emit(gaim_blist_get_handle(), + "buddy-privacy-changed", buddy); + } return TRUE; } @@ -105,6 +119,7 @@ { GSList *l; char *name; + GaimBuddy *buddy = NULL; g_return_val_if_fail(account != NULL, FALSE); g_return_val_if_fail(who != NULL, FALSE); @@ -116,6 +131,8 @@ break; } + buddy = gaim_find_buddy(account, name); + g_free(name); if (l != NULL) @@ -131,6 +148,10 @@ gaim_blist_schedule_save(); + if (buddy != NULL) { + gaim_signal_emit(gaim_blist_get_handle(), + "buddy-privacy-changed", buddy); + } return TRUE; } @@ -140,6 +161,7 @@ { GSList *l; char *name; + GaimBuddy *buddy = NULL; g_return_val_if_fail(account != NULL, FALSE); g_return_val_if_fail(who != NULL, FALSE); @@ -151,6 +173,8 @@ break; } + buddy = gaim_find_buddy(account, name); + g_free(name); if (l == NULL) @@ -165,6 +189,10 @@ if (privacy_ops != NULL && privacy_ops->deny_removed != NULL) privacy_ops->deny_removed(account, name); + if (buddy != NULL) { + gaim_signal_emit(gaim_blist_get_handle(), + "buddy-privacy-changed", buddy); + } g_free(name); gaim_blist_schedule_save(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |