changeset 19263:428562735971

merge of '1c3f25359208d70ea8d20a62c1dd4d7232b7a11a' and 'db0cbf6c46526ae0feb61c3e7c2fd59a1ada9910'
author Sean Egan <seanegan@gmail.com>
date Tue, 14 Aug 2007 02:23:30 +0000
parents 450090c68351 (current diff) 771423734d6a (diff)
children d5e76ad4b365 bda9483fbeb1
files pidgin/gtkimhtml.c
diffstat 28 files changed, 310 insertions(+), 123 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Aug 11 19:40:59 2007 +0000
+++ b/ChangeLog	Tue Aug 14 02:23:30 2007 +0000
@@ -1,11 +1,14 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
 version 2.1.1 (??/??/????):
-	libpurple:
+	Yahoo:
 	* Added an account action to open your inbox in the yahoo prpl.
 	* Added support for Unicode status messages in Yahoo.
 	* Server-stored aliases for Yahoo. (John Moody)
 	* Fixed support for Yahoo! doodling.
+	* Support for MSN Messenger contacts
+	
+	Bonjour:
 	* Bonjour plugin uses native Avahi instead of Howl
 	* Bonjour plugin supports Buddy Icons
 
@@ -14,6 +17,11 @@
 	  the toolbar
 	* Slim new redesign of conversation tabs to maximize number of
 	  conversations that can fit in a window
+	* Tab bar is not visible when only one conversation is open. You can
+	  drag and drop conversations from the infopane.
+	* Moved "Reset Formatting" toolbar button to Font menu.
+	* Double click on the infopane to alias buddies and set topics
+	  on chats
 
 	Finch:
 	* Sound support (Eric Polino)
--- a/ChangeLog.win32	Sat Aug 11 19:40:59 2007 +0000
+++ b/ChangeLog.win32	Tue Aug 14 02:23:30 2007 +0000
@@ -9,6 +9,9 @@
 	  Apple Bonjour for Windows from:
 	  http://www.apple.com/support/downloads/bonjourforwindows.html
 
+version 2.0.1 (5/24/2007):
+	* No changes
+
 version 2.0.0 (5/3/2007):
 	* URI Handler support added via `pidgin.exe --protocolhandler=`
 	* Running a second instance will popup the Buddy List, if possible.
--- a/Makefile.mingw	Sat Aug 11 19:40:59 2007 +0000
+++ b/Makefile.mingw	Tue Aug 14 02:23:30 2007 +0000
@@ -67,6 +67,7 @@
 	$(MAKE) -C $(PURPLE_TOP) -f $(MINGW_MAKEFILE) install
 	$(MAKE) -C $(PIDGIN_TOP) -f $(MINGW_MAKEFILE) install
 	$(MAKE) -C $(PURPLE_PO_TOP) -f $(MINGW_MAKEFILE) install
+	$(MAKE) -C share -f $(MINGW_MAKEFILE) install
 
 create_release_install_dir: install
 	rm -rf $(PIDGIN_INSTALL_DIR).release
--- a/libpurple/account.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/account.c	Tue Aug 14 02:23:30 2007 +0000
@@ -1130,8 +1130,8 @@
 
 void *
 purple_account_request_authorization(PurpleAccount *account, const char *remote_user,
-			           const char *id, const char *alias, const char *message, gboolean on_list,
-				   GCallback auth_cb, GCallback deny_cb, void *user_data)
+				     const char *id, const char *alias, const char *message, gboolean on_list,
+				     PurpleAccountRequestAuthorizationCb auth_cb, PurpleAccountRequestAuthorizationCb deny_cb, void *user_data)
 {
 	PurpleAccountUiOps *ui_ops;
 	PurpleAccountRequestInfo *info;
@@ -1146,8 +1146,8 @@
 		info->type      = PURPLE_ACCOUNT_REQUEST_AUTHORIZATION;
 		info->account   = account;
 		info->ui_handle = ui_ops->request_authorize(account, remote_user, id, alias, message,
-									on_list, auth_cb, deny_cb, user_data);
-		
+							    on_list, auth_cb, deny_cb, user_data);
+
 		handles = g_list_append(handles, info);
 		return info->ui_handle;
 	}
--- a/libpurple/account.h	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/account.h	Tue Aug 14 02:23:30 2007 +0000
@@ -242,7 +242,7 @@
  */
 void *purple_account_request_authorization(PurpleAccount *account, const char *remote_user,
 					const char *id, const char *alias, const char *message, gboolean on_list,
-					GCallback auth_cb, GCallback deny_cb, void *user_data);
+					PurpleAccountRequestAuthorizationCb auth_cb, PurpleAccountRequestAuthorizationCb deny_cb, void *user_data);
 
 /**
  * Close account requests registered for the given PurpleAccount
--- a/libpurple/dbus-analyze-functions.py	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/dbus-analyze-functions.py	Tue Aug 14 02:23:30 2007 +0000
@@ -39,6 +39,7 @@
     "purple_prefs_get_string_list",
     "purple_uri_list_extract_filenames",
     "purple_uri_list_extract_uris",
+    "purple_prefs_get_children_names",
 ]
 
 # This is a list of functions that return a GList* or GSList* that should
--- a/libpurple/plugins/perl/perl-handlers.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/plugins/perl/perl-handlers.c	Tue Aug 14 02:23:30 2007 +0000
@@ -22,6 +22,7 @@
 	gchar *hvname;
 	PurplePlugin *plugin;
 	PurplePerlScript *gps;
+	STRLEN na;
 	dSP;
 
 	plugin = action->plugin;
@@ -45,9 +46,16 @@
 	XPUSHs(purple_perl_bless_object(gps->plugin, "Purple::Plugin"));
 	PUTBACK;
 
-	call_sv(*callback, G_VOID | G_DISCARD);
+	call_sv(*callback, G_EVAL | G_VOID | G_DISCARD);
+
 	SPAGAIN;
 
+	if (SvTRUE(ERRSV)) {
+		purple_debug_error("perl",
+		                 "Perl plugin action function exited abnormally: %s\n",
+		                 SvPV(ERRSV, na));
+	}
+
 	PUTBACK;
 	FREETMPS;
 	LEAVE;
@@ -59,6 +67,7 @@
 	GList *l = NULL;
 	PurplePerlScript *gps;
 	int i = 0, count = 0;
+	STRLEN na;
 	dSP;
 
 	gps = (PurplePerlScript *)plugin->info->extra_info;
@@ -77,10 +86,16 @@
 		XPUSHs(&PL_sv_undef);
 	PUTBACK;
 
-	count = call_pv(gps->plugin_action_sub, G_ARRAY);
+	count = call_pv(gps->plugin_action_sub, G_EVAL | G_ARRAY);
 
 	SPAGAIN;
 
+	if (SvTRUE(ERRSV)) {
+		purple_debug_error("perl",
+		                 "Perl plugin actions lookup exited abnormally: %s\n",
+		                 SvPV(ERRSV, na));
+	}
+
 	if (count == 0)
 		croak("The plugin_actions sub didn't return anything.\n");
 
@@ -113,6 +128,7 @@
 	MAGIC *mg;
 	GtkWidget *ret;
 	PurplePerlScript *gps;
+	STRLEN na;
 	dSP;
 
 	gps = (PurplePerlScript *)plugin->info->extra_info;
@@ -120,13 +136,19 @@
 	ENTER;
 	SAVETMPS;
 
-	count = call_pv(gps->gtk_prefs_sub, G_SCALAR | G_NOARGS);
+	count = call_pv(gps->gtk_prefs_sub, G_EVAL | G_SCALAR | G_NOARGS);
 	if (count != 1)
 		croak("call_pv: Did not return the correct number of values.\n");
 
 	/* the frame was created in a perl sub and is returned */
 	SPAGAIN;
 
