changeset 19974:7a118cacd4b0

propagate from branch 'im.pidgin.pidgin' (head 671cfe949215447db0da7081a7e1501693ab4f98) to branch 'org.maemo.garage.pidgin.pidgin.dialog-transience' (head ec0c632512dfdd332d217cb3173c05338f1feb1c)
author Gabriel Schulhof <nix@go-nix.ca>
date Sun, 19 Aug 2007 13:40:34 +0000
parents 1cb5f84cb644 (diff) d1dd84d36d8d (current diff)
children 6a0d9fa477d4
files pidgin/gtkconv.c pidgin/gtkdialogs.c pidgin/gtkstatusbox.c
diffstat 6 files changed, 74 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Sun Aug 19 13:09:02 2007 +0000
+++ b/NEWS	Sun Aug 19 13:40:34 2007 +0000
@@ -14,6 +14,12 @@
 	Many thanks to everyone who has helped with tracking down the
 	various issues, testing fixes, and getting patches in.
 
+	Tim: Sean finally got me to fix some of the buddy list bugs with
+	Yahoo! when in version 15 mode. So now we have some Yahoo! to
+	MSN support, which is kind of nice. Looks like some others have
+	been contributing to Yahoo! while I've been AWOL, so many thanks
+	to them.
+
 2.1.0 (7/28/2007):
 	Sean: This release took a bit longer than 3 weeks, but boy is it 
 	worth it! We're beginning to experiment with new UI concepts and
--- a/finch/gntconv.c	Sun Aug 19 13:09:02 2007 +0000
+++ b/finch/gntconv.c	Sun Aug 19 13:40:34 2007 +0000
@@ -60,6 +60,7 @@
 
 static void finch_write_common(PurpleConversation *conv, const char *who,
 		const char *message, PurpleMessageFlags flags, time_t mtime);
+static void generate_send_to_menu(FinchConv *ggc);
 
 static void
 send_typing_notification(GntWidget *w, FinchConv *ggconv)
@@ -199,10 +200,10 @@
 }
 
 static PurpleConversation *
-find_conv_with_contact(PurpleConversation *conv)
+find_conv_with_contact(PurpleAccount *account, const char *name)
 {
 	PurpleBlistNode *node;
-	PurpleBuddy *buddy = purple_find_buddy(conv->account, conv->name);
+	PurpleBuddy *buddy = purple_find_buddy(account, name);
 	PurpleConversation *ret = NULL;
 
 	if (!buddy)
@@ -272,6 +273,28 @@
 			PURPLE_MESSAGE_SYSTEM, time(NULL));
 }
 
+static void
+buddy_signed_on_off(PurpleBuddy *buddy, gpointer null)
+{
+	PurpleConversation *conv = find_conv_with_contact(buddy->account, buddy->name);
+	if (conv == NULL)
+		return;
+	generate_send_to_menu(conv->ui_data);
+}
+
+static void
+account_signed_on_off(PurpleConnection *gc, gpointer null)
+{
+	GList *ims = purple_get_ims();
+	while (ims) {
+		PurpleConversation *conv = ims->data;
+		PurpleConversation *cc = find_conv_with_contact(conv->account, conv->name);
+		if (cc)
+			generate_send_to_menu(cc->ui_data);
+		ims = ims->next;
+	}
+}
+
 static gpointer
 finch_conv_get_handle()
 {
@@ -339,12 +362,15 @@
 	if (!buds)
 		return;
 
-	item = gnt_menuitem_new(_("Send To"));
-	gnt_menu_add_item(GNT_MENU(menu), item);
+	if ((item = ggc->u.im->sendto) == NULL) {
+		item = gnt_menuitem_new(_("Send To"));
+		gnt_menu_add_item(GNT_MENU(menu), item);
+		ggc->u.im->sendto = item;
+	}
 	sub = gnt_menu_new(GNT_MENU_POPUP);
 	gnt_menuitem_set_submenu(item, GNT_MENU(sub));
 
-	for (; buds; buds = buds->next) {
+	for (; buds; buds = g_slist_delete_link(buds, buds)) {
 		PurpleBlistNode *node = (PurpleBlistNode *)purple_buddy_get_contact((PurpleBuddy *)buds->data);
 		for (node = node->child; node != NULL; node = node->next) {
 			PurpleBuddy *buddy = (PurpleBuddy *)node;
@@ -357,7 +383,7 @@
 			}
 		}
 	}
-	for (list = g_list_last(list); list != NULL; list = list->prev) {
+	for (list = g_list_reverse(list); list != NULL; list = g_list_delete_link(list, list)) {
 		PurplePresence *pre = list->data;
 		PurpleBuddy *buddy = purple_presence_get_buddy(pre);
 		PurpleAccount *account = purple_buddy_get_account(buddy);
@@ -370,8 +396,6 @@
 		g_object_set_data(G_OBJECT(item), "purple_account", account);
 		g_object_set_data_full(G_OBJECT(item), "purple_buddy_name", name, g_free);
 	}
-	g_list_free(list);
-	g_slist_free(buds);
 }
 
 static void
@@ -462,7 +486,7 @@
 	if (ggc)
 		return;
 
-	cc = find_conv_with_contact(conv);
+	cc = find_conv_with_contact(conv->account, conv->name);
 	if (cc && cc->ui_data)
 		ggc = cc->ui_data;
 	else
@@ -504,8 +528,6 @@
 			break;
 	}
 
