changeset 16998:2f9e5cde6f97

merge of '493a2b4859d71c992634fcaf587a2df730d6c43d' and 'a819b8c53725b23320edf69c32888cb5a5ffa764'
author Jeffrey Connelly <jaconnel@calpoly.edu>
date Thu, 10 May 2007 03:00:31 +0000
parents 34d9037a228c (current diff) 667a5a24781c (diff)
children e60489559d35 531a4585d437
files
diffstat 28 files changed, 554 insertions(+), 179 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Thu May 10 02:58:35 2007 +0000
+++ b/COPYRIGHT	Thu May 10 03:00:31 2007 +0000
@@ -88,6 +88,7 @@
 Jeramey Crawford
 Michael Culbertson
 Martijn Dekker
+Vinicius Depizzol
 Philip Derrin
 Taso N. Devetzis
 Balwinder Singh Dheeman
--- a/ChangeLog	Thu May 10 02:58:35 2007 +0000
+++ b/ChangeLog	Thu May 10 03:00:31 2007 +0000
@@ -3,14 +3,25 @@
 version 2.0.1 (??/??/????):
 	* Buddy list update speedups when buddy icons are not being
 	  displayed.  (Scott Wolchok)
-	* Custom smileys on MSN can be saved by right-clicking on them.
+	* Fix icons on docklet change status menu to match the status selector
+	* Custom smileys on MSN can be saved by right-clicking on them
+	* Fix a crash deleting a buddy that is in the Buddy List more than once
+	* Compile fixes for Solaris
+	* Fix GTalk formatting when there's a space before/after a */_
+	* Fix Log viewer crash when the filename is not in the expected format
+	* Get User Info now provides immediate feedback, and is updated when the
+	  user information is available
+	* Make the choose buddy icon dialog correctly list the current directory
+	* Fix for buddy icons disappearing
+	* Timestamps are always on in debug output (-d) and Debug Window now
+	* Don't escape html entities in Yahoo! system messages
 
 	Finch:
 	* Userlist in chat windows, which can be turned on or off using
-	  "/users" command.
-	* Menus in the conversation windows.
-	* Improved tab completion support.
-	* Ctrl+c prompts with a dialog before exiting.
+	  "/users" command
+	* Menus in the conversation windows
+	* Improved tab completion support
+	* Ctrl+c prompts with a dialog before exiting
 
 version 2.0.0 (5/3/2007):
 	* The project has new names - libpurple for the core, Pidgin for the
--- a/doc/finch.1.in	Thu May 10 02:58:35 2007 +0000
+++ b/doc/finch.1.in	Thu May 10 03:00:31 2007 +0000
@@ -29,11 +29,12 @@
 
 .SH DESCRIPTION
 .PP
-\fBfinch\fR is a console-based modular messaging client capable of using
-AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, Novell GroupWise, Lotus Sametime,
-Zephyr, Gadu-Gadu, and QQ all at once. It has many common features found in
-other clients, as well as many unique features.  Finch is not endorsed by or
-affiliated with America Online, ICQ, Microsoft, or Yahoo.
+\fBfinch\fR is a console-based modular messaging client based on libpurple
+which is capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC,
+Novell GroupWise, Lotus Sametime, Zephyr, Gadu-Gadu, and QQ all at once. It has
+many common features found in other clients, as well as many unique features.
+Finch is not endorsed by or affiliated with America Online, ICQ, Microsoft, or
+Yahoo.
 
 .SH OPTIONS
 The following options are provided by \fBfinch\fR using the standard GNU
--- a/doc/pidgin.1.in	Thu May 10 02:58:35 2007 +0000
+++ b/doc/pidgin.1.in	Thu May 10 03:00:31 2007 +0000
@@ -28,11 +28,12 @@
 
 .SH DESCRIPTION
 .PP
-Pidgin is a modular messaging client capable of using AIM, MSN, Yahoo!, XMPP,
-ICQ, IRC, SILC, SIP/SIMPLE Novell GroupWise, Lotus Sametime, Bonjour,
-Zephyr, Gadu-Gadu, and QQ all at once.  It has many common features found in
-other clients, as well as many unique features.  Pidgin is not endorsed by or
-affiliated with America Online, ICQ, Microsoft, or Yahoo.
+\fBpidgin\fR is a graphical modular messaging client based on libpurple
+which is capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC,
+Novell GroupWise, Lotus Sametime, Zephyr, Gadu-Gadu, and QQ all at once. It has
+many common features found in other clients, as well as many unique features.
+Finch is not endorsed by or affiliated with America Online, ICQ, Microsoft, or
+Yahoo.
 
 .SH OPTIONS
 The following options are provided by Pidgin using the standard GNU
--- a/finch/gntconv.c	Thu May 10 02:58:35 2007 +0000
+++ b/finch/gntconv.c	Thu May 10 03:00:31 2007 +0000
@@ -303,6 +303,11 @@
 get_info_cb(GntMenuItem *item, gpointer ggconv)
 {
 	FinchConv *ggc = ggconv;
+	PurpleNotifyUserInfo *info = purple_notify_user_info_new();
+	purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving..."));
+	purple_notify_userinfo(ggc->active_conv->account->gc, purple_conversation_get_name(ggc->active_conv), info, NULL, NULL);
+	purple_notify_user_info_destroy(info);
+
 	serv_get_info(purple_conversation_get_gc(ggc->active_conv),
 			purple_conversation_get_name(ggc->active_conv));
 }
--- a/finch/gntdebug.c	Thu May 10 02:58:35 2007 +0000
+++ b/finch/gntdebug.c	Thu May 10 03:00:31 2007 +0000
@@ -43,7 +43,6 @@
 	GntWidget *window;
 	GntWidget *tview;
 	gboolean paused;
-	gboolean timestamps;
 } debug;
 
 static void
@@ -54,14 +53,11 @@
 	{
 		int pos = gnt_text_view_get_lines_below(GNT_TEXT_VIEW(debug.tview));
 		GntTextFormatFlags flag = GNT_TEXT_FLAG_NORMAL;
-
-		if (debug.timestamps) {
-			const char *mdate;
-			time_t mtime = time(NULL);
-			mdate = purple_utf8_strftime("%H:%M:%S ", localtime(&mtime));
-			gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview),
-					mdate, flag);
-		}
+		const char *mdate;
+		time_t mtime = time(NULL);
+		mdate = purple_utf8_strftime("%H:%M:%S ", localtime(&mtime));
+		gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview),
+				mdate, flag);
 
 		gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview),
 				category, GNT_TEXT_FLAG_BOLD);
@@ -137,13 +133,6 @@
 	debug.paused = !debug.paused;
 }
 
-static void
-toggle_timestamps(GntWidget *w, gpointer n)
-{
-	debug.timestamps = !debug.timestamps;
-	purple_prefs_set_bool("/purple/debug/timestamps", debug.timestamps);
-}
-
 /* Xerox */
 static void
 purple_glib_log_handler(const gchar *domain, GLogLevelFlags flags,
@@ -202,7 +191,6 @@
 void finch_debug_window_show()
 {
 	debug.paused = FALSE;
-	debug.timestamps = purple_prefs_get_bool("/purple/debug/timestamps");
 	if (debug.window == NULL)
 	{
 		GntWidget *wid, *box;
@@ -239,12 +227,6 @@
 		GNT_WIDGET_SET_FLAGS(wid, GNT_WIDGET_GROW_Y);
 		gnt_box_add_widget(GNT_BOX(box), wid);
 
-		wid = gnt_check_box_new(_("Timestamps"));
-		gnt_check_box_set_checked(GNT_CHECK_BOX(wid), debug.timestamps);
-		g_signal_connect(G_OBJECT(wid), "toggled", G_CALLBACK(toggle_timestamps), NULL);
-		GNT_WIDGET_SET_FLAGS(wid, GNT_WIDGET_GROW_Y);
-		gnt_box_add_widget(GNT_BOX(box), wid);
-
 		gnt_box_add_widget(GNT_BOX(debug.window), box);
 		GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_GROW_Y);
 
--- a/libpurple/buddyicon.c	Thu May 10 02:58:35 2007 +0000
+++ b/libpurple/buddyicon.c	Thu May 10 03:00:31 2007 +0000
@@ -416,7 +416,7 @@
 			}
 			ref_filename(filename);
 		}
-		else
+		else if (!icon->img)
 		{
 			purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "buddy_icon");
 			purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "icon_checksum");
--- a/libpurple/debug.c	Thu May 10 02:58:35 2007 +0000
+++ b/libpurple/debug.c	Thu May 10 03:00:31 2007 +0000
@@ -61,18 +61,12 @@
 
 	if (debug_enabled) {
 		gchar *ts_s;
-
-		if ((category != NULL) &&
-			(purple_prefs_exists("/purple/debug/timestamps")) &&
-			(purple_prefs_get_bool("/purple/debug/timestamps"))) {
-			const char *mdate;
+		const char *mdate;
+		time_t mtime = time(NULL);
 
-			time_t mtime = time(NULL);
-			mdate = purple_utf8_strftime("%H:%M:%S", localtime(&mtime));
-			ts_s = g_strdup_printf("(%s) ", mdate);
-		} else {
-			ts_s = g_strdup("");
-		}
+
+		mdate = purple_utf8_strftime("%H:%M:%S", localtime(&mtime));
+		ts_s = g_strdup_printf("(%s) ", mdate);
 
 		if (category == NULL)
 			g_print("%s%s", ts_s, arg_s);
@@ -189,11 +183,4 @@
 void
 purple_debug_init(void)
 {
-	purple_prefs_add_none("/purple/debug");
-
-	/*
-	 * This pref is currently used by both the console
-	 * output and the debug window output.
-	 */
-	purple_prefs_add_bool("/purple/debug/timestamps", FALSE);
 }
--- a/libpurple/prefs.c	Thu May 10 02:58:35 2007 +0000
+++ b/libpurple/prefs.c	Thu May 10 03:00:31 2007 +0000
@@ -1355,6 +1355,7 @@
 	purple_prefs_remove("/plugins/core/autorecon/hide_reconnecting_dialog");
 	purple_prefs_remove("/plugins/core/autorecon/restore_state");
 	purple_prefs_remove("/plugins/core/autorecon");
+	purple_prefs_remove("/purple/debug/timestamps");
 
 	/* Convert old sounds while_away pref to new 3-way pref. */
 	if (purple_prefs_exists("/purple/sound/while_away") &&
--- a/libpurple/protocols/jabber/buddy.c	Thu May 10 02:58:35 2007 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Thu May 10 03:00:31 2007 +0000
@@ -1118,6 +1118,24 @@
 	return FALSE;
 }
 
+static gboolean _client_is_blacklisted(JabberBuddyResource *jbr, const char *ns)
+{
+	/* can't be blacklisted if we don't know what you're running yet */
+	if(!jbr->client.name)
+		return FALSE;
+
+	if(!strcmp(ns, "jabber:iq:last")) {
+		if(!strcmp(jbr->client.name, "Trillian")) {
+			if(!strcmp(jbr->client.version, "3.1.0.121")) {
+				/* verified by nwalp 2007/05/09 */
+				return TRUE;
+			}
+		}
+	}
+
+	return FALSE;
+}
+
 static void jabber_buddy_get_info_for_jid(JabberStream *js, const char *jid)
 {
 	JabberIq *iq;
@@ -1175,11 +1193,18 @@
 			jabber_iq_send(iq);
 		}
 
-		iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:last");
-		xmlnode_set_attrib(iq->node, "to", full_jid);
-		jabber_iq_set_callback(iq, jabber_last_parse, jbi);
-		jbi->ids = g_slist_prepend(jbi->ids, g_strdup(iq->id));
-		jabber_iq_send(iq);
+		/* this is to fix the feeling of irritation I get when trying
+		 * to get info on a friend running Trillian, which doesn't
+		 * respont (with an error or otherwise) to jabber:iq:last
+		 * requests.  There are a number of Trillian users in my
+		 * office. */
+		if(!_client_is_blacklisted(jbr, "jabber:iq:last")) {
+			iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:last");
+			xmlnode_set_attrib(iq->node, "to", full_jid);
+			jabber_iq_set_callback(iq, jabber_last_parse, jbi);
+			jbi->ids = g_slist_prepend(jbi->ids, g_strdup(iq->id));
+			jabber_iq_send(iq);
+		}
 
 		g_free(full_jid);
 	}
--- a/libpurple/protocols/jabber/libxmpp.c	Thu May 10 02:58:35 2007 +0000
+++ b/libpurple/protocols/jabber/libxmpp.c	Thu May 10 03:00:31 2007 +0000
@@ -192,7 +192,7 @@
         PurpleAccountOption *option;
 
 	/* Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im */
-        split = purple_account_user_split_new(_("Domain"), "gmail.com", '@');
+        split = purple_account_user_split_new(_("Domain"), NULL, '@');
         prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
 
         split = purple_account_user_split_new(_("Resource"), "Home", '/');
--- a/libpurple/protocols/yahoo/yahoo.c	Thu May 10 02:58:35 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo.c	Thu May 10 03:00:31 2007 +0000
@@ -906,7 +906,7 @@
 static void yahoo_process_sysmessage(PurpleConnection *gc, struct yahoo_packet *pkt)
 {
 	GSList *l = pkt->hash;
-	char *prim, *me = NULL, *msg = NULL, *escmsg = NULL;
+	char *prim, *me = NULL, *msg = NULL;
 
 	while (l) {
 		struct yahoo_pair *pair = l->data;
@@ -922,14 +922,10 @@
 	if (!msg || !g_utf8_validate(msg, -1, NULL))
 		return;
 
-	/* TODO: Does this really need to be escaped?  It seems like it doesn't. */
-	escmsg = g_markup_escape_text(msg, -1);
-
 	prim = g_strdup_printf(_("Yahoo! system message for %s:"),
 	                       me?me:purple_connection_get_display_name(gc));
-	purple_notify_info(NULL, NULL, prim, escmsg);
+	purple_notify_info(NULL, NULL, prim, msg);
 	g_free(prim);
-	g_free(escmsg);
 }
 
 struct yahoo_add_request {
--- a/pidgin/gtkaccount.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/gtkaccount.c	Thu May 10 03:00:31 2007 +0000
@@ -385,12 +385,20 @@
 add_login_options(AccountPrefsDialog *dialog, GtkWidget *parent)
 {
 	GtkWidget *frame;
+	GtkWidget *hbox;
 	GtkWidget *vbox;
 	GtkWidget *entry;
 	GList *user_splits;
 	GList *l, *l2;
 	char *username = NULL;
 
+	if (dialog->protocol_menu != NULL)
+	{
+		gtk_widget_ref(dialog->protocol_menu);
+		hbox = g_object_get_data(G_OBJECT(dialog->protocol_menu), "container");
+		gtk_container_remove(GTK_CONTAINER(hbox), dialog->protocol_menu);
+	}
+
 	if (dialog->login_frame != NULL)
 		gtk_widget_destroy(dialog->login_frame);
 
@@ -409,10 +417,17 @@
 	gtk_widget_show(vbox);
 
 	/* Protocol */
-	dialog->protocol_menu = pidgin_protocol_option_menu_new(
-			dialog->protocol_id, G_CALLBACK(set_account_protocol_cb), dialog);
-
-	add_pref_box(dialog, vbox, _("Protocol:"), dialog->protocol_menu);
+	if (dialog->protocol_menu == NULL)
+	{
+		dialog->protocol_menu = pidgin_protocol_option_menu_new(
+				dialog->protocol_id, G_CALLBACK(set_account_protocol_cb), dialog);
+		gtk_widget_ref(dialog->protocol_menu);
+	}
+
+	hbox = add_pref_box(dialog, vbox, _("Protocol:"), dialog->protocol_menu);
+	g_object_set_data(G_OBJECT(dialog->protocol_menu), "container", hbox);
+
+	gtk_widget_unref(dialog->protocol_menu);
 
 	/* Screen name */
 	dialog->screenname_entry = gtk_entry_new();
--- a/pidgin/gtkblist.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/gtkblist.c	Thu May 10 03:00:31 2007 +0000
@@ -274,6 +274,11 @@
 
 static void gtk_blist_menu_info_cb(GtkWidget *w, PurpleBuddy *b)
 {
+	PurpleNotifyUserInfo *info = purple_notify_user_info_new();
+	purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving..."));
+	purple_notify_userinfo(b->account->gc, purple_buddy_get_name(b), info, NULL, NULL);
+	purple_notify_user_info_destroy(info);
+
 	serv_get_info(b->account->gc, b->name);
 }
 
--- a/pidgin/gtkconv.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/gtkconv.c	Thu May 10 03:00:31 2007 +0000
@@ -672,6 +672,11 @@
 	PurpleConversation *conv = gtkconv->active_conv;
 
 	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
+		PurpleNotifyUserInfo *info = purple_notify_user_info_new();
+		purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving..."));
+		purple_notify_userinfo(conv->account->gc, purple_conversation_get_name(conv), info, NULL, NULL);
+		purple_notify_user_info_destroy(info);
+
 		serv_get_info(purple_conversation_get_gc(conv),
 					  purple_conversation_get_name(conv));
 
@@ -3111,7 +3116,7 @@
 	}
 	if (gtkwin->menu.typing_icon == NULL) {
 		 gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
- 		 pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray),
+		 pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray),
                                                                   gtkwin->menu.typing_icon,
                                                                   _("User is typing..."));
 	} else {
@@ -3143,8 +3148,10 @@
 		return;
 
 	if (purple_conv_im_get_typing_state(im) == PURPLE_NOT_TYPING) {
-		if (gtkconv->u.im->typing_timer != 0)
+		if (gtkconv->u.im->typing_timer != 0) {
 			g_source_remove(gtkconv->u.im->typing_timer);
+			gtkconv->u.im->typing_timer = 0;
+		}
 		return;
 	}
 
--- a/pidgin/gtkdebug.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/gtkdebug.c	Thu May 10 03:00:31 2007 +0000
@@ -49,7 +49,6 @@
 
 	GtkListStore *store;
 
-	gboolean timestamps;
 	gboolean paused;
 
 #ifdef HAVE_REGEX_H
@@ -261,21 +260,6 @@
 #endif /* HAVE_REGEX_H */
 }
 
-static void
-timestamps_cb(GtkWidget *w, DebugWindow *win)
-{
-	win->timestamps = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
-
-	purple_prefs_set_bool("/purple/debug/timestamps", win->timestamps);
-}
-
-static void
-timestamps_pref_cb(const char *name, PurplePrefType type,
-				   gconstpointer value, gpointer data)
-{
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data), GPOINTER_TO_INT(value));
-}
-
 /******************************************************************************
  * regex stuff
  *****************************************************************************/
@@ -691,7 +675,6 @@
 	GtkWidget *vbox;
 	GtkWidget *toolbar;
 	GtkWidget *frame;
-	GtkWidget *button;
 	GtkWidget *image;
 	gint width, height;
 	void *handle;
@@ -779,20 +762,6 @@
 		                                    NULL, image,
 		                                    G_CALLBACK(pause_cb), win);
 
-		/* Timestamps */
-		button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
-		                                    GTK_TOOLBAR_CHILD_TOGGLEBUTTON,
-		                                    NULL, _("Timestamps"),
-		                                    _("Timestamps"), NULL, NULL,
-		                                    G_CALLBACK(timestamps_cb),
-		                                    win);
-
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
-		                             purple_prefs_get_bool("/purple/debug/timestamps"));
-
-		purple_prefs_connect_callback(handle, "/purple/debug/timestamps",
-		                            timestamps_pref_cb, button);
-
 #ifdef HAVE_REGEX_H
 		/* regex stuff */
 		gtk_toolbar_insert_space(GTK_TOOLBAR(toolbar), -1);
@@ -1044,9 +1013,10 @@
 #ifdef HAVE_REGEX_H
 	GtkTreeIter iter;
 #endif /* HAVE_REGEX_H */
-	gboolean timestamps;
 	gchar *ts_s;
 	gchar *esc_s, *cat_s, *tmp, *s;
+	const char *mdate;
+	time_t mtime;
 
 	if (debug_win == NULL ||
 		!purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/enabled"))
@@ -1054,22 +1024,9 @@
 		return;
 	}
 
-	timestamps = purple_prefs_get_bool("/purple/debug/timestamps");
-
-	/*
-	 * For some reason we only print the timestamp if category is
-	 * not NULL.  Why the hell do we do that?  --Mark
-	 */
-	if ((category != NULL) && (timestamps)) {
-		const char *mdate;
-
-		time_t mtime = time(NULL);
-		mdate = purple_utf8_strftime("%H:%M:%S", localtime(&mtime));
-		ts_s = g_strdup_printf("(%s) ", mdate);
-	} else {
-		ts_s = g_strdup("");
-	}
-
+	mtime = time(NULL);
+	mdate = purple_utf8_strftime("%H:%M:%S", localtime(&mtime));
+	ts_s = g_strdup_printf("(%s) ", mdate);
 	if (category == NULL)
 		cat_s = g_strdup("");
 	else