+	if (SvTRUE(ERRSV)) {
+		purple_debug_error("perl",
+		                 "Perl gtk plugin frame init exited abnormally: %s\n",
+		                 SvPV(ERRSV, na));
+	}
+
 	/* We have a Gtk2::Frame on top of the stack */
 	sv = POPs;
 
@@ -150,6 +172,7 @@
 	int count;
 	PurplePerlScript *gps;
 	PurplePluginPrefFrame *ret_frame;
+	STRLEN na;
 	dSP;
 
 	gps = (PurplePerlScript *)plugin->info->extra_info;
@@ -161,10 +184,16 @@
 	PUSHMARK(SP);
 	PUTBACK;
 
-	count = call_pv(gps->prefs_sub, G_SCALAR | G_NOARGS);
+	count = call_pv(gps->prefs_sub, G_EVAL | G_SCALAR | G_NOARGS);
 
 	SPAGAIN;
 
+	if (SvTRUE(ERRSV)) {
+		purple_debug_error("perl",
+		                 "Perl plugin prefs frame init exited abnormally: %s\n",
+		                 SvPV(ERRSV, na));
+	}
+
 	if (count != 1)
 		croak("call_pv: Did not return the correct number of values.\n");
 	/* the frame was created in a perl sub and is returned */
@@ -215,6 +244,7 @@
 {
 	PurplePerlTimeoutHandler *handler = (PurplePerlTimeoutHandler *)data;
 	gboolean ret = FALSE;
+	STRLEN na;
 
 	dSP;
 	ENTER;
@@ -225,6 +255,12 @@
 	call_sv(handler->callback, G_EVAL | G_SCALAR);
 	SPAGAIN;
 
+	if (SvTRUE(ERRSV)) {
+		purple_debug_error("perl",
+		                 "Perl timeout function exited abnormally: %s\n",
+		                 SvPV(ERRSV, na));
+	}
+
 	ret = POPi;
 
 	PUTBACK;
@@ -285,7 +321,7 @@
 		else
 			ret_val = purple_perl_data_from_sv(ret_value, POPs);
 	} else {
-		call_sv(handler->callback, G_SCALAR);
+		call_sv(handler->callback, G_EVAL | G_SCALAR);
 
 		SPAGAIN;
 	}
@@ -501,6 +537,7 @@
             gchar **args, gchar **error, void *data)
 {
 	int i = 0, count, ret_value = PURPLE_CMD_RET_OK;
+	STRLEN na;
 	SV *cmdSV, *tmpSV, *convSV;
 	PurplePerlCmdHandler *handler = (PurplePerlCmdHandler *)data;
 
@@ -532,11 +569,17 @@
 	}
 
 	PUTBACK;
-	count = call_sv(handler->callback, G_EVAL|G_SCALAR);
+	count = call_sv(handler->callback, G_EVAL | G_SCALAR);
 
 	if (count != 1)
 		croak("call_sv: Did not return the correct number of values.\n");
 
+	if (SvTRUE(ERRSV)) {
+		purple_debug_error("perl",
+		                 "Perl plugin command function exited abnormally: %s\n",
+		                 SvPV(ERRSV, na));
+	}
+
 	SPAGAIN;
 
 	ret_value = POPi;
--- a/libpurple/protocols/bonjour/jabber.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/bonjour/jabber.c	Tue Aug 14 02:23:30 2007 +0000
@@ -371,6 +371,8 @@
 
 	purple_debug_info("bonjour", "Recieved conversation close notification from %s.\n", pb->name);
 
+	g_return_if_fail(bb != NULL);
+
 	/* Close the socket, clear the watcher and free memory */
 	bonjour_jabber_close_conversation(bb->conversation);
 	bb->conversation = NULL;
--- a/libpurple/protocols/bonjour/parser.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/bonjour/parser.c	Tue Aug 14 02:23:30 2007 +0000
@@ -82,6 +82,11 @@
 	}
 }
 
+static gboolean _async_bonjour_jabber_stream_ended_cb(gpointer data) {
+	bonjour_jabber_stream_ended((PurpleBuddy *) data);
+	return FALSE;
+}
+
 static void
 bonjour_parser_element_end_libxml(void *user_data, const xmlChar *element_name,
 				 const xmlChar *prefix, const xmlChar *namespace)
@@ -94,7 +99,9 @@
 		/* We don't keep a reference to the start stream xmlnode,
 		 * so we have to check for it here to close the conversation */
 		if(!xmlStrcmp(element_name, (xmlChar*) "stream")) {
-			bonjour_jabber_stream_ended(pb);
+			/* Asynchronously close the conversation to prevent bonjour_parser_setup()
+			 * being called from within this context */
+			g_idle_add(_async_bonjour_jabber_stream_ended_cb, pb);
 		}
 		return;
 	}