-	gg_create_menu(ggc);
-
 	ggc->tv = gnt_text_view_new();
 	gnt_widget_set_name(ggc->tv, "conversation-window-textview");
 	gnt_widget_set_size(ggc->tv, purple_prefs_get_int(PREF_ROOT "/size/width"),
@@ -527,6 +549,7 @@
 		g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(create_conv_from_userlist), ggc);
 		gnt_widget_set_visible(tree, purple_prefs_get_bool(PREF_USERLIST));
 	} else {
+		ggc->u.im = g_new0(FinchConvIm, 1);
 		gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv);
 	}
 
@@ -558,6 +581,8 @@
 		g_signal_connect(G_OBJECT(ggc->entry), "text_changed", G_CALLBACK(send_typing_notification), ggc);
 	}
 
+	gg_create_menu(ggc);
+
 	g_free(title);
 	gnt_box_give_focus_to_child(GNT_BOX(ggc->window), ggc->entry);
 	g_signal_connect(G_OBJECT(ggc->window), "gained-focus", G_CALLBACK(gained_focus_cb), ggc);
@@ -1016,6 +1041,14 @@
 					PURPLE_CALLBACK(update_buddy_typing), NULL);
 	purple_signal_connect(purple_conversations_get_handle(), "chat-left", finch_conv_get_handle(),
 					PURPLE_CALLBACK(chat_left_cb), NULL);
+	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", finch_conv_get_handle(),
+					PURPLE_CALLBACK(buddy_signed_on_off), NULL);
+	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_conv_get_handle(),
+					PURPLE_CALLBACK(buddy_signed_on_off), NULL);
+	purple_signal_connect(purple_connections_get_handle(), "signed-on", finch_conv_get_handle(),
+					PURPLE_CALLBACK(account_signed_on_off), NULL);
+	purple_signal_connect(purple_connections_get_handle(), "signed-off", finch_conv_get_handle(),
+					PURPLE_CALLBACK(account_signed_on_off), NULL);
 }
 
 void finch_conversation_uninit()
--- a/finch/gntconv.h	Sun Aug 19 13:09:02 2007 +0000
+++ b/finch/gntconv.h	Sun Aug 19 13:40:34 2007 +0000
@@ -27,6 +27,7 @@
 
 #include <gnt.h>
 #include <gntwidget.h>
+#include <gntmenuitem.h>
 
 #include "conversation.h"
 
@@ -50,7 +51,7 @@
 	GntWidget *window;        /* the container */
 	GntWidget *entry;         /* entry */
 	GntWidget *tv;            /* text-view */
-	GntWidget *menu;          /* future use */
+	GntWidget *menu;
 	GntWidget *info;
 	void *pad;
 
@@ -70,7 +71,7 @@
 
 struct _FinchConvIm
 {
-	void *nothing_for_now;
+	GntMenuItem *sendto;
 	void *something_for_later;
 };
 
