From: <aar...@us...> - 2006-07-23 21:25:19
|
Revision: 16553 Author: aaronsheldon Date: 2006-07-23 14:25:09 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16553&view=rev Log Message: ----------- Caching lookup keys until something changes. Still has some bugs though. Modified Paths: -------------- branches/soc-2006-blist-efficiency/src/gtkblist.c branches/soc-2006-blist-efficiency/src/gtkblist.h Modified: branches/soc-2006-blist-efficiency/src/gtkblist.c =================================================================== --- branches/soc-2006-blist-efficiency/src/gtkblist.c 2006-07-23 20:38:07 UTC (rev 16552) +++ branches/soc-2006-blist-efficiency/src/gtkblist.c 2006-07-23 21:25:09 UTC (rev 16553) @@ -120,7 +120,8 @@ static GaimGtkBuddyList *gtkblist = NULL; static gboolean gaim_gtk_blist_refresh_timer(GaimBuddyList *list); -static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node); +static void gaim_gtk_blist_update_buddy_status_icon_key(GaimBlistNode *node, GaimStatusIconSize size); +static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node, gboolean statusChange); static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data); static void gaim_gtk_blist_update(GaimBuddyList *list, GaimBlistNode *node); static void gaim_gtk_blist_update_contact(GaimBuddyList *list, GaimBlistNode *node); @@ -137,6 +138,7 @@ gboolean contact_expanded; gboolean recent_signonoff; gint recent_signonoff_timer; + GString *status_icon_key; }; @@ -2706,6 +2708,98 @@ return; } +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}}; + + 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); + else + g_string_printf(key, "%s/logout", protoname); + } 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)); + + if(!prpl) + return; + + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); + + 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) + prpl_info->list_emblems(buddy, &emblems[0].filename, + &emblems[1].filename, &emblems[2].filename, + &emblems[3].filename); + } + + 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); + } + } + } + + if (!GAIM_BUDDY_IS_ONLINE(buddy)) { + key = g_string_append(key, "/off"); + } else if (gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) { + key = g_string_append(key, "/idle"); + } + if (!gaim_privacy_check(buddy->account, gaim_buddy_get_name(buddy))) { + key = g_string_append(key, "/priv"); + } + + if (gtkbuddynode) { + if (gtkbuddynode->status_icon_key) + g_string_free(gtkbuddynode->status_icon_key, TRUE); + gtkbuddynode->status_icon_key = g_string_new(key->str); + } + + g_string_free(key, TRUE); + return; +} + GdkPixbuf * gaim_gtk_blist_get_status_icon(GaimBlistNode *node, GaimStatusIconSize size) { @@ -2722,12 +2816,6 @@ GaimBuddy *buddy = NULL; GaimChat *chat = NULL; - if (!status_icon_hash_table) - status_icon_hash_table = g_hash_table_new_full((GHashFunc)g_string_hash, - (GEqualFunc)g_string_equal, - (GDestroyNotify)g_string_destroy, - (GDestroyNotify)gdk_pixbuf_unref); - if(GAIM_BLIST_NODE_IS_CONTACT(node)) { if(!gtknode->contact_expanded) { buddy = gaim_contact_get_priority_buddy((GaimContact*)node); @@ -2742,6 +2830,28 @@ return NULL; } + if (!status_icon_hash_table) { + status_icon_hash_table = g_hash_table_new_full((GHashFunc)g_string_hash, + (GEqualFunc)g_string_equal, + (GDestroyNotify)g_string_destroy, + (GDestroyNotify)gdk_pixbuf_unref); + + } else if (buddy && gtkbuddynode->status_icon_key && gtkbuddynode->status_icon_key->str) { + key = g_string_new(gtkbuddynode->status_icon_key->str); + + /* Respect the size request given */ + if (size == GAIM_STATUS_ICON_SMALL) { + key = g_string_append(key, "/tiny"); + } + + scale = g_hash_table_lookup(status_icon_hash_table, key); + if (scale) { + gdk_pixbuf_ref(scale); + g_string_free(key, TRUE); + return scale; + } + } + if(buddy || chat) { GaimAccount *account; GaimPlugin *prpl; @@ -2769,75 +2879,43 @@ } } - if(buddy) { - 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"; - } - } - } - } - - if(size == GAIM_STATUS_ICON_SMALL) { - scalesize = 15; - /* So that only the se icon will composite */ - emblems[1].filename = emblems[2].filename = emblems[3].filename = NULL; - } - /* Begin Generating Lookup Key */ if (buddy) { + gaim_gtk_blist_update_buddy_status_icon_key(node, size); + g_string_printf(key, "%s", strdup(gtkbuddynode->status_icon_key->str)); + } + /* There are only two options for chat or gaimdude - big or small */ + else if (chat) { + GaimAccount *account; + GaimPlugin *prpl; + GaimPluginProtocolInfo *prpl_info; - if (GAIM_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) - g_string_append_printf(key, "%s/login", protoname); - else if (!GAIM_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) - g_string_append_printf(key, "%s/logout", protoname); - else - key = g_string_append(key, protoname); + account = chat->account; - presence = gaim_buddy_get_presence(buddy); - if (!GAIM_BUDDY_IS_ONLINE(buddy)) { - key = g_string_append(key, "/off"); - } else if (gaim_presence_is_idle(presence)) { - key = g_string_append(key, "/idle"); - } + prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); + if(!prpl) + return NULL; - if (!gaim_privacy_check(buddy->account, gaim_buddy_get_name(buddy))) { - key = g_string_append(key, "/priv"); - } + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); - if (size == GAIM_STATUS_ICON_SMALL) { - key = g_string_append(key, "/tiny"); + if(prpl_info && prpl_info->list_icon) { + protoname = prpl_info->list_icon(account, NULL); } - - for(i=0; i<4; i++) { - if(emblems[i].filename) { - g_string_append_printf(key, "/%s", emblems[i].filename); - } - } + g_string_append_printf(key, "%s-chat", protoname); } - /* There are only two options for chat or gaimdude - big or small */ - else if (chat && size == GAIM_STATUS_ICON_SMALL) - g_string_append_printf(key, "%s-chat-s", protoname); - else if (chat) - g_string_append_printf(key, "%s-chat", protoname); - else if (size == GAIM_STATUS_ICON_SMALL) - key = g_string_append(key, "gaimdude-s"); else key = g_string_append(key, "gaimdude"); + /* If the icon is small, we do not store this into the status_icon_key + * in the gtkbuddynode. This way we can respect the size value on cache + * lookup. Otherwise, different sized icons could not be stored easily. + */ + if (size == GAIM_STATUS_ICON_SMALL) { + key = g_string_append(key, "/tiny"); + } + /* End Generating Lookup Key */ - /* If we already know this icon, just return it */ scale = g_hash_table_lookup(status_icon_hash_table, key); if (scale) { @@ -2848,6 +2926,54 @@ /* Create a new composite icon */ + if(buddy) { + GaimAccount *account; + GaimPlugin *prpl; + GaimPluginProtocolInfo *prpl_info; + 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)); + if(!prpl) + return NULL; + + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->list_icon) { + protoname = prpl_info->list_icon(account, buddy); + } + if(prpl_info && prpl_info->list_emblems) { + if(gtknode && !gtknode->recent_signonoff) + prpl_info->list_emblems(buddy, &emblems[0].filename, + &emblems[1].filename, &emblems[2].filename, + &emblems[3].filename); + } + } + + if(size == GAIM_STATUS_ICON_SMALL) { + scalesize = 15; + /* So that only the se icon will composite */ + emblems[1].filename = emblems[2].filename = emblems[3].filename = NULL; + } + + + if(buddy && GAIM_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) { filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "login.png", NULL); } else if(buddy && !GAIM_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) { @@ -2903,7 +3029,7 @@ } if(buddy) { - + presence = gaim_buddy_get_presence(buddy); if (!GAIM_BUDDY_IS_ONLINE(buddy)) gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); else if (gaim_presence_is_idle(presence)) @@ -3309,7 +3435,7 @@ if(conv->account != NULL && conv->name != NULL) { GaimBuddy *buddy = gaim_find_buddy(conv->account, conv->name); if(buddy != NULL) - gaim_gtk_blist_update_buddy(NULL, (GaimBlistNode *)buddy); + gaim_gtk_blist_update_buddy(NULL, (GaimBlistNode *)buddy, TRUE); } if (gtkblist->menutrayicon) { @@ -3997,12 +4123,11 @@ /* This is only needed when we're reverting to a non-GTK+ sorted * status. We shouldn't need to remove otherwise. */ - if (remove && !GAIM_BLIST_NODE_IS_GROUP(node)) gaim_gtk_blist_hide_node(list, node, FALSE); if (GAIM_BLIST_NODE_IS_BUDDY(node)) - gaim_gtk_blist_update_buddy(list, node); + gaim_gtk_blist_update_buddy(list, node, FALSE); else if (GAIM_BLIST_NODE_IS_CHAT(node)) gaim_gtk_blist_update(list, node); node = gaim_blist_node_next(node, FALSE); @@ -4363,7 +4488,7 @@ -static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node) +static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node, gboolean statusChange) { GaimBuddy *buddy; struct _gaim_gtk_blist_node *gtkparentnode; @@ -4374,7 +4499,10 @@ return; buddy = (GaimBuddy*)node; - + if (statusChange) + gaim_gtk_blist_update_buddy_status_icon_key(node, (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") + ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); + /* First things first, update the contact */ gaim_gtk_blist_update_contact(list, node); @@ -4450,7 +4578,7 @@ gaim_gtk_blist_update_contact(list, node); break; case GAIM_BLIST_BUDDY_NODE: - gaim_gtk_blist_update_buddy(list, node); + gaim_gtk_blist_update_buddy(list, node, TRUE); break; case GAIM_BLIST_CHAT_NODE: gaim_gtk_blist_update_chat(list, node); Modified: branches/soc-2006-blist-efficiency/src/gtkblist.h =================================================================== --- branches/soc-2006-blist-efficiency/src/gtkblist.h 2006-07-23 20:38:07 UTC (rev 16552) +++ branches/soc-2006-blist-efficiency/src/gtkblist.h 2006-07-23 21:25:09 UTC (rev 16553) @@ -143,7 +143,7 @@ * Populates a menu with the items shown on the buddy list for a buddy. * * @param menu The menu to populate - * @param buddy The buddy who's menu to get + * @param buddy The buddy whose menu to get * @param sub TRUE if this is a sub-menu, FALSE otherwise */ void gaim_gtk_blist_make_buddy_menu(GtkWidget *menu, GaimBuddy *buddy, gboolean sub); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <aar...@us...> - 2006-07-25 04:08:32
|
Revision: 16568 Author: aaronsheldon Date: 2006-07-24 21:08:19 -0700 (Mon, 24 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16568&view=rev Log Message: ----------- Fixes bugs with gtkblist and privacy settings. Privacy.c changes in this commit are a more efficient and accurate way to handle blocking/unblocking buddies, and is mostly thanks to Sadrul. Modified Paths: -------------- branches/soc-2006-blist-efficiency/src/gtkblist.c branches/soc-2006-blist-efficiency/src/privacy.c Modified: branches/soc-2006-blist-efficiency/src/gtkblist.c =================================================================== --- branches/soc-2006-blist-efficiency/src/gtkblist.c 2006-07-25 02:46:26 UTC (rev 16567) +++ branches/soc-2006-blist-efficiency/src/gtkblist.c 2006-07-25 04:08:19 UTC (rev 16568) @@ -128,7 +128,7 @@ static char *gaim_get_tooltip_text(GaimBlistNode *node, gboolean full); static const char *item_factory_translate_func (const char *path, gpointer func_data); static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter); -static void redo_buddy_list(GaimBuddyList *list, gboolean remove); +static void redo_buddy_list(GaimBuddyList *list, gboolean remove, gboolean rerender); static void gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node); static void gaim_gtk_blist_tooltip_destroy(void); @@ -3582,7 +3582,7 @@ gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); } - redo_buddy_list(gaim_get_blist(), FALSE); + redo_buddy_list(gaim_get_blist(), FALSE, FALSE); #if GTK_CHECK_VERSION(2,6,0) gtk_tree_view_columns_autosize(GTK_TREE_VIEW(gtkblist->treeview)); #endif @@ -4122,7 +4122,7 @@ gaim_signal_emit(handle, "gtkblist-created", list); } -static void redo_buddy_list(GaimBuddyList *list, gboolean remove) +static void redo_buddy_list(GaimBuddyList *list, gboolean remove, gboolean rerender) { GaimBlistNode *node = list->root; @@ -4135,7 +4135,7 @@ gaim_gtk_blist_hide_node(list, node, FALSE); if (GAIM_BLIST_NODE_IS_BUDDY(node)) - gaim_gtk_blist_update_buddy(list, node, FALSE); + gaim_gtk_blist_update_buddy(list, node, rerender); else if (GAIM_BLIST_NODE_IS_CHAT(node)) gaim_gtk_blist_update(list, node); node = gaim_blist_node_next(node, FALSE); @@ -4151,7 +4151,7 @@ void gaim_gtk_blist_refresh(GaimBuddyList *list) { - redo_buddy_list(list, FALSE); + redo_buddy_list(list, FALSE, TRUE); } void @@ -5498,9 +5498,9 @@ return; } if (!strcmp(id, "none")) { - redo_buddy_list(gaim_get_blist(), TRUE); + redo_buddy_list(gaim_get_blist(), TRUE, FALSE); } else { - redo_buddy_list(gaim_get_blist(), FALSE); + redo_buddy_list(gaim_get_blist(), FALSE, FALSE); } } Modified: branches/soc-2006-blist-efficiency/src/privacy.c =================================================================== --- branches/soc-2006-blist-efficiency/src/privacy.c 2006-07-25 02:46:26 UTC (rev 16567) +++ branches/soc-2006-blist-efficiency/src/privacy.c 2006-07-25 04:08:19 UTC (rev 16568) @@ -42,18 +42,18 @@ name = g_strdup(gaim_normalize(account, who)); for (l = account->permit; l != NULL; l = l->next) { - if (!gaim_utf8_strcasecmp(name, gaim_normalize(account, (char *)l->data))) + if (!gaim_utf8_strcasecmp(name, (char *)l->data)) break; } - buddy = gaim_find_buddy(account, name); - g_free(name); + if (l != NULL) + { + g_free(name); + return FALSE; + } - if (l != NULL) - return FALSE; + account->permit = g_slist_append(account->permit, name); - account->permit = g_slist_append(account->permit, g_strdup(who)); - if (!local_only && gaim_account_is_connected(account)) serv_add_permit(gaim_account_get_connection(account), who); @@ -63,6 +63,7 @@ gaim_blist_schedule_save(); /* This lets the UI know a buddy has had its privacy setting changed */ + buddy = gaim_find_buddy(account, name); if (buddy != NULL) { gaim_signal_emit(gaim_blist_get_handle(), "buddy-privacy-changed", buddy); @@ -81,17 +82,13 @@ g_return_val_if_fail(account != NULL, FALSE); g_return_val_if_fail(who != NULL, FALSE); - name = g_strdup(gaim_normalize(account, who)); + name = gaim_normalize(account, who); for (l = account->permit; l != NULL; l = l->next) { - if (!gaim_utf8_strcasecmp(name, gaim_normalize(account, (char *)l->data))) + if (!gaim_utf8_strcasecmp(name, (char *)l->data)) break; } - buddy = gaim_find_buddy(account, name); - - g_free(name); - if (l == NULL) return FALSE; @@ -106,6 +103,7 @@ gaim_blist_schedule_save(); + buddy = gaim_find_buddy(account, name); if (buddy != NULL) { gaim_signal_emit(gaim_blist_get_handle(), "buddy-privacy-changed", buddy); @@ -119,7 +117,7 @@ { GSList *l; char *name; - GaimBuddy *buddy = NULL; + GaimBuddy *buddy; g_return_val_if_fail(account != NULL, FALSE); g_return_val_if_fail(who != NULL, FALSE); @@ -131,14 +129,13 @@ break; } - buddy = gaim_find_buddy(account, name); - - g_free(name); - if (l != NULL) + { + g_free(name); return FALSE; + } - account->deny = g_slist_append(account->deny, g_strdup(who)); + account->deny = g_slist_append(account->deny, name); if (!local_only && gaim_account_is_connected(account)) serv_add_deny(gaim_account_get_connection(account), who); @@ -148,6 +145,7 @@ gaim_blist_schedule_save(); + buddy = gaim_find_buddy(account, name); if (buddy != NULL) { gaim_signal_emit(gaim_blist_get_handle(), "buddy-privacy-changed", buddy); @@ -161,22 +159,20 @@ { GSList *l; char *name; - GaimBuddy *buddy = NULL; + GaimBuddy *buddy; g_return_val_if_fail(account != NULL, FALSE); g_return_val_if_fail(who != NULL, FALSE); - name = g_strdup(gaim_normalize(account, who)); + name = gaim_normalize(account, who); for (l = account->deny; l != NULL; l = l->next) { - if (!gaim_utf8_strcasecmp(name, gaim_normalize(account, (char *)l->data))) + if (!gaim_utf8_strcasecmp(name, (char *)l->data)) break; } buddy = gaim_find_buddy(account, name); - g_free(name); - if (l == NULL) return FALSE; @@ -187,12 +183,13 @@ serv_rem_deny(gaim_account_get_connection(account), name); if (privacy_ops != NULL && privacy_ops->deny_removed != NULL) - privacy_ops->deny_removed(account, name); + privacy_ops->deny_removed(account, who); if (buddy != NULL) { gaim_signal_emit(gaim_blist_get_handle(), "buddy-privacy-changed", buddy); } + g_free(name); gaim_blist_schedule_save(); @@ -212,15 +209,17 @@ return FALSE; case GAIM_PRIVACY_ALLOW_USERS: + who = gaim_normalize(account, who); for (list=account->permit; list!=NULL; list=list->next) { - if (!gaim_utf8_strcasecmp(who, gaim_normalize(account, (char *)list->data))) + if (!gaim_utf8_strcasecmp(who, (char *)list->data)) return TRUE; } return FALSE; case GAIM_PRIVACY_DENY_USERS: + who = gaim_normalize(account, who); for (list=account->deny; list!=NULL; list=list->next) { - if (!gaim_utf8_strcasecmp(who, gaim_normalize( account, (char *)list->data ))) + if (!gaim_utf8_strcasecmp(who, (char *)list->data )) return FALSE; } return TRUE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |