changeset 27352:69511e781717

merge of '46a46162666e1d23ae6161df2639044132cb894f' and 'ada690f0424ce05fc000d5e97d25079fc1909318'
author Etan Reisner <pidgin@unreliablesource.net>
date Sun, 05 Jul 2009 15:08:20 +0000
parents 5b07c7253ba4 (diff) c7a80c1c40c7 (current diff)
children d137b369eb9c
files ChangeLog ChangeLog.API
diffstat 26 files changed, 157 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Jul 05 11:04:29 2009 +0000
+++ b/ChangeLog	Sun Jul 05 15:08:20 2009 +0000
@@ -10,6 +10,8 @@
 	  in a group on the buddy list. (Paul Aurich)
 	* Removed the unmaintained and unneeded toc protocol plugin.
 	* Fixed NTLM authentication on big-endian systems.
+	* The Pidgin and Purple perl modules are no longer installed into @INC,
+	  this should hopefulll prevent some minor confusion.
 	* Use GLib's implementations of SHA1, SHA256, and MD5 when available.
 	  (GLib 2.14 or higher)
 
--- a/ChangeLog.API	Sun Jul 05 11:04:29 2009 +0000
+++ b/ChangeLog.API	Sun Jul 05 15:08:20 2009 +0000
@@ -44,6 +44,7 @@
 		* purple_network_get_stun_ip
 		* purple_network_get_turn_ip
 		* purple_network_remove_port_mapping
+		* purple_plugins_get_search_paths
 		* purple_proxy_connect_udp
 		* purple_prpl_get_media_caps
 		* purple_prpl_got_account_actions
--- a/configure.ac	Sun Jul 05 11:04:29 2009 +0000
+++ b/configure.ac	Sun Jul 05 15:08:20 2009 +0000
@@ -1563,30 +1563,6 @@
 			AC_MSG_RESULT(no)
 		fi
 
-		if test "x$prefix" != "xNONE"; then
-			prefix=`eval echo $prefix`
-			PERL_MM_PARAMS="INSTALLDIRS=vendor PREFIX=$prefix"
-		fi
-
-		AC_ARG_WITH(perl-lib,
-		[AC_HELP_STRING([--with-perl-lib=[site|vendor|DIR]],
-			[specify where to install the Perl libraries for pidgin. Default is site.])],
-		[
-			if test "x$withval" = xsite; then
-				PERL_MM_PARAMS=""
-			elif test "x$withval" = xvendor; then
-				if test -z "`$perlpath -v | grep '5\.0'`"; then
-					PERL_MM_PARAMS="INSTALLDIRS=vendor"
-				else
-					PERL_MM_PARAMS="INSTALLDIRS=vendor PREFIX=`perl -e 'use Config; print $Config{prefix}'`"
-				fi
-			else
-				PERL_MM_PARAMS="INSTALLDIRS=vendor PREFIX=$withval"
-			fi
-		])
-
-		AC_SUBST(PERL_MM_PARAMS)
-
 		AC_MSG_CHECKING(for DynaLoader.a)
 		DYNALOADER_A=`echo $PERL_LDFLAGS | $perlpath -pe 's/^(.* )*([[^ ]]*DynaLoader\.a).*/\2/'`
 
--- a/doc/notify-signals.dox	Sun Jul 05 11:04:29 2009 +0000
+++ b/doc/notify-signals.dox	Sun Jul 05 15:08:20 2009 +0000
@@ -30,7 +30,7 @@
                                       const char *url);
   @endsignalproto
   @signaldesc
-   Emitted before email notification is handed to the UI to display.
+   Emitted before notification of a single email is handed to the UI to display.
   @param subject   Subject of email being notified of.
   @param from      Who the email is from.
   @param to        Who the email is to.