--- a/pidgin/gtkdialogs.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/gtkdialogs.c	Thu May 10 03:00:31 2007 +0000
@@ -362,7 +362,8 @@
 	str = g_string_sized_new(4096);
 
 	g_string_append_printf(str,
-		_("%s is a modular messaging client capable of using "
+		_("%s is a graphical modular messaging client based on "
+		  "libpurple which is capable of connecting to "
 		  "AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, "
 		  "Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, "
 		  "Gadu-Gadu, and QQ all at once.  "
--- a/pidgin/gtknotify.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/gtknotify.c	Thu May 10 03:00:31 2007 +0000
@@ -549,6 +549,21 @@
 	return FALSE;
 }
 
+static GtkIMHtmlOptions
+notify_imhtml_options()
+{
+	GtkIMHtmlOptions options = 0;
+
+	if (!purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_incoming_formatting"))
+		options |= GTK_IMHTML_NO_COLOURS | GTK_IMHTML_NO_FONTS | GTK_IMHTML_NO_SIZES;
+
+	options |= GTK_IMHTML_NO_COMMENTS;
+	options |= GTK_IMHTML_NO_TITLE;
+	options |= GTK_IMHTML_NO_NEWLINE;
+	options |= GTK_IMHTML_NO_SCROLL;
+	return options;
+}
+
 static void *
 pidgin_notify_formatted(const char *title, const char *primary,
 						  const char *secondary, const char *text)
@@ -559,7 +574,6 @@
 	GtkWidget *button;
 	GtkWidget *imhtml;
 	GtkWidget *frame;
-	int options = 0;
 	char label_text[2048];
 	char *linked_text, *primary_esc, *secondary_esc;
 
@@ -614,20 +628,13 @@
 	g_signal_connect(G_OBJECT(window), "key_press_event",
 					 G_CALLBACK(formatted_input_cb), NULL);
 
-	/* Add the text to the gtkimhtml */
-	if (!purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_incoming_formatting"))
-		options |= GTK_IMHTML_NO_COLOURS | GTK_IMHTML_NO_FONTS | GTK_IMHTML_NO_SIZES;
-
-	options |= GTK_IMHTML_NO_COMMENTS;
-	options |= GTK_IMHTML_NO_TITLE;
-	options |= GTK_IMHTML_NO_NEWLINE;
-	options |= GTK_IMHTML_NO_SCROLL;
-
 	/* Make sure URLs are clickable */
 	linked_text = purple_markup_linkify(text);
-	gtk_imhtml_append_text(GTK_IMHTML(imhtml), linked_text, options);
+	gtk_imhtml_append_text(GTK_IMHTML(imhtml), linked_text, notify_imhtml_options());
 	g_free(linked_text);
 
+	g_object_set_data(G_OBJECT(window), "info-widget", imhtml);
+
 	/* Show the window */
 	gtk_widget_show(window);
 
@@ -856,18 +863,53 @@
 	return data;
 }
 
+/** Xerox'ed from Finch! How the tables have turned!! ;) **/
+/** User information. **/
+static GHashTable *userinfo;
+
+static char *
+userinfo_hash(PurpleAccount *account, const char *who)
+{
+	char key[256];
+	snprintf(key, sizeof(key), "%s - %s", purple_account_get_username(account), purple_normalize(account, who));
+	return g_utf8_strup(key, -1);
+}
+
+static void
+remove_userinfo(GtkWidget *widget, gpointer key)
+{
+	g_hash_table_remove(userinfo, key);
+}
+
 static void *
 pidgin_notify_userinfo(PurpleConnection *gc, const char *who,
 						 PurpleNotifyUserInfo *user_info)
 {
-	char *primary, *info;
+	char *info;
 	void *ui_handle;
+	char *key = userinfo_hash(purple_connection_get_account(gc), who);
+
+	if (!userinfo) {
+		userinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	}
 
-	primary = g_strdup_printf(_("Info for %s"), who);
 	info = purple_notify_user_info_get_text_with_newline(user_info, "<br />");
-	ui_handle = pidgin_notify_formatted(_("Buddy Information"), primary, NULL, info);
+	ui_handle = g_hash_table_lookup(userinfo, key);
+	if (ui_handle != NULL) {
+		GtkIMHtml *imhtml = g_object_get_data(G_OBJECT(ui_handle), "info-widget");
+		char *linked_text = purple_markup_linkify(info);
+		gtk_imhtml_clear(imhtml);
+		gtk_imhtml_append_text(imhtml, linked_text, notify_imhtml_options());
+		g_free(linked_text);
+		g_free(key);
+	} else {
+		char *primary = g_strdup_printf(_("Info for %s"), who);
+		ui_handle = pidgin_notify_formatted(_("Buddy Information"), primary, NULL, info);
+		g_hash_table_insert(userinfo, key, ui_handle);
+		g_signal_connect(G_OBJECT(ui_handle), "destroy", G_CALLBACK(remove_userinfo), key);
+		g_free(primary);
+	}
 	g_free(info);
-	g_free(primary);
 	return ui_handle;
 }
 
--- a/pidgin/gtkutils.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/gtkutils.c	Thu May 10 03:00:31 2007 +0000
@@ -103,17 +103,17 @@
 	if (purple_running_gnome()) {
 		char *path, *font;
 		PangoFontDescription *desc = NULL;
-				
+
 		if ((path = g_find_program_in_path("gconftool-2"))) {
 			g_free(path);
 			if (!g_spawn_command_line_sync(
-					"gconftool-2 -g /desktop/gnome/interface/document_font_name", 
+					"gconftool-2 -g /desktop/gnome/interface/document_font_name",
 					&font, NULL, NULL, NULL))
 				return;
 		}
 		desc = pango_font_description_from_string(font);
 		g_free(font);
-		
+
 		if (desc) {
 			gtk_widget_modify_font(imhtml, desc);
 			pango_font_description_free(desc);
@@ -444,13 +444,13 @@
 	protocol = g_object_get_data(G_OBJECT(item), "protocol");
 
 	if (!strcmp(protocol, "prpl-fake"))
-	{
-		guint index = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(item), "real_index"));
-		gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), index);
+		protocol = g_object_get_data(G_OBJECT(item), "real_protocol");
+
+	if (!strcmp(protocol, g_object_get_data(G_OBJECT(optmenu), "last_protocol")))
 		return;
-	}
 
 	user_data = (g_object_get_data(G_OBJECT(optmenu), "user_data"));
+	g_object_set_data(G_OBJECT(optmenu), "last_protocol", (gpointer)protocol);
 
 	if (cb != NULL)
 		((void (*)(GtkWidget *, const char *, gpointer))cb)(item, protocol,
@@ -545,18 +545,33 @@
 		pidgin_protocol_option_menu_item(menu, sg, image, plugin->info->name, plugin->info->id);
 
 		if (id != NULL && !strcmp(plugin->info->id, id))
+		{
+			g_object_set_data(G_OBJECT(optmenu), "last_protocol", plugin->info->id);
 			selected_index = i;
+		}
+		else if (i == 0)
+		{
+			/* Ensure we set the protocol even if id is NULL or can't be found. */
+			g_object_set_data(G_OBJECT(optmenu), "last_protocol", plugin->info->id);
+		}
 
 		if (!strcmp(plugin->info->id, "prpl-jabber"))
 		{
 			GtkWidget *gtalk_item;
+
+			filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
+			                            "16", "google-talk.png", NULL);
+			pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
+			g_free(filename);
+
+
 			if (pixbuf)
 				image = gtk_image_new_from_pixbuf(pixbuf);
 			else
 				image = gtk_image_new();
 
-			gtalk_item = pidgin_protocol_option_menu_item(menu, sg, image, _("Google Talk (XMPP)"), "prpl-fake");
-			g_object_set_data(G_OBJECT(gtalk_item), "real_index", GUINT_TO_POINTER(i));
+			gtalk_item = pidgin_protocol_option_menu_item(menu, sg, image, _("Google Talk"), "prpl-fake");
+			g_object_set_data(G_OBJECT(gtalk_item), "real_protocol", plugin->info->id);
 			i++;
 		}
 
@@ -2308,20 +2323,10 @@
 		GTK_FILE_SELECTION(dialog->icon_filesel)));
 #endif /* FILECHOOSER */
 
-	if (!filename || g_stat(filename, &st))
+	if (!filename || g_stat(filename, &st) || !(pixbuf = gdk_pixbuf_new_from_file(filename, NULL)))
 	{
-		g_free(filename);
-		return;
-	}
-
-	pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
-	if (!pixbuf) {
 		gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_preview), NULL);
 		gtk_label_set_markup(GTK_LABEL(dialog->icon_text), "");
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
-		gtk_file_chooser_set_preview_widget_active(
-					GTK_FILE_CHOOSER(dialog->icon_filesel), FALSE);
-#endif /* FILECHOOSER */
 		g_free(filename);
 		return;
 	}
@@ -2338,10 +2343,6 @@
 	scale = gdk_pixbuf_scale_simple(pixbuf, width * 50 / height,
 									50, GDK_INTERP_BILINEAR);
 	gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_preview), scale);
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
-	gtk_file_chooser_set_preview_widget_active(
-					GTK_FILE_CHOOSER(dialog->icon_filesel), TRUE);
-#endif /* FILECHOOSER */
 	gtk_label_set_markup(GTK_LABEL(dialog->icon_text), markup);
 
 	g_object_unref(G_OBJECT(pixbuf));
@@ -2356,7 +2357,9 @@
 GtkWidget *pidgin_buddy_icon_chooser_new(GtkWindow *parent, void(*callback)(const char *, gpointer), gpointer data) {
 	struct _icon_chooser *dialog = g_new0(struct _icon_chooser, 1);
 
-#if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
+#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
+	GtkWidget *vbox;
+#else
 	GtkWidget *hbox;
 	GtkWidget *tv;
 	GtkTreeSelection *sel;
@@ -2387,9 +2390,17 @@
 
 	dialog->icon_preview = gtk_image_new();
 	dialog->icon_text = gtk_label_new(NULL);
-	gtk_widget_set_size_request(GTK_WIDGET(dialog->icon_preview), -1, 50);
-	gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog->icon_filesel),
-					    GTK_WIDGET(dialog->icon_preview));
+
+	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
+	gtk_widget_set_size_request(GTK_WIDGET(vbox), -1, 50);
+	gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(dialog->icon_preview), TRUE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), GTK_WIDGET(dialog->icon_text), FALSE, FALSE, 0);
+	gtk_widget_show_all(vbox);
+
+	gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog->icon_filesel), vbox);
+	gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog->icon_filesel), TRUE);
+	gtk_file_chooser_set_use_preview_label(GTK_FILE_CHOOSER(dialog->icon_filesel), FALSE);
+
 	g_signal_connect(G_OBJECT(dialog->icon_filesel), "update-preview",
 					 G_CALLBACK(icon_preview_change_cb), dialog);
 	g_signal_connect(G_OBJECT(dialog->icon_filesel), "response",
@@ -2403,7 +2414,7 @@
 		gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog->icon_filesel),
 										current_folder);
 