--- a/pidgin/gtkconv.c	Sun Aug 19 13:09:02 2007 +0000
+++ b/pidgin/gtkconv.c	Sun Aug 19 13:40:34 2007 +0000
@@ -7805,25 +7805,20 @@
 	if (e->button == 3) {
 		/* Right click was pressed. Popup the Send To menu. */
 		GtkWidget *menu = gtk_menu_new(), *sub;
+		gboolean populated = populate_menu_with_options(menu, gtkconv, TRUE);
 		sub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to));
 
-		if (populate_menu_with_options(menu, gtkconv, TRUE))
-			pidgin_separator(menu);
-		else if (!sub ||
-				!GTK_WIDGET_IS_SENSITIVE(gtkconv->win->menu.send_to)) {
-			gtk_widget_destroy(menu);
-			return FALSE;
-		} else {
-			menu = sub;
-			sub = NULL;
-		}
-
-		if (sub) {
+		if (sub && GTK_WIDGET_IS_SENSITIVE(gtkconv->win->menu.send_to)) {
 			GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("_Send To"));
+			if (populated)
+				pidgin_separator(menu);
 			gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
 			gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), sub);
 			gtk_widget_show(item);
 			gtk_widget_show_all(sub);
+		} else if (!populated) {
+			gtk_widget_destroy(menu);
+			return FALSE;
 		}
 
 		gtk_widget_show_all(menu);
--- a/pidgin/gtkdialogs.c	Sun Aug 19 13:09:02 2007 +0000
+++ b/pidgin/gtkdialogs.c	Sun Aug 19 13:40:34 2007 +0000
@@ -301,7 +301,7 @@
 	context = gtk_widget_get_pango_context(widget);
 	layout = pango_layout_new(context);
 
-	markup = g_strdup_printf("<span foreground=\"#5c3566\">%s</span>", VERSION);
+	markup = g_strdup_printf("<span foreground=\"#FFFFFF\">%s</span>", VERSION);
 	pango_layout_set_font_description(layout, style->font_desc);
 	pango_layout_set_markup(layout, markup, strlen(markup));
 	g_free(markup);
--- a/pidgin/gtkstatusbox.c	Sun Aug 19 13:09:02 2007 +0000
+++ b/pidgin/gtkstatusbox.c	Sun Aug 19 13:40:34 2007 +0000
@@ -788,7 +788,8 @@
 	primitive = purple_savedstatus_get_type(saved_status);
 	if (!status_box->token_status_account && purple_savedstatus_is_transient(saved_status) &&
 		((primitive == PURPLE_STATUS_AVAILABLE) || (primitive == PURPLE_STATUS_AWAY) ||
-		 (primitive == PURPLE_STATUS_INVISIBLE) || (primitive == PURPLE_STATUS_OFFLINE)) &&
+		 (primitive == PURPLE_STATUS_INVISIBLE) || (primitive == PURPLE_STATUS_OFFLINE) ||
+		 (primitive == PURPLE_STATUS_UNAVAILABLE)) &&
 		(!purple_savedstatus_has_substatuses(saved_status)))
 	{
 		index = get_statusbox_index(status_box, saved_status);
@@ -2562,24 +2563,23 @@
 static gint
 get_statusbox_index(PidginStatusBox *box, PurpleSavedStatus *saved_status)
 {
-	gint index;
+	gint index = -1;
 
 	switch (purple_savedstatus_get_type(saved_status))
 	{
-		case PURPLE_STATUS_AVAILABLE:
-			index = 0;
-			break;
+		/* In reverse order */
+		case PURPLE_STATUS_OFFLINE:
+			index++;
+		case PURPLE_STATUS_INVISIBLE:
+			index++;
+		case PURPLE_STATUS_UNAVAILABLE:
+			index++;
 		case PURPLE_STATUS_AWAY:
-			index = 1;
-			break;
-		case PURPLE_STATUS_INVISIBLE:
-			index = 2;
-			break;
-		case PURPLE_STATUS_OFFLINE:
-			index = 3;
+			index++;
+		case PURPLE_STATUS_AVAILABLE:
+			index++;
 			break;
 		default:
-			index = -1;
 			break;
 	}