--- a/libpurple/protocols/jabber/auth.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/jabber/auth.c	Tue Aug 14 02:23:30 2007 +0000
@@ -682,11 +682,11 @@
 
 	gchar *a1, *convnode=NULL, *convpasswd = NULL, *ha1, *ha2, *kd, *x, *z;
 
-	if((convnode = g_convert(jid->node, strlen(jid->node), "iso-8859-1", "utf-8",
+	if((convnode = g_convert(jid->node, -1, "iso-8859-1", "utf-8",
 					NULL, NULL, NULL)) == NULL) {
 		convnode = g_strdup(jid->node);
 	}
-	if(passwd && ((convpasswd = g_convert(passwd, strlen(passwd), "iso-8859-1",
+	if(passwd && ((convpasswd = g_convert(passwd, -1, "iso-8859-1",
 						"utf-8", NULL, NULL, NULL)) == NULL)) {
 		convpasswd = g_strdup(passwd);
 	}
--- a/libpurple/protocols/jabber/presence.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/jabber/presence.c	Tue Aug 14 02:23:30 2007 +0000
@@ -193,16 +193,18 @@
 	char *who;
 };
 
-static void authorize_add_cb(struct _jabber_add_permit *jap)
+static void authorize_add_cb(gpointer data)
 {
+	struct _jabber_add_permit *jap = data;
 	jabber_presence_subscription_set(jap->gc->proto_data, jap->who,
 			"subscribed");
 	g_free(jap->who);
 	g_free(jap);
 }
 
-static void deny_add_cb(struct _jabber_add_permit *jap)
+static void deny_add_cb(gpointer data)
 {
+	struct _jabber_add_permit *jap = data;
 	jabber_presence_subscription_set(jap->gc->proto_data, jap->who,
 			"unsubscribed");
 
@@ -305,7 +307,7 @@
 		jap->js = js;
 
 		purple_account_request_authorization(purple_connection_get_account(js->gc), from, NULL, NULL, NULL, onlist,
-				G_CALLBACK(authorize_add_cb), G_CALLBACK(deny_add_cb), jap);
+				authorize_add_cb, deny_add_cb, jap);
 		jabber_id_free(jid);
 		return;
 	} else if(type && !strcmp(type, "subscribed")) {
--- a/libpurple/protocols/msn/userlist.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/msn/userlist.c	Tue Aug 14 02:23:30 2007 +0000
@@ -38,8 +38,9 @@
  * Callbacks
  **************************************************************************/
 static void
-msn_accept_add_cb(MsnPermitAdd *pa)
+msn_accept_add_cb(gpointer data)
 {
+	MsnPermitAdd *pa = data;
 	MsnSession *session = pa->gc->proto_data;
 	MsnUserList *userlist = session->userlist;
 
@@ -51,8 +52,9 @@
 }
 
 static void
-msn_cancel_add_cb(MsnPermitAdd *pa)
+msn_cancel_add_cb(gpointer data)
 {
+	MsnPermitAdd *pa = data;
 	MsnSession *session = pa->gc->proto_data;
 	MsnUserList *userlist = session->userlist;
 
@@ -75,7 +77,7 @@
 	
 	purple_account_request_authorization(purple_connection_get_account(gc), passport, NULL, friendly, NULL,
 					   purple_find_buddy(purple_connection_get_account(gc), passport) != NULL,
-					   G_CALLBACK(msn_accept_add_cb), G_CALLBACK(msn_cancel_add_cb), pa);
+					   msn_accept_add_cb, msn_cancel_add_cb, pa);
 }
 
 /**************************************************************************
--- a/libpurple/protocols/oscar/oscar.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Tue Aug 14 02:23:30 2007 +0000
@@ -482,7 +482,7 @@
 
 	/* Attempt to send as ASCII */
 	if (oscar_charset_check(from) == AIM_CHARSET_ASCII) {
-		*msg = g_convert(from, strlen(from), "ASCII", "UTF-8", NULL, &msglen, NULL);
+		*msg = g_convert(from, -1, "ASCII", "UTF-8", NULL, &msglen, NULL);
 		*charset = AIM_CHARSET_ASCII;
 		*charsubset = 0x0000;
 		*msglen_int = msglen;
@@ -504,7 +504,7 @@
 		b = purple_find_buddy(account, destsn);
 		if ((b != NULL) && (PURPLE_BUDDY_IS_ONLINE(b)))
 		{
-			*msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, NULL);
+			*msg = g_convert(from, -1, "UCS-2BE", "UTF-8", NULL, &msglen, NULL);
 			if (*msg != NULL)
 			{
 				*charset = AIM_CHARSET_UNICODE;
@@ -527,7 +527,7 @@
 	 * XXX - We need a way to only attempt to convert if we KNOW "from"
 	 * can be converted to "charsetstr"
 	 */
-	*msg = g_convert(from, strlen(from), charsetstr, "UTF-8", NULL, &msglen, NULL);
+	*msg = g_convert(from, -1, charsetstr, "UTF-8", NULL, &msglen, NULL);
 	if (*msg != NULL) {
 		*charset = AIM_CHARSET_CUSTOM;
 		*charsubset = 0x0000;
@@ -538,7 +538,7 @@
 	/*
 	 * Nothing else worked, so send as UCS-2BE.
 	 */
-	*msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, &err);
+	*msg = g_convert(from, -1, "UCS-2BE", "UTF-8", NULL, &msglen, &err);
 	if (*msg != NULL) {
 		*charset = AIM_CHARSET_UNICODE;
 		*charsubset = 0x0000;
@@ -2261,8 +2261,9 @@
 
 /* When other people ask you for authorization */
 static void
-purple_auth_grant(struct name_data *data)
+purple_auth_grant(gpointer cbdata)
 {
+	struct name_data *data = cbdata;
 	PurpleConnection *gc = data->gc;
 	OscarData *od = gc->proto_data;
 
@@ -2282,8 +2283,9 @@
 }
 
 static void
-purple_auth_dontgrant_msgprompt(struct name_data *data)
+purple_auth_dontgrant_msgprompt(gpointer cbdata)
 {
+	struct name_data *data = cbdata;
 	purple_request_input(data->gc, NULL, _("Authorization Denied Message:"),
 					   NULL, _("No reason given."), TRUE, FALSE, NULL,
 					   _("_OK"), G_CALLBACK(purple_auth_dontgrant),
@@ -2404,8 +2406,8 @@
 
 				purple_account_request_authorization(account, sn, NULL, NULL,
 						reason, purple_find_buddy(account, sn) != NULL,
-						G_CALLBACK(purple_auth_grant),
-						G_CALLBACK(purple_auth_dontgrant_msgprompt), data);
+						purple_auth_grant,
+						purple_auth_dontgrant_msgprompt, data);
 				g_free(reason);
 			}
 		} break;
@@ -4346,10 +4348,10 @@
 
 	charset = oscar_charset_check(str);
 	if (charset == AIM_CHARSET_UNICODE) {
-		encoded = g_convert(str, strlen(str), "UCS-2BE", "UTF-8", NULL, ret_len, NULL);
+		encoded = g_convert(str, -1, "UCS-2BE", "UTF-8", NULL, ret_len, NULL);
 		*encoding = "unicode-2-0";
 	} else if (charset == AIM_CHARSET_CUSTOM) {
-		encoded = g_convert(str, strlen(str), "ISO-8859-1", "UTF-8", NULL, ret_len, NULL);
+		encoded = g_convert(str, -1, "ISO-8859-1", "UTF-8", NULL, ret_len, NULL);
 		*encoding = "iso-8859-1";
 	} else {
 		encoded = g_strdup(str);
@@ -5170,8 +5172,8 @@
 
 	purple_account_request_authorization(account, sn, NULL,
 			(buddy ? purple_buddy_get_alias_only(buddy) : NULL),
-			reason, buddy != NULL, G_CALLBACK(purple_auth_grant),
-			G_CALLBACK(purple_auth_dontgrant_msgprompt), data);
+			reason, buddy != NULL, purple_auth_grant,
+			purple_auth_dontgrant_msgprompt, data);
 	g_free(reason);
 
 	return 1;
--- a/libpurple/protocols/yahoo/util.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/yahoo/util.c	Tue Aug 14 02:23:30 2007 +0000
@@ -61,7 +61,7 @@
 	else
 		to_codeset = purple_account_get_string(purple_connection_get_account(gc), "local_charset",  "ISO-8859-1");
 
-	ret = g_convert_with_fallback(str, strlen(str), to_codeset, "UTF-8", "?", NULL, NULL, NULL);
+	ret = g_convert_with_fallback(str, -1, to_codeset, "UTF-8", "?", NULL, NULL, NULL);
 	if (ret)
 		return ret;
 	else
@@ -92,7 +92,7 @@
 	else
 		from_codeset = purple_account_get_string(purple_connection_get_account(gc), "local_charset",  "ISO-8859-1");
 
-	ret = g_convert_with_fallback(str, strlen(str), "UTF-8", from_codeset, NULL, NULL, NULL, NULL);
+	ret = g_convert_with_fallback(str, -1, "UTF-8", from_codeset, NULL, NULL, NULL, NULL);
 
 	if (ret)
 		return ret;
--- a/libpurple/protocols/yahoo/yahoo.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo.c	Tue Aug 14 02:23:30 2007 +0000
@@ -953,7 +953,8 @@
 };
 
 static void
-yahoo_buddy_add_authorize_cb(struct yahoo_add_request *add_req) {
+yahoo_buddy_add_authorize_cb(gpointer data) {
+	struct yahoo_add_request *add_req = data;
 	g_free(add_req->id);
 	g_free(add_req->who);
 	g_free(add_req->msg);
@@ -997,7 +998,8 @@
 }
 
 static void
-yahoo_buddy_add_deny_reason_cb(struct yahoo_add_request *add_req) {
+yahoo_buddy_add_deny_reason_cb(gpointer data) {
+	struct yahoo_add_request *add_req = data;
 	purple_request_input(add_req->gc, NULL, _("Authorization denied message:"),
 			NULL, _("No reason given."), TRUE, FALSE, NULL,
 			_("OK"), G_CALLBACK(yahoo_buddy_add_deny_cb),
@@ -1042,8 +1044,8 @@
 		 */
 		 purple_account_request_authorization(purple_connection_get_account(gc), add_req->who, add_req->id,
                                                     NULL, add_req->msg, purple_find_buddy(purple_connection_get_account(gc),add_req->who) != NULL,
-						    G_CALLBACK(yahoo_buddy_add_authorize_cb),
-						    G_CALLBACK(yahoo_buddy_add_deny_reason_cb),
+						    yahoo_buddy_add_authorize_cb,
+						    yahoo_buddy_add_deny_reason_cb,
                                                     add_req);
 	} else {
 		g_free(add_req->id);
@@ -3681,8 +3683,18 @@
 
 	group2 = yahoo_string_encode(gc, group, NULL);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pkt, "ssss", 1, purple_connection_get_display_name(gc),
-	                  7, buddy->name, 65, group2, 14, "");
+	yahoo_packet_hash(pkt, "ssssssssss",
+	                  14, "",
+	                  65, group2,
+	                  97, "1",
+	                  1, purple_connection_get_display_name(gc),
+	                  302, "319",
+	                  300, "319",
+	                  7, buddy->name,
+	                  334, "0",
+	                  301, "319",
+	                  303, "319"
+	);
 	yahoo_packet_send_and_free(pkt, yd);
 	g_free(group2);
 }
@@ -3819,16 +3831,12 @@
 		return;
 	}
 
-	/* Step 1:  Add buddy to new group. */
-	pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pkt, "ssss", 1, purple_connection_get_display_name(gc),
-	                  7, who, 65, gpn, 14, "");
+	pkt = yahoo_packet_new(YAHOO_SERVICE_CHGRP_15, YAHOO_STATUS_AVAILABLE, 0);
+	yahoo_packet_hash(pkt, "ssssssss", 1, purple_connection_get_display_name(gc),
+	                  302, "240", 300, "240", 7, who, 224, gpo, 264, gpn, 301,
+	                  "240", 303, "240");
 	yahoo_packet_send_and_free(pkt, yd);
 
-	/* Step 2:  Remove buddy from old group */
-	pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 65, gpo);
-	yahoo_packet_send_and_free(pkt, yd);
 	g_free(gpn);
 	g_free(gpo);
 }
--- a/libpurple/protocols/yahoo/yahoo_packet.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo_packet.c	Tue Aug 14 02:23:30 2007 +0000
@@ -223,6 +223,11 @@
 	GSList *l = pkt->hash;
 	int pos = 0;
 
+	/* This is only called from one place, and the list is
+	 * always backwards */
+
+	l = g_slist_reverse(l);
+
 	while (l) {
 		struct yahoo_pair *pair = l->data;
 		gchar buf[100];
--- a/libpurple/protocols/yahoo/yahoo_packet.h	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo_packet.h	Tue Aug 14 02:23:30 2007 +0000
@@ -98,6 +98,7 @@
 	YAHOO_SERVICE_AVATAR_UPDATE = 0xc7,
 	YAHOO_SERVICE_VERIFY_ID_EXISTS = 0xc8,
 	YAHOO_SERVICE_AUDIBLE = 0xd0,
+	YAHOO_SERVICE_CHGRP_15 = 0xe7,
 	YAHOO_SERVICE_STATUS_15 = 0xf0,
 	YAHOO_SERVICE_LIST_15 = 0Xf1,
 	YAHOO_SERVICE_WEBLOGIN = 0x0226,
--- a/libpurple/win32/global.mak	Sat Aug 11 19:40:59 2007 +0000
+++ b/libpurple/win32/global.mak	Tue Aug 14 02:23:30 2007 +0000
@@ -40,7 +40,6 @@
 PIDGIN_IDLETRACK_TOP := $(PIDGIN_TOP)/win32/IdleTracker
 PIDGIN_PIXMAPS_TOP := $(PIDGIN_TOP)/pixmaps
 PIDGIN_PLUGINS_TOP := $(PIDGIN_TOP)/plugins
-PIDGIN_SOUNDS_TOP := $(PIDGIN_TOP)/sounds
 PURPLE_PO_TOP := $(PIDGIN_TREE_TOP)/po
 PURPLE_PROTOS_TOP := $(PURPLE_TOP)/protocols
 
--- a/pidgin/Makefile.mingw	Sat Aug 11 19:40:59 2007 +0000
+++ b/pidgin/Makefile.mingw	Tue Aug 14 02:23:30 2007 +0000
@@ -146,7 +146,6 @@
 install: install_shallow all
 	$(MAKE) -C $(PIDGIN_PLUGINS_TOP) -f $(MINGW_MAKEFILE) install
 	$(MAKE) -C $(PIDGIN_PIXMAPS_TOP) -f $(MINGW_MAKEFILE) install
-	$(MAKE) -C $(PIDGIN_SOUNDS_TOP) -f $(MINGW_MAKEFILE) install
 	$(MAKE) -C $(PIDGIN_IDLETRACK_TOP) -f $(MINGW_MAKEFILE) install
 
 win32/pidgin_dll_rc.rc: win32/pidgin_dll_rc.rc.in $(PIDGIN_TREE_TOP)/VERSION
--- a/pidgin/gtkblist.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/pidgin/gtkblist.c	Tue Aug 14 02:23:30 2007 +0000
@@ -2608,6 +2608,7 @@
 	gboolean tooltip_top = FALSE;
 	struct _pidgin_blist_node *gtknode;
 	GdkRectangle mon_size;
+	int sig;
 	
 	if (node == NULL)
 		return;
@@ -2618,7 +2619,6 @@
 	 */
 	pidgin_blist_tooltip_destroy();
 
-
 	gtkblist->tipwindow = gtk_window_new(GTK_WINDOW_POPUP);
 
 	if(PURPLE_BLIST_NODE_IS_CHAT(node) || PURPLE_BLIST_NODE_IS_BUDDY(node)) {
@@ -2673,7 +2673,6 @@
 			G_CALLBACK(pidgin_blist_paint_tip), NULL);
 	gtk_widget_ensure_style (gtkblist->tipwindow);
 
-
 #if GTK_CHECK_VERSION(2,2,0)
 	gdk_display_get_pointer(gdk_display_get_default(), &screen, &x, &y, NULL);
 	mon_num = gdk_screen_get_monitor_at_point(screen, x, y);
@@ -2722,6 +2721,10 @@
 	gtk_window_move(GTK_WINDOW(gtkblist->tipwindow), x, y);
 	gtk_widget_show(gtkblist->tipwindow);
 
+	/* Hide the tooltip when the widget is destroyed */
+	sig = g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(pidgin_blist_tooltip_destroy), NULL);
+	g_signal_connect_swapped(G_OBJECT(gtkblist->tipwindow), "destroy", G_CALLBACK(g_source_remove), GINT_TO_POINTER(sig));
+
 	return;
 }
 
@@ -3321,18 +3324,14 @@
 	}
 
 	/* XXX Good luck cleaning up this crap */
-	if (aliased) {
-		contact = (PurpleContact*)((PurpleBlistNode*)b)->parent;
-		if(contact)
-			gtkcontactnode = ((PurpleBlistNode*)contact)->ui_data;
-
-		if(gtkcontactnode && !gtkcontactnode->contact_expanded && contact->alias)
-			name = contact->alias;
-		else
-			name = purple_buddy_get_alias(b);
-	} else {
-		name = b->name;
-	}
+	contact = (PurpleContact*)((PurpleBlistNode*)b)->parent;
+	if(contact)
+		gtkcontactnode = ((PurpleBlistNode*)contact)->ui_data;
+
+	if(gtkcontactnode && !gtkcontactnode->contact_expanded && contact->alias)
+		name = contact->alias;
+	else
+		name = purple_buddy_get_alias(b);
 	
 	esc = g_markup_escape_text(name, strlen(name));
 
--- a/pidgin/gtkconv.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/pidgin/gtkconv.c	Tue Aug 14 02:23:30 2007 +0000
@@ -186,6 +186,7 @@
 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win);
 static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv);
 static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv);