--- a/libpurple/account.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/account.c	Sun Jul 05 15:08:20 2009 +0000
@@ -1132,29 +1132,32 @@
 purple_account_connect(PurpleAccount *account)
 {
 	PurplePlugin *prpl;
+	const char *password, *username;
 	PurplePluginProtocolInfo *prpl_info;
-	const char *password;
 
 	g_return_if_fail(account != NULL);
 
-	purple_debug_info("account", "Connecting to account %s\n",
-					purple_account_get_username(account));
-
-	if (!purple_account_get_enabled(account, purple_core_get_ui()))
+	username = purple_account_get_username(account);
+
+	if (!purple_account_get_enabled(account, purple_core_get_ui())) {
+		purple_debug_info("account",
+				  "Account %s not enabled, not connecting.\n",
+				  username);
 		return;
+	}
 
 	prpl = purple_find_prpl(purple_account_get_protocol_id(account));
-	if (prpl == NULL)
-	{
+	if (prpl == NULL) {
 		gchar *message;
 
-		message = g_strdup_printf(_("Missing protocol plugin for %s"),
-			purple_account_get_username(account));
+		message = g_strdup_printf(_("Missing protocol plugin for %s"), username);
 		purple_notify_error(account, _("Connection Error"), message, NULL);
 		g_free(message);
 		return;
 	}
 
+	purple_debug_info("account", "Connecting to account %s.\n", username);
+
 	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 	password = purple_account_get_password(account);
 	if ((password == NULL) &&
--- a/libpurple/buddyicon.h	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/buddyicon.h	Sun Jul 05 15:08:20 2009 +0000
@@ -189,8 +189,6 @@
  *                  takes ownership of and will free.
  * @param icon_len  The length of the icon data.
  * @param checksum  A protocol checksum from the prpl or @c NULL.
- *
- * @return The buddy icon set, or NULL if no icon was set.
  */
 void
 purple_buddy_icons_set_for_user(PurpleAccount *account, const char *username,
--- a/libpurple/dnssrv.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/dnssrv.c	Sun Jul 05 15:08:20 2009 +0000
@@ -82,7 +82,7 @@
 	GThread *resolver;
 	char *query;
 	char *error_message;
-	GSList *results;
+	GList *results;
 #else
 	int fd_in, fd_out;
 	pid_t pid;
@@ -134,8 +134,8 @@
  * @param container_ptr The PurpleSrvResponseContainer that was chosen
  *        will be returned here.
  */
-static GList *select_random_response(GList *list,
-		PurpleSrvResponseContainer **container_ptr)
+static GList *
+select_random_response(GList *list, PurpleSrvResponseContainer **container_ptr)
 {
 	GList *cur;
 	size_t runningtotal;
@@ -173,11 +173,11 @@
  * Reorder a GList of PurpleSrvResponses that have the same priority
  * (aka "pref").
  */
-static void srv_reorder(GList *list, int num)
+static void
+srv_reorder(GList *list, int num)
 {
 	int i;
-	GList *cur;
-	GList *container_list = NULL;
+	GList *cur, *container_list = NULL;
 	PurpleSrvResponseContainer *container;
 
 	if (num < 2)
@@ -206,21 +206,22 @@
 }
 
 /**
- * Sorts a GList of PurpleSrvResponse's according to the
+ * Sorts a GList of PurpleSrvResponses according to the
  * algorithm described in RFC 2782.
  *
  * @param response GList of PurpleSrvResponse's
  * @param The original list, resorted
  */
-static GList *purple_srv_sort(GList *list)
+static GList *
+purple_srv_sort(GList *list)
 {
+	int pref, count;
 	GList *cur, *start;
-	int count;
-	int pref;
 
-	if (!list || !list->next)
+	if (!list || !list->next) {
 		/* Nothing to sort */
 		return list;
+	}
 
 	list = g_list_sort(list, responsecompare);
 
@@ -255,11 +256,8 @@
 	PurpleSrvResponse *srvres;
 	PurpleTxtResponse *txtres;
 	queryans answer;
-	int size;
-	int qdcount;
-	int ancount;
-	guchar *end;
-	guchar *cp;
+	int size, qdcount, ancount;
+	guchar *end, *cp;
 	gchar name[256];
 	guint16 type, dlen, pref, weight, port;
 	PurpleSrvInternalQuery query;
@@ -348,8 +346,11 @@
 	while (ret != NULL)
 	{
 		/* TODO: Check return value */
-		if (query.type == T_SRV) write(out, ret->data, sizeof(PurpleSrvResponse));
-		if (query.type == T_TXT) write(out, ret->data, sizeof(PurpleTxtResponse));
+		if (query.type == T_SRV)
+			write(out, ret->data, sizeof(PurpleSrvResponse));
+		if (query.type == T_TXT)
+			write(out, ret->data, sizeof(PurpleTxtResponse));
+
 		g_free(ret->data);
 		ret = g_list_remove(ret, ret->data);
 	}
@@ -410,7 +411,7 @@
 
 					cb(res, size, query_data->extradata);
 				} else if (type == T_TXT) {
-					GSList *responses = NULL;
+					GList *responses = NULL;
 					PurpleTxtResponse *res;
 					PurpleTxtCallback cb = query_data->cb.txt;
 					ssize_t red;
@@ -423,8 +424,8 @@
 									"response: %s\n", g_strerror(errno));
 							size = 0;
 							g_free(res);
-							g_slist_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
-							g_slist_free(responses);
+							g_list_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
+							g_list_free(responses);
 							responses = NULL;
 							break;
 						}
@@ -450,24 +451,24 @@
 res_main_thread_cb(gpointer data)
 {
 	PurpleSrvResponse *srvres = NULL;
-	int size = 0;
 	PurpleSrvQueryData *query_data = data;
 	if(query_data->error_message != NULL)
 		purple_debug_error("dnssrv", query_data->error_message);
 	else {
 		if (query_data->type == DNS_TYPE_SRV) {
 			PurpleSrvResponse *srvres_tmp = NULL;
-			GSList *lst = query_data->results;
-
-			size = g_slist_length(lst);
+			GList *lst = query_data->results;
+			int size = g_list_length(lst);
 
 			if(query_data->cb.srv && size > 0)
 				srvres_tmp = srvres = g_new0(PurpleSrvResponse, size);
 			while (lst) {
+				PurpleSrvResponse *lstdata = lst->data;
+				lst = g_list_delete_link(lst, lst);
+
 				if(query_data->cb.srv)
-					memcpy(srvres_tmp++, lst->data, sizeof(PurpleSrvResponse));
-				g_free(lst->data);
-				lst = g_slist_remove(lst, lst->data);
+					memcpy(srvres_tmp++, lstdata, sizeof(PurpleSrvResponse));
+				g_free(lstdata);
 			}
 
 			query_data->results = NULL;
@@ -476,9 +477,9 @@
 
 			if(query_data->cb.srv) query_data->cb.srv(srvres, size, query_data->extradata);
 		} else if (query_data->type == DNS_TYPE_TXT) {
-			GSList *lst = query_data->results;
+			GList *lst = query_data->results;
 
-			purple_debug_info("dnssrv", "found %d TXT entries\n", g_slist_length(lst));
+			purple_debug_info("dnssrv", "found %d TXT entries\n", g_list_length(lst));
 
 			if (query_data->cb.txt) {
 				query_data->results = NULL;
@@ -517,7 +518,7 @@
 	} else {
 		if (type == DNS_TYPE_SRV) {
 			PDNS_RECORD dr_tmp;
-			GSList *lst = NULL;
+			GList *lst = NULL;
 			DNS_SRV_DATA *srv_data;
 			PurpleSrvResponse *srvres;
 
@@ -535,14 +536,14 @@
 				srvres->port = srv_data->wPort;
 				srvres->weight = srv_data->wWeight;
 
-				lst = g_slist_prepend(lst, srvres);
+				lst = g_list_prepend(lst, srvres);
 			}
 
 			MyDnsRecordListFree(dr, DnsFreeRecordList);
 			query_data->results = purple_srv_sort(lst);
 		} else if (type == DNS_TYPE_TXT) {
 			PDNS_RECORD dr_tmp;
-			GSList *lst = NULL;
+			GList *lst = NULL;
 			DNS_TXT_DATA *txt_data;
 			PurpleTxtResponse *txtres;
 
@@ -563,7 +564,7 @@
 					s = g_string_append(s, txt_data->pStringArray[i]);
 				txtres->content = g_string_free(s, FALSE);
 
-				lst = g_slist_append(lst, txtres);
+				lst = g_list_append(lst, txtres);
 			}
 
 			MyDnsRecordListFree(dr, DnsFreeRecordList);
--- a/libpurple/dnssrv.h	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/dnssrv.h	Sun Jul 05 15:08:20 2009 +0000
@@ -52,10 +52,10 @@
 /**
  * Callback that returns the data retrieved from a DNS TXT lookup.
  *
- * @param responses   A GSList of PurpleTxtResponse objects.
+ * @param responses   A GList of PurpleTxtResponse objects.
  * @param data        The extra data passed to purple_txt_resolve.
  */
-typedef void (*PurpleTxtCallback)(GSList *responses, gpointer data);
+typedef void (*PurpleTxtCallback)(GList *responses, gpointer data);
 
 /**
  * Queries an SRV record.
--- a/libpurple/log.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/log.c	Sun Jul 05 15:08:20 2009 +0000
@@ -1129,7 +1129,7 @@
 				/* set->buddy is always set below */
 				set->normalized_name = g_strdup(purple_normalize(account, name));
 
-				/* Chat for .chat or .system at the end of the name to determine the type. */
+				/* Check for .chat or .system at the end of the name to determine the type. */
 				if (len >= 7) {
 					gchar *tmp = &name[len - 7];
 					if (purple_strequal(tmp, ".system")) {
--- a/libpurple/plugin.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/plugin.c	Sun Jul 05 15:08:20 2009 +0000
@@ -861,6 +861,7 @@
 				}
 
 				g_list_free(loader_info->exts);
+				loader_info->exts = NULL;
 			}
 
 			plugin_loaders = g_list_remove(plugin_loaders, plugin);
@@ -1222,6 +1223,12 @@
 	search_paths = g_list_append(search_paths, g_strdup(path));
 }
 
+GList *
+purple_plugins_get_search_paths()
+{
+	return search_paths;
+}
+
 void
 purple_plugins_unload_all(void)
 {
--- a/libpurple/plugin.h	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/plugin.h	Sun Jul 05 15:08:20 2009 +0000
@@ -512,6 +512,15 @@
 void purple_plugins_add_search_path(const char *path);
 
 /**
+ * Returns a list of plugin search paths.
+ *
+ * @constreturn A list of searched paths.
+ *
+ * @since 2.6.0
+ */
+GList *purple_plugins_get_search_paths(void);
+
+/**
  * Unloads all loaded plugins.
  */
 void purple_plugins_unload_all(void);
--- a/libpurple/plugins/perl/Makefile.am	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/plugins/perl/Makefile.am	Sun Jul 05 15:08:20 2009 +0000
@@ -99,7 +99,7 @@
 			${LN_S} -f $$srcloc/$$f $$f; \
 		done; \
 	fi
-	@cd common && $(perlpath) Makefile.PL $(PERL_MM_PARAMS)
+	@cd common && $(perlpath) Makefile.PL
 
 common/Makefile.PL: common/Makefile.PL.in $(top_builddir)/config.status
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
@@ -108,7 +108,7 @@
 	@for dir in $(perl_dirs); do \
 		cd $$dir && \
 		if [ ! -f Makefile ]; then \
-			$(perlpath) Makefile.PL $(PERL_MM_PARAMS); \
+			$(perlpath) Makefile.PL; \
 		fi && \
 		($(MAKE) CC="$(CC)" CCFLAGS="$(PERL_CFLAGS) $(CFLAGS)" $(PERL_EXTRA_OPTS) || \
 		 $(MAKE) CC="$(CC)" CCFLAGS="$(PERL_CFLAGS) $(CFLAGS)" $(PERL_EXTRA_OPTS)) && \
@@ -164,6 +164,7 @@
 	-I$(top_srcdir) \
 	-I$(top_srcdir)/libpurple \
 	-I$(top_builddir)/libpurple \
+	-DLIBDIR=\"$(libdir)/purple-$(PURPLE_MAJOR_VERSION)\" \
 	$(DEBUG_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	$(PLUGIN_CFLAGS) \
--- a/libpurple/plugins/perl/common/Makefile.PL.in	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/plugins/perl/common/Makefile.PL.in	Sun Jul 05 15:08:20 2009 +0000
@@ -13,4 +13,16 @@
     'INC'               => '-I. -I@srcdir@ -I@top_srcdir@ -I@top_srcdir@/libpurple @GLIB_CFLAGS@',
     'OBJECT'            => '$(O_FILES)', # link all the C files too
 #    'OPTIMIZE'          => '-g', # For debugging
+    'INSTALLDIRS'          => 'vendor',
+    'INSTALL_BASE'         => '$(prefix)',
+    'INSTALLVENDORARCH'    => '$(libdir)/purple-$(PURPLE_MAJOR_VERSION)/perl',
+    'INSTALLVENDORMAN3DIR' => '$(mandir)/man3',
+    'macro'                => {
+        'prefix'               => '@prefix@',
+        'exec_prefix'          => '@exec_prefix@',
+        'libdir'               => '@libdir@',
+        'mandir'               => '@mandir@',
+        'datarootdir'          => '@datarootdir@',
+        'PURPLE_MAJOR_VERSION' => '@PURPLE_MAJOR_VERSION@',
+    },
 );
--- a/libpurple/plugins/perl/perl.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/plugins/perl/perl.c	Sun Jul 05 15:08:20 2009 +0000
@@ -131,6 +131,7 @@
 #endif
 {
 	char *file = __FILE__;
+	GList *search_paths = purple_plugins_get_search_paths();
 	dXSUB_SYS;
 
 	/* This one allows dynamic loading of perl modules in perl scripts by
@@ -139,6 +140,17 @@
 #ifdef _WIN32
 	newXS("Win32CORE::bootstrap", boot_Win32CORE, file);
 #endif
+
+	while (search_paths != NULL) {
+		gchar *uselib;
+		const gchar *search_path = search_paths->data;
+		search_paths = g_list_next(search_paths);
+
+		uselib = g_strdup_printf("unshift @INC, \"%s%cperl\";",
+		                         search_path, G_DIR_SEPARATOR);
+		eval_pv(uselib, TRUE);
+		g_free(uselib);
+	}
 }
 
 static void
--- a/libpurple/protocols/jabber/jabber.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Sun Jul 05 15:08:20 2009 +0000
@@ -596,7 +596,7 @@
 }
 
 static void
-txt_resolved_cb(GSList *responses, gpointer data)
+txt_resolved_cb(GList *responses, gpointer data)
 {
 	JabberStream *js = data;
 
@@ -624,7 +624,7 @@
 		}
 		g_strfreev(token);
 		purple_txt_response_destroy(resp);
-		responses = g_slist_delete_link(responses, responses);
+		responses = g_list_delete_link(responses, responses);
 	}
 
 	if (js->bosh) {
@@ -634,8 +634,8 @@
 	}
 
 	if (responses) {
-		g_slist_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
-		g_slist_free(responses);
+		g_list_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
+		g_list_free(responses);
 	}
 }
 
@@ -908,7 +908,7 @@
 	if (type == JABBER_IQ_RESULT) {
 		if(js->registration) {
 			buf = g_strdup_printf(_("Registration of %s@%s successful"),
-				js->user->node, js->user->domain);
+					js->user->node, js->user->domain);
 			if(account->registration_cb)
 				(account->registration_cb)(account, TRUE, account->registration_cb_user_data);
 		} else {
--- a/libpurple/protocols/jabber/libxmpp.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/protocols/jabber/libxmpp.c	Sun Jul 05 15:08:20 2009 +0000
@@ -288,7 +288,7 @@
 	purple_account_user_split_set_reverse(split, FALSE);
 	prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
 
-	option = purple_account_option_bool_new(_("Require SSL/TLS"), "require_tls", FALSE);
+	option = purple_account_option_bool_new(_("Require SSL/TLS"), "require_tls", TRUE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
 											   option);
 
--- a/libpurple/protocols/myspace/message.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/protocols/myspace/message.c	Sun Jul 05 15:08:20 2009 +0000
@@ -19,9 +19,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include "internal.h"
+#include "myspace.h"
 #include "message.h"
-#include "myspace.h"
 
 static void msim_msg_debug_string_element(gpointer data, gpointer user_data);
 
--- a/libpurple/prpl.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/prpl.c	Sun Jul 05 15:08:20 2009 +0000
@@ -282,7 +282,8 @@
 
 	g_slist_free(list);
 
-	/* we get to re-use the last status we found */
+	/* The buddy is no longer online, they are therefore by definition not
+	 * still typing to us. */
 	if (!purple_status_is_online(status))
 		serv_got_typing_stopped(purple_account_get_connection(account), name);
 }
--- a/libpurple/purple-remote	Sun Jul 05 11:04:29 2009 +0000
+++ b/libpurple/purple-remote	Sun Jul 05 15:08:20 2009 +0000
@@ -161,7 +161,6 @@
                 purple.PurpleSavedstatusSetSubstatus(current, account, type, message)
                 purple.PurpleSavedstatusActivateForAccount(current, account)
         else:
-            accounts = purple.PurpleAccountsGetAllActive()
             saved = purple.PurpleSavedstatusNew("", status_type)
             purple.PurpleSavedstatusSetMessage(saved, message)
             purple.PurpleSavedstatusActivate(saved)
--- a/pidgin/gtkaccount.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/pidgin/gtkaccount.c	Sun Jul 05 15:08:20 2009 +0000
@@ -1990,8 +1990,9 @@
 				/* This is for when set_account() is called for a single account */
 				const char *path;
 				path = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon");
-				if (path != NULL && *path != '\0')
+				if ((path != NULL) && (*path != '\0')) {
 					img = purple_imgstore_new_from_file(path);
+				}
 			}
 		} else {
 			img = purple_buddy_icons_find_account_icon(account);
--- a/pidgin/gtkblist.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/pidgin/gtkblist.c	Sun Jul 05 15:08:20 2009 +0000
@@ -1575,7 +1575,7 @@
 
 	if (!(purple_blist_node_get_flags(node) & PURPLE_BLIST_NODE_FLAG_NO_SAVE)) {
 		show_offline = purple_blist_node_get_bool(node, "show_offline");
-		pidgin_new_item_from_stock(menu, show_offline ? _("Hide when offline") : _("Show when offline"),
+		pidgin_new_item_from_stock(menu, show_offline ? _("Hide When Offline") : _("Show When Offline"),
 				NULL, G_CALLBACK(gtk_blist_menu_showoffline_cb), node, 0, 0, NULL);
 	}
 
@@ -1759,7 +1759,7 @@
 				 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL);
 	if (!(purple_blist_node_get_flags(node) & PURPLE_BLIST_NODE_FLAG_NO_SAVE)) {
 		gboolean show_offline = purple_blist_node_get_bool(node, "show_offline");
-		pidgin_new_item_from_stock(menu, show_offline ? _("Hide when offline") : _("Show when offline"),
+		pidgin_new_item_from_stock(menu, show_offline ? _("Hide When Offline") : _("Show When Offline"),
 				NULL, G_CALLBACK(gtk_blist_menu_showoffline_cb), node, 0, 0, NULL);
 	}
 
@@ -6300,7 +6300,7 @@
 	selected = (gnode == selected_node);
 
 	if (!expanded) {
-		g_snprintf(group_count, sizeof(group_count), " (%d/%d)",
+		g_snprintf(group_count, sizeof(group_count), "%d/%d",
 		           purple_blist_get_group_online_count(group),
 		           purple_blist_get_group_size(group, FALSE));
 	}
@@ -6319,11 +6319,18 @@
 
 	esc = g_markup_escape_text(group->name, -1);
 	if (text_color) {
-		mark = g_strdup_printf("<span foreground='%s' font_desc='%s'><b>%s</b>%s</span>",
-							text_color, text_font, esc ? esc : "", group_count);
+		mark = g_strdup_printf("<span foreground='%s' font_desc='%s'><b>%s</b>%s%s%s</span>",
+		                       text_color, text_font,
+		                       esc ? esc : "",
+		                       !expanded ? " <span font_weight='light'>(</span>" : "",
+		                       group_count,
+		                       !expanded ? "<span font_weight='light'>)</span>" : "");
 	} else {
-		mark = g_strdup_printf("<span font_desc='%s'><b>%s</b>%s</span>",
-							text_font, esc ? esc : "", group_count);
+		mark = g_strdup_printf("<span font_desc='%s'><b>%s</b>%s%s%s</span>",
+		                       text_font, esc ? esc : "",
+		                       !expanded ? " <span font_weight='light'>(</span>" : "",
+		                       group_count,
+		                       !expanded ? "<span font_weight='light'>)</span>" : "");
 	}
 
 	g_free(esc);
--- a/pidgin/gtkconv.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/pidgin/gtkconv.c	Sun Jul 05 15:08:20 2009 +0000
@@ -1770,7 +1770,7 @@
 			g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free);
 	}
 
-	button = pidgin_new_item_from_stock(menu, _("Last said"), GTK_STOCK_INDEX,
+	button = pidgin_new_item_from_stock(menu, _("Last Said"), GTK_STOCK_INDEX,
 						G_CALLBACK(menu_last_said_cb), PIDGIN_CONVERSATION(conv), 0, 0, NULL);
 	g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free);
 	if (!get_mark_for_user(PIDGIN_CONVERSATION(conv), who))
@@ -8196,15 +8196,11 @@
 static void
 build_warn_close_dialog(PidginWindow *gtkwin)
 {
-	GtkWidget *label;
-	GtkWidget *vbox, *hbox;
-	GtkWidget *img;
+	GtkWidget *label, *vbox, *hbox, *img;
 
 	g_return_if_fail(warn_close_dialog == NULL);
 
-
-	warn_close_dialog = gtk_dialog_new_with_buttons(
-							_("Confirm close"),
+	warn_close_dialog = gtk_dialog_new_with_buttons(_("Confirm close"),
 							GTK_WINDOW(gtkwin->window), GTK_DIALOG_MODAL,
 							GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 							GTK_STOCK_CLOSE, GTK_RESPONSE_OK, NULL);
--- a/pidgin/gtkprefs.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/pidgin/gtkprefs.c	Sun Jul 05 15:08:20 2009 +0000
@@ -1457,7 +1457,7 @@
 	gtk_size_group_add_widget(sg, label);
 	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
 
-	vbox = pidgin_make_frame(ret, _("Conversation Window Hiding"));
+	vbox = pidgin_make_frame(ret, _("Conversation Window"));
 	label = pidgin_prefs_dropdown(vbox, _("_Hide new IM conversations:"),
 					PURPLE_PREF_STRING, PIDGIN_PREFS_ROOT "/conversations/im/hide_new",
 					_("Never"), "never",
@@ -1467,6 +1467,9 @@
 	gtk_size_group_add_widget(sg, label);
 	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
 
+#ifdef _WIN32
+	pidgin_prefs_checkbox(_("Minimi_ze new conversation windows"), PIDGIN_PREFS_ROOT "/win32/minimize_new_convs", vbox);
+#endif
 
 	/* All the tab options! */
 	vbox = pidgin_make_frame(ret, _("Tabs"));
@@ -1575,8 +1578,6 @@
 
 #ifdef _WIN32
 	pidgin_prefs_checkbox(_("F_lash window when IMs are received"), PIDGIN_PREFS_ROOT "/win32/blink_im", vbox);
-
-	pidgin_prefs_checkbox(_("Minimi_ze new conversation windows"), PIDGIN_PREFS_ROOT "/win32/minimize_new_convs", vbox);
 #endif
 
 	pidgin_prefs_labeled_spin_button(vbox,
@@ -1584,7 +1585,6 @@
 		PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines",
 		1, 8, NULL);
 
-
 #if GTK_CHECK_VERSION(2,4,0)
 	vbox = pidgin_make_frame(ret, _("Font"));
 	if (purple_running_gnome())
@@ -1593,7 +1593,11 @@
 		fontpref = pidgin_prefs_checkbox(_("Use font from _theme"), PIDGIN_PREFS_ROOT "/conversations/use_theme_font", vbox);
 
 	font_name = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/custom_font");
-	font_button = gtk_font_button_new_with_font(font_name ? font_name : NULL);
+	if ((font_name == NULL) || (*font_name == '\0')) {
+		font_button = gtk_font_button_new();
+	} else {
+		font_button = gtk_font_button_new_with_font(font_name);
+	}
 
 	gtk_font_button_set_show_style(GTK_FONT_BUTTON(font_button), TRUE);
 	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Conversation _font:"), NULL, font_button, FALSE, NULL);
@@ -2777,9 +2781,7 @@
 }
 
 static int
-prefs_notebook_add_page(const char *text,
-  		                GtkWidget *page,
-                        int ind)
+prefs_notebook_add_page(const char *text, GtkWidget *page, int ind)
 {
 #if GTK_CHECK_VERSION(2,4,0)
 	return gtk_notebook_append_page(GTK_NOTEBOOK(prefsnotebook), page, gtk_label_new(text));
--- a/pidgin/plugins/perl/Makefile.am	Sun Jul 05 11:04:29 2009 +0000
+++ b/pidgin/plugins/perl/Makefile.am	Sun Jul 05 15:08:20 2009 +0000
@@ -44,7 +44,7 @@
 			${LN_S} -f $$srcloc/$$f $$f; \
 		done; \
 	fi
-	@cd common && $(perlpath) Makefile.PL $(PERL_MM_PARAMS)
+	@cd common && $(perlpath) Makefile.PL
 
 common/Makefile.PL: common/Makefile.PL.in $(top_builddir)/config.status
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
@@ -53,7 +53,7 @@
 	@for dir in $(perl_dirs); do \
 		cd $$dir && \
 		if [ ! -f Makefile ]; then \
-			$(perlpath) Makefile.PL $(PERL_MM_PARAMS); \
+			$(perlpath) Makefile.PL; \
 		fi && \
 		($(MAKE) CC="$(CC)" CCFLAGS="$(PERL_CFLAGS) $(CFLAGS)" $(PERL_EXTRA_OPTS) || \
 		$(MAKE) CC="$(CC)" CCFLAGS="$(PERL_CFLAGS) $(CFLAGS)" $(PERL_EXTRA_OPTS)) && \
--- a/pidgin/plugins/perl/common/Makefile.PL.in	Sun Jul 05 11:04:29 2009 +0000
+++ b/pidgin/plugins/perl/common/Makefile.PL.in	Sun Jul 05 15:08:20 2009 +0000
@@ -13,4 +13,15 @@
     'OBJECT'        => '$(O_FILES)', # link all the C files too
     'TYPEMAPS'      => ["@top_srcdir@/libpurple/plugins/perl/common/typemap"],
 #    'OPTIMIZE'      => '-g', # For debugging.
+    'INSTALLDIRS'          => 'vendor',
+    'INSTALL_BASE'         => '$(prefix)',
+    'INSTALLVENDORARCH'    => '$(libdir)/pidgin/perl',
+    'INSTALLVENDORMAN3DIR' => '$(mandir)/man3',
+    'macro'                => {
+        'prefix'      => '@prefix@',
+        'exec_prefix' => '@exec_prefix@',
+        'libdir'      => '@libdir@',
+        'mandir'      => '@mandir@',
+        'datarootdir' => '@datarootdir@',
+    },
 );
--- a/pidgin/plugins/pidginrc.c	Sun Jul 05 11:04:29 2009 +0000
+++ b/pidgin/plugins/pidginrc.c	Sun Jul 05 15:08:20 2009 +0000
@@ -1,7 +1,13 @@
 /**
- * @file purplerc.c Purple gtk resource control plugin.
+ * @file pidginrc.c Pidgin GTK+ resource control plugin.
+ * @ingroup pidgin
+ */
+
+/* pidgin
  *
- * Copyright (C) 2005 Etan Reisner <deryni@eden.rutgers.edu>
+ * Pidgin is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -612,7 +618,7 @@
 	DISPLAY_VERSION,
 	N_("Provides access to commonly used gtkrc settings."),
 	N_("Provides access to commonly used gtkrc settings."),
-	"Etan Reisner <deryni@eden.rutgers.edu>",
+	"Etan Reisner <deryni@pidgin.im>",
 	PURPLE_WEBSITE,
 	purplerc_plugin_load,
 	purplerc_plugin_unload,