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.
|