+static gboolean alias_double_click_cb(GtkWidget *widget, GdkEventButton *event, PidginConversation *gtkconv);
 
 static void pidgin_conv_set_position_size(PidginWindow *win, int x, int y,
 		int width, int height);
@@ -3340,8 +3341,10 @@
 	} else {
 		stock_id = PIDGIN_STOCK_ANIMATION_TYPING5;
 		tooltip = _("User has typed something and stopped");
-		g_source_remove(gtkconv->u.im->typing_timer);
-		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;
+		}
 	}
 
 	if (gtkwin->menu.typing_icon == NULL)
@@ -4015,7 +4018,6 @@
 	}
 
 	gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic);
-
 	prpl_info->set_chat_topic(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)),
 			new_topic);
 
@@ -4383,6 +4385,8 @@
 				 "foreground-set", TRUE,
 				 "weight-set", TRUE,
 				 NULL);
+        g_object_set(G_OBJECT(rend), "editable", TRUE, NULL);
+
 	col = gtk_tree_view_column_new_with_attributes(NULL, rend,
 	                                               "text", CHAT_USERS_ALIAS_COLUMN,
 	                                               "foreground-gdk", CHAT_USERS_COLOR_COLUMN,
@@ -4411,17 +4415,36 @@
 	gtk_container_add(GTK_CONTAINER(sw), list);
 }
 
-static int tooltip_timeout = 0;
+/* Stuff used to display tooltips on the infopane */
+static struct {
+	int timeout;
+	PidginConversation *gtkconv;   /* This is the Pidgin conversation that
+	                                  triggered the tooltip */
+} tooltip;
+
+static void
+reset_tooltip()
+{
+	if (tooltip.timeout != 0) {
+		g_source_remove(tooltip.timeout);
+		tooltip.timeout = 0;
+	}
+	tooltip.gtkconv = NULL;
+}
 
 static gboolean
 pidgin_conv_tooltip_timeout(PidginConversation *gtkconv)
 {
 	PurpleBlistNode *node = NULL;
-	PurpleConversation *conv = gtkconv->active_conv;
- 	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
-                node = (PurpleBlistNode*)(purple_blist_find_chat(conv->account, conv->name));
+	PurpleConversation *conv;
+
+	g_return_val_if_fail (tooltip.gtkconv == gtkconv, FALSE);
+
+	conv = gtkconv->active_conv;
+	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
+		node = (PurpleBlistNode*)(purple_blist_find_chat(conv->account, conv->name));
 	} else {
-                node = (PurpleBlistNode*)(purple_find_buddy(conv->account, conv->name));
+		node = (PurpleBlistNode*)(purple_find_buddy(conv->account, conv->name));
 	}
 
 	if (node) 
@@ -4433,10 +4456,7 @@
 pidgin_conv_leave_cb (GtkWidget *w, GdkEventCrossing *e, PidginConversation *gtkconv)
 {
 	pidgin_blist_tooltip_destroy();
-	if (tooltip_timeout) {
-		g_source_remove(tooltip_timeout);
-		tooltip_timeout = 0;
-	}
+	reset_tooltip();
 }
 
 static gboolean 
@@ -4448,10 +4468,11 @@
 	if (delay == 0)
 		return FALSE;
 
-	if (tooltip_timeout != 0) 
-		g_source_remove(tooltip_timeout);
-
-	tooltip_timeout = g_timeout_add(delay, (GSourceFunc)pidgin_conv_tooltip_timeout, gtkconv);
+	if (tooltip.timeout != 0) 
+		g_source_remove(tooltip.timeout);
+
+	tooltip.timeout = g_timeout_add(delay, (GSourceFunc)pidgin_conv_tooltip_timeout, gtkconv);
+	tooltip.gtkconv = gtkconv;
 	return FALSE;
 }
 
@@ -4488,11 +4509,10 @@
 	g_signal_connect(G_OBJECT(event_box), "button_press_event",
 	                 G_CALLBACK(infopane_press_cb), gtkconv);
 
-        g_signal_connect(G_OBJECT(event_box), "motion-notify-event", 
-			 G_CALLBACK(pidgin_conv_motion_cb), gtkconv);
-        g_signal_connect(G_OBJECT(event_box), "leave-notify-event", 
-			 G_CALLBACK(pidgin_conv_leave_cb), gtkconv);
-
+	g_signal_connect(G_OBJECT(event_box), "motion-notify-event", 
+			G_CALLBACK(pidgin_conv_motion_cb), gtkconv);
+	g_signal_connect(G_OBJECT(event_box), "leave-notify-event", 
+			G_CALLBACK(pidgin_conv_leave_cb), gtkconv);
 
 	gtkconv->infopane = gtk_cell_view_new();
 	gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF);
@@ -4986,6 +5006,9 @@
 	g_list_foreach(gtkconv->send_history, (GFunc)g_free, NULL);
 	g_list_free(gtkconv->send_history);
 
+	if (tooltip.gtkconv == gtkconv)
+		reset_tooltip();
+
 	g_free(gtkconv);
 }
 
@@ -6277,7 +6300,7 @@
 		else
 			title = g_strdup(purple_conversation_get_title(conv));
 
-		if ((truncate = strchr(title, ' ')) || 
+		if (((truncate = strchr(title, ' ')) && strcmp(title, conv->name)) || 
 		    (truncate = strchr(title, '@'))) {
 			truncchar = *truncate;
 			*truncate = '\0';
@@ -6292,16 +6315,19 @@
 				markup = title;
 			}
 		} else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
-			PurpleConvChat *chat = PURPLE_CONV_CHAT(conv);
-			const char *topic = purple_conv_chat_get_topic(chat);
+			const char *topic = gtk_entry_get_text(GTK_ENTRY(gtkconv->u.chat->topic_text));
+			char *esc = topic ? g_markup_escape_text(topic, -1) : NULL;
 			markup = g_strdup_printf("%s%s<span color='%s' size='smaller'>%s</span>",
 						purple_conversation_get_title(conv),
-						topic ? "\n" : "",
+						esc  && *esc ? "\n" : "",
 						pidgin_get_dim_grey_string(gtkconv->infopane),
-						topic ? topic : "");
+						esc ? esc : "");
+			g_free(esc);
 		}
 		gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter),
 				CONV_TEXT_COLUMN, markup, -1);
+	        /* XXX seanegan Why do I have to do this? */
+        	gtk_widget_queue_draw(gtkconv->infopane);
 	
 		if (title != markup)
 			g_free(markup);
@@ -6604,10 +6630,10 @@
                               GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
 	g_signal_connect(G_OBJECT(event), "button-press-event",
 					 G_CALLBACK(icon_menu), gtkconv);
-        g_signal_connect(G_OBJECT(event), "motion-notify-event",
-                         G_CALLBACK(pidgin_conv_motion_cb), gtkconv);
-        g_signal_connect(G_OBJECT(event), "leave-notify-event",
-                         G_CALLBACK(pidgin_conv_leave_cb), gtkconv);
+	g_signal_connect(G_OBJECT(event), "motion-notify-event",
+			G_CALLBACK(pidgin_conv_motion_cb), gtkconv);
+	g_signal_connect(G_OBJECT(event), "leave-notify-event",
+			G_CALLBACK(pidgin_conv_leave_cb), gtkconv);
 	gtk_widget_show(event);
 
 	gtkconv->u.im->icon = gtk_image_new_from_pixbuf(scale);