-	gtk_widget_set_size_request(GTK_WIDGET(dialog->icon_preview), -1, 50);
+	gtk_widget_set_size_request(GTK_WIDGET(dialog->icon_preview),-1, 50);
 	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
 	gtk_box_pack_start(
 		GTK_BOX(GTK_FILE_SELECTION(dialog->icon_filesel)->main_vbox),
--- a/pidgin/pixmaps/emotes/default/22/theme	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/pixmaps/emotes/default/22/theme	Thu May 10 03:00:31 2007 +0000
@@ -21,7 +21,7 @@
 moneymouth.png      :-$
 foot-in-mouth.png   :-!
 shout.png           >:o     >:O
-! skywalker.png     C:-) c:-) C:) c:)
+! skywalker.png     C:-)    c:-)    C:)     c:)
 ! monkey.png        :-(|)
 
 ### Following AIM 6.1
@@ -42,6 +42,8 @@
 crying.png          :'(
 shut-mouth.png      :-X
 glasses-cool.png    8-)
+! skywalker.png     C:-)    c:-)    C:)     c:)
+! monkey.png        :-(|)
 
 ### Following Windows Live Messenger 8.1
 [MSN]
@@ -121,6 +123,14 @@
 eyeroll.png         8-)
 yawn.png            |-) 
 goat.png            (nah)
+! skywalker.png     C:-)    c:-)    C:)     c:)
+! monkey.png        :-(|)
+
+### Hidden MSN emotes
+sigarette.png      	(ci)    (CI)
+handcuffs.png       (%)
+console.png			(xx)    (XX)
+fingers-crossed.png	(yn)    (YN)
 
 ### Following QQ 2006
 [QQ]
@@ -217,6 +227,8 @@
 star.png            /星星   /<*>     /xixing   /star
 girl.png            /女     /<00>    /nv       /woman
 boy.png             /ç”·     /<11>    /nan      /man
+! skywalker.png     C:-)    c:-)    C:)     c:)
+! monkey.png        :-(|)
 
 ### Following ICQ 5.1
 [ICQ]
@@ -248,6 +260,8 @@
 good.png            *THUMBS\ UP*
 beer.png            *DRINK*
 in-love.png         *IN\ LOVE*
+! skywalker.png     C:-)    c:-)    C:)     c:)
+! monkey.png        :-(|)
 
 ### Following Yahoo! Messenger 8.1
 [Yahoo]
@@ -294,7 +308,7 @@
 eyeroll.png         8-|
 silly.png           8-}
 clap.png            =D>     =d>
-#phbbbt             >:P     >:p     MISSING/YAHOO 6: "You are dumb! - No you are!!" => tongue on pissed of smily
+mad-tongue.png      >:P     >:p
 #timeout            :-t     :-T     MISSING: "Let's have a break."
 hug-left.png        >:D<    >:d<
 love-over.png       =((
@@ -302,8 +316,13 @@
 rotfl.png           =))    
 #loser              L-)     l-)     MISSING/YAHOO 6: "Loser!"
 party.png           <:-P    <:-p
+nailbiting.png      :-SS	:-Ss	:-sS	:-ss
 cowboy.png          <):)
 desire.png          8->
+! skywalker.png     C:-)    c:-)    C:)     c:)
+! monkey.png        :-(|)
+
+### Hidden Yahoo emotes
 alien.png           =:)     >-)
 beat-up.png         b-(     B-(
 chicken.png         ~:>
@@ -324,17 +343,16 @@
 flag.png            **==
 clover.png          %%-
 musical-note.png    :-"
-nailbiting.png      :-SS    :-ss
 giggle.png          ;))
 worship.png         ^:)^
 star.png            (*)
-mad-tongue.png      >:p
-#yahoo_waving.gif        >:/             TODO
-#yahoo_talktohand.gif    :-@             TODO
-#yahoo_youkiddingme.gif  :-j     :-J     TODO
+#waving.png         >:/
+#talktohand.png     :-@
+#youkiddingme.png   :-j :-J
 
 ### These only work in a certain IMvironment
-#yahoo_malefighter1.gif o->     O->
-#yahoo_malefighter2.gif o=>     O=>
-#yahoo_femalefighter.gif o-+     O-+
+#malefighter1.png   o->     O->
+#malefighter2.png   o=>     O=>
+#femalefighter.png  o-+     O-+
 yin-yang.png        (%)
+
--- a/pidgin/pixmaps/protocols/16/Makefile.am	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/pixmaps/protocols/16/Makefile.am	Thu May 10 03:00:31 2007 +0000
@@ -3,6 +3,7 @@
 EXTRA_DIST =	aim.png \
 		bonjour.png \
 		gadu-gadu.png \
+		google-talk.png \
 		novell.png \
 		icq.png \
 		irc.png \
Binary file pidgin/pixmaps/protocols/16/google-talk.png has changed
--- a/pidgin/pixmaps/protocols/22/Makefile.am	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/pixmaps/protocols/22/Makefile.am	Thu May 10 03:00:31 2007 +0000
@@ -3,6 +3,7 @@
 EXTRA_DIST =	aim.png \
 		bonjour.png \
 		gadu-gadu.png \
+		google-talk.png \
 		novell.png \
 		icq.png \
 		irc.png \
Binary file pidgin/pixmaps/protocols/22/google-talk.png has changed
--- a/pidgin/pixmaps/protocols/48/scalable/Makefile.am	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/pixmaps/protocols/48/scalable/Makefile.am	Thu May 10 03:00:31 2007 +0000
@@ -1,6 +1,7 @@
 EXTRA_DIST = 	aim.svg \
 		bonjour.svg \
 		gadu-gadu.svg \