@@ -7179,23 +7205,23 @@
 
 	/* Conversations -> Chat */
 	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations/chat");
-	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/entry_height", 50);
+	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/entry_height", 54);
 	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/userlist_width", 80);
 	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/x", 0);
 	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/y", 0);
-	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/width", 0);
-	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/height", 0);
+	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/width", 340);
+	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/chat/height", 390);
 
 	/* Conversations -> IM */
 	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations/im");
 	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/x", 0);
 	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/y", 0);
-	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/width", 0);
-	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/height", 0);
+	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/width", 340);
+	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/height", 390);
 
 	purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/im/animate_buddy_icons", TRUE);
 
-	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/entry_height", 50);
+	purple_prefs_add_int(PIDGIN_PREFS_ROOT "/conversations/im/entry_height", 54);
 	purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons", TRUE);
 
 	purple_prefs_add_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new", "never");
@@ -7690,8 +7716,10 @@
 
 		gtkconv = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num);
 		tab = gtkconv->tabby;
-
-		if (horiz_tabs) {
+		if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE) {
+				dnd_hints_show_relative(HINT_ARROW_DOWN, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_TOP);
+				dnd_hints_show_relative(HINT_ARROW_UP, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_BOTTOM);
+		} else if (horiz_tabs) {
 			if (((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) || to_right) {
 				dnd_hints_show_relative(HINT_ARROW_DOWN, tab, HINT_POSITION_RIGHT, HINT_POSITION_TOP);
 				dnd_hints_show_relative(HINT_ARROW_UP, tab, HINT_POSITION_RIGHT, HINT_POSITION_BOTTOM);
@@ -7738,9 +7766,37 @@
 static gboolean
 infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv)
 {
+	if (e->type == GDK_2BUTTON_PRESS && e->button == 1) {
+		if (alias_double_click_cb(widget, e, gtkconv))
+			return TRUE;
+	}
+
 	if (e->type != GDK_BUTTON_PRESS)
 		return FALSE;
 
+	if (e->button == 1) {
+		int nb_x, nb_y;
+
+		if (gtkconv->win->in_drag)
+			return TRUE;
+
+		gtkconv->win->in_predrag = TRUE;
+		gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont);
+
+		gdk_window_get_origin(gtkconv->infopane_hbox->window, &nb_x, &nb_y);
+
+		gtkconv->win->drag_min_x = gtkconv->infopane_hbox->allocation.x + nb_x;
+		gtkconv->win->drag_min_y = gtkconv->infopane_hbox->allocation.y + nb_y;
+		gtkconv->win->drag_max_x = gtkconv->infopane_hbox->allocation.width + gtkconv->win->drag_min_x;
+		gtkconv->win->drag_max_y = gtkconv->infopane_hbox->allocation.height + gtkconv->win->drag_min_y;
+
+		gtkconv->win->drag_motion_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event",
+								    G_CALLBACK(notebook_motion_cb), gtkconv->win);
+		gtkconv->win->drag_leave_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event",
+								    G_CALLBACK(notebook_leave_cb), gtkconv->win);
+		return FALSE;
+	}
+	
 	if (e->button == 3) {
 		/* Right click was pressed. Popup the Send To menu. */
 		GtkWidget *menu = gtk_menu_new(), *sub;
@@ -8119,7 +8175,7 @@
 {
 	g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA,
 				0, 0, NULL, NULL, gtkconv);
-	gtk_widget_show(gtkconv->tab_label);
+	gtk_widget_show(gtkconv->infopane);
 	gtk_widget_grab_focus(gtkconv->entry);
 	gtk_widget_destroy(entry);
 }
@@ -8166,21 +8222,18 @@
 		}
 		serv_alias_buddy(buddy);
 	} else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {	        
-		PurpleChat *chat;
-
-		chat = purple_blist_find_chat(account, name);
-		if (chat != NULL) {
-			purple_blist_alias_chat(chat,
-			                        gtk_entry_get_text(entry));
-		}
+		gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry));
+		topic_callback(NULL, gtkconv);
 	}
 	remove_edit_entry(user_data, GTK_WIDGET(entry));
 }
 
 static gboolean
-alias_double_click_cb(GtkNotebook *notebook, GdkEventButton *event, PidginConversation *gtkconv)
+alias_double_click_cb(GtkWidget *widget, GdkEventButton *event, PidginConversation *gtkconv)
 {
 	GtkWidget *entry = NULL;
+        PurpleConversation *conv = gtkconv->active_conv;
+	const char *text = NULL;
 
 	if (event->button != 1 || event->type != GDK_2BUTTON_PRESS) {
 		return FALSE;
@@ -8196,6 +8249,15 @@
 		return FALSE;
 	}
 
+	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
+		PurpleBuddy *buddy = purple_find_buddy(gtkconv->active_conv->account, gtkconv->active_conv->name);
+		if (!buddy)
+			return FALSE;
+		text = purple_buddy_get_contact_alias(buddy);
+	} else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
+		text = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(conv));
+	}
+
 	/* alias label */
 	entry = gtk_entry_new();
 	gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE);
@@ -8204,17 +8266,19 @@
 	gtk_entry_set_alignment(GTK_ENTRY(entry), 0.5);
 #endif
 
-	gtk_box_pack_start(GTK_BOX(gtkconv->tabby), entry, TRUE, TRUE, 0);
+	gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), entry, TRUE, TRUE, 0);
 	/* after the tab label */
-	gtk_box_reorder_child(GTK_BOX(gtkconv->tabby), entry, 2);
+	gtk_box_reorder_child(GTK_BOX(gtkconv->infopane_hbox), entry, 0);
 
 	g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(alias_cb), gtkconv);
 	g_signal_connect(G_OBJECT(entry), "focus-out-event", G_CALLBACK(alias_focus_cb), gtkconv);
 	g_signal_connect(G_OBJECT(entry), "key-press-event", G_CALLBACK(alias_key_press_cb), gtkconv);
-	gtk_entry_set_text(GTK_ENTRY(entry),
-			gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)));
+	
+	
+
+	gtk_entry_set_text(GTK_ENTRY(entry), text);
 	gtk_widget_show(entry);
-	gtk_widget_hide(gtkconv->tab_label);
+	gtk_widget_hide(gtkconv->infopane);
 	gtk_widget_grab_focus(entry);
 
 	return FALSE;
--- a/pidgin/gtkimhtml.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/pidgin/gtkimhtml.c	Tue Aug 14 02:23:30 2007 +0000
@@ -1038,7 +1038,7 @@
 {
 	char *tmp;
 
-	if (text == NULL)
+	if (text == NULL || !(*text))
 		return;
 
 	tmp = g_markup_escape_text(text, -1);
@@ -1054,7 +1054,7 @@
 	if (!gtk_text_view_get_editable(GTK_TEXT_VIEW(imhtml)))
 		return;
 
-	if (imhtml->wbfo || selection_data->length < 0) {
+	if (imhtml->wbfo || selection_data->length <= 0) {
 		gtk_clipboard_request_text(clipboard, paste_plaintext_received_cb, imhtml);
 		return;
 	} else {
--- a/pidgin/gtkprefs.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/pidgin/gtkprefs.c	Tue Aug 14 02:23:30 2007 +0000
@@ -1039,9 +1039,11 @@
 #endif
 
 	vbox = pidgin_make_frame(ret, _("Default Formatting"));
+	gtk_box_set_child_packing(GTK_BOX(vbox->parent), vbox, TRUE, TRUE, 0, GTK_PACK_START);
 
 	frame = pidgin_create_imhtml(TRUE, &imhtml, &toolbar, NULL);
 	gtk_widget_set_name(imhtml, "pidgin_prefs_font_imhtml");
+	gtk_widget_set_size_request(frame, 300, -1);
 	gtk_imhtml_set_whole_buffer_formatting_only(GTK_IMHTML(imhtml), TRUE);
 	gtk_imhtml_set_format_functions(GTK_IMHTML(imhtml),
 									GTK_IMHTML_BOLD |
--- a/pidgin/gtkrequest.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/pidgin/gtkrequest.c	Tue Aug 14 02:23:30 2007 +0000
@@ -1107,7 +1107,7 @@
 
 	/* Setup the vbox */
 	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
-	gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
 	gtk_widget_show(vbox);
 
 	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
@@ -1132,6 +1132,8 @@
 		total_fields += g_list_length(purple_request_field_group_get_fields(gl->data));
 
 	if(total_fields > 9) {
+		GtkWidget *hbox_for_spacing, *vbox_for_spacing;
+
 		sw = gtk_scrolled_window_new(NULL, NULL);
 		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
 				GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
@@ -1141,8 +1143,19 @@
 		gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
 		gtk_widget_show(sw);
 
+		hbox_for_spacing = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
+		gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw),
+				hbox_for_spacing);
+		gtk_widget_show(hbox_for_spacing);
+
+		vbox_for_spacing = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
+		gtk_box_pack_start(GTK_BOX(hbox_for_spacing),
+				vbox_for_spacing, TRUE, TRUE, PIDGIN_HIG_BOX_SPACE);
+		gtk_widget_show(vbox_for_spacing);
+
 		vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
-		gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), vbox2);
+		gtk_box_pack_start(GTK_BOX(vbox_for_spacing),
+				vbox2, TRUE, TRUE, PIDGIN_HIG_BOX_SPACE);
 		gtk_widget_show(vbox2);
 	} else {
 		vbox2 = vbox;
--- a/pidgin/plugins/win32/transparency/win2ktrans.c	Sat Aug 11 19:40:59 2007 +0000
+++ b/pidgin/plugins/win32/transparency/win2ktrans.c	Tue Aug 14 02:23:30 2007 +0000
@@ -274,9 +274,11 @@
 		gtk_window_get_size(GTK_WINDOW(win), &width, &height);
 		gtk_box_pack_start(GTK_BOX(vbox),
 			slider_box, FALSE, FALSE, 0);
+#if 0 /*Now that we save window sizes, don't resize it or else it causes windows to grow*/
 		/* Make window taller so we don't slowly collapse its message area */
 		gtk_window_resize(GTK_WINDOW(win), width,
 			(height + slidereq.height));
+#endif
 		/* Add window to list, to track that it has a slider */
 		slidwin = g_new0(slider_win, 1);
 		slidwin->win = win;
@@ -292,6 +294,7 @@
 			slider_win *slidwin = (slider_win*) tmp->data;
 			if (slidwin != NULL &&
 					GTK_IS_WINDOW(slidwin->win)) {
+#if 0
 				GtkRequisition slidereq;
 				gint width, height;
 				/* Figure out how tall the slider was */
@@ -300,12 +303,13 @@
 				gtk_window_get_size(
 					GTK_WINDOW(slidwin->win),
 					&width, &height);
-
+#endif
 				gtk_widget_destroy(slidwin->slider);
-
+#if 0
 				gtk_window_resize(
 					GTK_WINDOW(slidwin->win),
 					width, (height - slidereq.height));
+#endif
 			}
 			g_free(slidwin);
 			tmp = tmp->next;
--- a/po/POTFILES.in	Sat Aug 11 19:40:59 2007 +0000
+++ b/po/POTFILES.in	Tue Aug 14 02:23:30 2007 +0000
@@ -11,6 +11,7 @@
 finch/gntpounce.c
 finch/gntprefs.c
 finch/gntrequest.c
+finch/gntsound.c
 finch/gntstatus.c
 finch/gntui.c
 finch/libgnt/gntbox.c
--- a/share/Makefile.am	Sat Aug 11 19:40:59 2007 +0000
+++ b/share/Makefile.am	Tue Aug 14 02:23:30 2007 +0000
@@ -1,2 +1,4 @@
 
 SUBDIRS = sounds
+
+EXTRA_DIST = Makefile.mingw
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/Makefile.mingw	Tue Aug 14 02:23:30 2007 +0000
@@ -0,0 +1,19 @@
+#
+# Makefile.mingw
+#
+# Description: Makefile for win32 (mingw) version
+#
+
+PIDGIN_TREE_TOP := ..
+include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
+
+include ./Makefile.am
+
+.PHONY: install clean
+
+install:
+	if test '$(SUBDIRS)'; then \
+	  list='$(SUBDIRS)'; for subdir in $$list; do \
+	    $(MAKE) -C $$subdir -f $(MINGW_MAKEFILE) install || exit 1 ;\
+	  done; \
+	fi;