+		google-talk.svg \
 		novell.svg \
 		icq.svg \
 		irc.svg \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/protocols/48/scalable/google-talk.svg	Thu May 10 03:00:31 2007 +0000
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2417"
+   sodipodi:version="0.32"
+   inkscape:version="0.43"
+   width="48"
+   height="48"
+   version="1.0"
+   sodipodi:docbase="/home/vinicius/tango-icon-theme-code/protocols/scalable"
+   sodipodi:docname="google-talk.svg"
+   inkscape:export-filename="/home/vinicius/tango-icon-theme-code/protocols/48x48/google-talk.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata2422">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Google Talk Icon</dc:title>
+        <dc:date>2006-12-03</dc:date>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Vinicius Scopel Depizzol</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>vdepizzol@gmail.com</dc:source>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Google Talk</rdf:li>
+            <rdf:li>GTalk</rdf:li>
+            <rdf:li>VOIP</rdf:li>
+            <rdf:li>Protocol</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Notice" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Attribution" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs2420">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6020">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop6022" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop6024" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3299">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.11764706;"
+         offset="0"
+         id="stop3301" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3303" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3299"
+       id="radialGradient3305"
+       cx="15.993708"
+       cy="26.722889"
+       fx="15.993708"
+       fy="26.722889"
+       r="15.912521"
+       gradientTransform="matrix(1,0,0,0.295918,-3.769888e-16,18.8151)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3527">
+      <stop
+         style="stop-color:#90ba1f;stop-opacity:1;"
+         offset="0"
+         id="stop3529" />
+      <stop
+         style="stop-color:#638205;stop-opacity:1;"
+         offset="1"
+         id="stop3531" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3518">
+      <stop
+         style="stop-color:#e7d000;stop-opacity:1;"
+         offset="0"
+         id="stop3520" />
+      <stop
+         style="stop-color:#c4a000;stop-opacity:1;"
+         offset="1"
+         id="stop3522" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3486">
+      <stop
+         style="stop-color:#ef2929;stop-opacity:1;"
+         offset="0"
+         id="stop3488" />
+      <stop
+         style="stop-color:#cc0000;stop-opacity:1;"
+         offset="1"
+         id="stop3490" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3510">
+      <stop
+         style="stop-color:#3465a4;stop-opacity:1;"
+         offset="0"
+         id="stop3512" />
+      <stop
+         style="stop-color:#204a87;stop-opacity:1;"
+         offset="1"
+         id="stop3514" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3286">
+      <stop
+         style="stop-color:#d1d1d1;stop-opacity:1;"
+         offset="0"
+         id="stop3288" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3290" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3527"
+       id="linearGradient4249"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.465389,0,0,2.513895,-105.5963,47.11115)"
+       x1="55.483334"
+       y1="-14.40625"
+       x2="55.483334"
+       y2="-7.9999866" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3518"
+       id="linearGradient4252"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.901968,0,0,2.518653,-127.7063,47.25387)"
+       x1="53.162479"
+       y1="-14.322747"
+       x2="53.162479"
+       y2="-9.9868765" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3486"
+       id="linearGradient4255"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.48585,0,0,2.48585,-103.0483,47.16833)"
+       x1="49.45462"
+       y1="-12.934268"
+       x2="49.45462"
+       y2="-8.0529032" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3510"
+       id="linearGradient4258"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.48585,0,0,2.48585,-100.3774,47.19573)"
+       x1="45.5"
+       y1="-14"
+       x2="45.5"
+       y2="-8.1156492" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3286"
+       id="linearGradient4262"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.99378,0,0,2.99378,9.552849e-2,-0.965622)"
+       x1="8"
+       y1="15"
+       x2="8"
+       y2="0.9916327" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6020"
+       id="linearGradient6026"
+       x1="11.466431"
+       y1="11.008693"
+       x2="11.466431"
+       y2="15.000141"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6020"
+       id="linearGradient6030"
+       gradientUnits="userSpaceOnUse"
+       x1="11.466431"
+       y1="11.008693"
+       x2="11.466431"
+       y2="15.000141"
+       gradientTransform="matrix(1,0,0,1.75,0,-1.25)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3286"
+       id="linearGradient6052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.99378,0,0,2.99378,-59.90447,-0.965622)"
+       x1="8"
+       y1="15"
+       x2="8"
+       y2="0.9916327" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-height="714"
+     inkscape:window-width="1014"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     borderopacity="1"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:zoom="1"
+     inkscape:cx="27.558407"
+     inkscape:cy="20.353863"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:current-layer="svg2417"
+     showborder="false"
+     inkscape:showpageshadow="false" />
+  <path
+     sodipodi:type="arc"
+     style="opacity:1;fill:url(#radialGradient3305);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     id="path2424"
+     sodipodi:cx="15.993708"
+     sodipodi:cy="26.722889"
+     sodipodi:rx="15.912521"
+     sodipodi:ry="4.7088075"
+     d="M 31.906229,26.722889 A 15.912521,4.7088075 0 1 1 31.906148,26.707864"
+     sodipodi:start="0"
+     sodipodi:end="6.2799944"
+     sodipodi:open="true"
+     transform="matrix(1.45896,0,0,1.538545,0.742037,-1.869655)" />
+  <path
+     id="path3264"
+     d="M 21.80045,3.5250496 C 10.471905,4.3704822 1.592428,11.452408 1.592428,19.990844 C 1.592428,26.29506 6.3896918,31.807945 13.473996,34.585527 C 13.301077,37.113716 12.611393,40.274075 10.57377,42.444203 C 16.402876,42.263357 20.689781,39.28536 23.484452,36.456639 C 23.677129,36.460226 23.851935,36.456639 24.045787,36.456639 C 36.451938,36.456639 46.499142,29.098509 46.499142,19.990844 L 46.499142,19.897289 C 46.459634,10.808172 36.426737,3.5250496 24.045787,3.5250496 C 23.270404,3.5250496 22.555687,3.4686875 21.80045,3.5250496 z "
+     style="fill:url(#linearGradient4262);fill-opacity:1;fill-rule:nonzero;stroke:#797979;stroke-width:0.99999946;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90" />
+  <path
+     sodipodi:nodetypes="ccccccccccccccccc"
+     id="path3552"
+     d="M 14.063569,10.992619 L 10.975162,10.992619 L 10.975162,15.008301 L 9,15.008301 L 9,18.010155 L 10.975162,18.010155 L 10.975162,24.823081 C 10.975162,28.316382 16.413217,26.749332 16.906897,25.946127 L 16.765885,23.742745 C 16.14428,24.364355 14.063569,24.882059 14.063569,24.09267 L 14.063569,18.010155 L 16.089796,18.010155 L 16.089796,15.008301 L 14.063569,15.008301 L 14.063569,11.090553 L 14.063569,11.090553 L 14.063569,10.992619 z "
+     style="fill:url(#linearGradient4258);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:url(#linearGradient4255);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 20.513467,15.031036 C 20.138171,15.089956 19.656414,15.165467 19.228078,15.318859 C 17.702481,15.865192 16.671718,16.778263 16.671718,16.778263 L 17.928902,19.157272 C 19.392632,18.022338 22.111019,16.595753 21.828421,20.24551 C 16.134551,19.714196 14.746648,23.348506 16.160515,25.369297 C 17.612211,27.444158 20.173876,27.641863 21.329645,26.185476 C 21.514145,25.952987 21.740964,25.678231 21.873764,25.369297 C 22.016347,25.75349 22.226874,26.072865 22.417883,26.321505 C 22.574471,26.517581 23.312178,27.152657 24.004897,27.137684 C 24.806193,27.120365 25.583813,26.58185 26,25.958759 C 25.645136,26.22137 24.252362,25.650216 24.231613,24.779835 L 24.231613,18.29575 C 24.142462,16.667478 22.425687,14.730825 20.513467,15.031036 z M 21.193616,23.328851 C 21.034551,24.122851 19.396586,24.681233 18.790423,24.326402 C 17.894487,23.801947 19.229645,22.393776 20.377437,22.376643 C 21.417389,22.361119 21.33274,22.634384 21.193616,23.328851 z "
+     id="path3554"
+     sodipodi:nodetypes="cscccsscsscccccsss" />
+  <path
+     id="path3558"
+     d="M 29,11 L 26.098032,11 L 26.098032,27.104637 L 29,27.104637 L 29,11 z "
+     style="fill:url(#linearGradient4252);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     sodipodi:nodetypes="ccccccccccccc"
+     id="path3560"
+     d="M 30,10.895363 L 30,19.851112 L 30,27 L 32.963722,27 L 32.963722,22.924045 L 36.561805,27.064163 L 38.705904,25.193137 L 34.676855,20.715264 L 38.705904,16.23739 L 36.754295,14.238037 L 32.968278,18.187047 C 32.968278,18.187047 32.963722,10.895363 32.963722,10.895363 L 30,10.895363 z "
+     style="fill:url(#linearGradient4249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+     d="M 21.84375,4.03125 C 16.273135,4.4469767 11.295199,6.3799921 7.75,9.25 C 4.204801,12.120008 2.09375,15.904106 2.09375,20 C 2.093752,26.050562 6.709849,31.401486 13.65625,34.125 C 13.889662,34.247612 13.966606,34.430582 13.96875,34.625 C 13.8154,36.867085 13.233839,39.586592 11.6875,41.78125 C 16.756159,41.27394 20.580438,38.669315 23.125,36.09375 C 23.324492,35.928053 23.831229,35.96875 24.03125,35.96875 C 30.135475,35.96875 35.660367,34.1562 39.625,31.25 C 43.589633,28.3438 46,24.369973 46,20 L 46,19.90625 C 45.981043,15.545078 43.55655,11.604324 39.59375,8.71875 C 35.63095,5.8331761 30.123683,4.03125 24.03125,4.03125 C 23.381564,4.0312499 22.681539,3.982177 21.84375,4.03125 z M 24.03125,5.03125 C 29.927599,5.03125 35.264412,6.757119 39.03125,9.5 C 42.798088,12.242881 44.982638,15.911852 45,19.90625 L 45,20 C 45,24.002253 42.800008,27.674883 39.03125,30.4375 C 35.262492,33.200117 29.937773,34.96875 24.03125,34.96875 C 23.079654,34.946683 22.695929,35.117383 22.40625,35.40625 C 20.316957,37.520999 17.387178,39.593629 13.59375,40.46875 C 14.470139,38.520138 14.848653,36.443413 14.96875,34.6875 C 15.010593,33.903846 14.715478,33.607465 14.03125,33.1875 C 7.360656,30.572123 3.093751,25.543254 3.09375,20 C 3.09375,16.250753 5.042528,12.754344 8.40625,10.03125 C 11.769972,7.3081563 16.52295,5.4329977 21.90625,5.03125 C 22.667268,4.9737265 23.342191,5.0312499 24.03125,5.03125 z "
+     id="path6054"
+     sodipodi:nodetypes="csscccccsccssccsccscscccsscs" />
+</svg>
--- a/pidgin/plugins/extplacement.c	Thu May 10 02:58:35 2007 +0000
+++ b/pidgin/plugins/extplacement.c	Thu May 10 03:00:31 2007 +0000
@@ -101,6 +101,11 @@
 	ppref = purple_plugin_pref_new_with_label(_("Conversation Placement"));
 	purple_plugin_pref_frame_add(frame, ppref);
 
+	/* Translators: "New conversations" should match the text in the preferences dialog and "By conversation count" should be the same text used above */
+	ppref = purple_plugin_pref_new_with_label(_("Note: The preference for \"New conversations\" must be set to \"By conversation count\"."));
+	purple_plugin_pref_set_type(ppref, PURPLE_PLUGIN_PREF_INFO);
+	purple_plugin_pref_frame_add(frame, ppref);
+
 	ppref = purple_plugin_pref_new_with_name_and_label(
 							"/plugins/gtk/extplacement/placement_number",
 							_("Number of conversations per window"));
--- a/po/th.po	Thu May 10 02:58:35 2007 +0000
+++ b/po/th.po	Thu May 10 03:00:31 2007 +0000
@@ -3065,7 +3065,7 @@
 #: ../src/gtkconv.c:4958 ../src/gtkconv.c:5067
 #, c-format
 msgid "%d person in room"
-msgstr "ã¹ËéͧÁÕ %s ¤¹"
+msgstr "ã¹ËéͧÁÕ %d ¤¹"
 
 #: ../src/gtkconv.c:5624 ../src/gtkstatusbox.c:366
 msgid "Typing"