changeset 16684:a0cae757170f

merge of '65f2c26feb0bf8de0c50edb97ab36ff815b40daa' and '7cab5e68b0e84a50800a767e4c5ea7316591b846'
author Tim Ringenbach <marv@pidgin.im>
date Wed, 25 Apr 2007 01:12:47 +0000
parents 07b5cf0a46e2 (diff) 3c1c77f441c6 (current diff)
children 34618fedf5b9
files
diffstat 47 files changed, 459 insertions(+), 97 deletions(-) [+]
line wrap: on
line diff
--- a/.mtn-ignore	Mon Apr 23 21:25:06 2007 +0000
+++ b/.mtn-ignore	Wed Apr 25 01:12:47 2007 +0000
@@ -50,6 +50,7 @@
 libpurple/purple-client-bindings.h
 libpurple/purple-client-example
 libpurple/tests/check_libpurple
+libpurple/version.h
 libpurple/win32/libpurplerc.rc$
 libtool
 local.mak
--- a/ChangeLog.API	Mon Apr 23 21:25:06 2007 +0000
+++ b/ChangeLog.API	Wed Apr 25 01:12:47 2007 +0000
@@ -164,14 +164,23 @@
 	* gaim_gtk_buddy_icon_get_scale_size() was changed to accept an
 	  additional parameter which is used to determine what kind of
 	  scaling should be done, if any.
-    * purple_request_input(), purple_request_choice(),
-      purple_request_choice_varg(), purple_request_action(),
-      purple_request_action_varg(), purple_request_fields(),
-      purple_request_yes_no(), purple_request_ok_cancel(),
-      purple_request_accept_cancel(), purple_request_file(), and
-      purple_request_folder() was changed to accept account, who, and
-      conversation parameters for associating the request with an account, a
-      buddy, or a conversation.
+	* purple_request_input(), purple_request_choice(),
+	  purple_request_choice_varg(), purple_request_action(),
+	  purple_request_action_varg(), purple_request_fields(),
+	  purple_request_yes_no(), purple_request_ok_cancel(),
+	  purple_request_accept_cancel(), purple_request_file(), and
+	  purple_request_folder() was changed to accept account, who, and
+	  conversation parameters for associating the request with an account, a
+	  buddy, or a conversation.
+	* Significant changes to the buddy icon and imgstore APIs.  If you
+	  were using any of it, it's best to look at the header files or
+	  Doxygen documentation, but here are some significant changes:
+	    purple_buddy_icon_new() now takes ownership of ("frees") icon_data
+	    purple_buddy_icon_set_data(): likewise for data
+	    purple_buddy_icon_set_for_user(): likewise for data
+	    purple_buddy_icon_set_for_user() now takes a checksum parameter
+	    purple_imgstore_add() was renamed to purple_imgstore_add_with_id()
+	      which takes ownership of data
 
 	Removed:
 	* gaim_gtk_sound_{get,set}_mute() (replaced by the /gaim/gtk/sound/mute
--- a/Makefile.am	Mon Apr 23 21:25:06 2007 +0000
+++ b/Makefile.am	Wed Apr 25 01:12:47 2007 +0000
@@ -17,7 +17,8 @@
 		pidgin.apspec.in \
 		pidgin.spec.in \
 		pidgin.desktop.in \
-		po/Makefile.mingw
+		po/Makefile.mingw \
+		valgrind-suppressions
 
 noinst_HEADERS = config.h
 
@@ -25,7 +26,7 @@
 	cp pidgin.spec $(distdir)
 	rm $(distdir)/config.h
 
-distcheck-hook: libpurple/plugins/perl/common/Purple.pm pidgin/plugins/perl/common/GtkUI.pm
+distcheck-hook: libpurple/plugins/perl/common/Purple.pm pidgin/plugins/perl/common/Pidgin.pm
 #	cp libpurple/plugins/perl/common/Gaim.pm $(distdir)/libpurple/plugins/perl/common
 
 appsdir = $(datadir)/applications
--- a/configure.ac	Mon Apr 23 21:25:06 2007 +0000
+++ b/configure.ac	Wed Apr 25 01:12:47 2007 +0000
@@ -1,24 +1,67 @@
 dnl Process this file with autoconf to produce a configure script.
 AC_PREREQ([2.50])
 
-# Making releases:
-#   purple_micro_version += 1
-# if any functions have been added:
+# UPDATING VERSION NUMBERS FOR RELEASES
+#
+# purple_micro_version += 1
+#
+# If any functions have been added to libpurple, Pidgin, or Finch:
 #   purple_micro_version = 0
 #   purple_minor_version += 1
-# if backwards compatibility has been broken
-#   purple_minor_version = 0
+#   purple_lt_current += 1
+#
+# If backwards compatibility has been broken in libpurple, Pidgin, or Finch:
 #   purple_micro_version = 0
+#   purple_minor_version = 0
 #   purple_major_version += 1;
+#   purple_lt_current += 1
 #
+# purple_version_suffix should be similar to one of the following:
+#   For beta releases:          [beta2]
+#   For code under development: [devel]
+#   For production releases:    []
+#
+#
+# If any code has changed in libgnt:
+#   gnt_micro_version += 1
+#
+# If any functions have been added to libgnt:
+#   gnt_micro_version = 0
+#   gnt_minor_version += 1
+#   gnt_lt_current += 1
+#
+# If backwards compatibility has been broken in libgnt:
+#   gnt_micro_version = 0
+#   gnt_minor_version = 0
+#   gnt_major_version += 1;
+#   gnt_lt_current += 1
+#
+# gnt_version_suffix should be similar to one of the following:
+#   For beta releases:          [beta2]
+#   For code under development: [devel]
+#   For production releases:    []
+#
+# Make sure to update finch/libgnt/configure.ac with libgnt version changes.
+#
+m4_define([purple_lt_current], [0])
 m4_define([purple_major_version], [2])
 m4_define([purple_minor_version], [0])
 m4_define([purple_micro_version], [0])
-m4_define([purple_version_suffix], [devel])
+m4_define([purple_version_suffix], [beta7])
 m4_define([purple_version],
           [purple_major_version.purple_minor_version.purple_micro_version])
 m4_define([purple_display_version], purple_version[]m4_ifdef([purple_version_suffix],[purple_version_suffix]))
 
+m4_define([gnt_lt_current], [0])
+m4_define([gnt_major_version], [1])
+m4_define([gnt_minor_version], [0])
+m4_define([gnt_micro_version], [0])
+m4_define([gnt_version_suffix], [beta7])
+m4_define([gnt_version],
+          [gnt_major_version.gnt_minor_version.gnt_micro_version])
+m4_define([gnt_display_version], gnt_version[]m4_ifdef([gnt_version_suffix],[gnt_version_suffix]))
+
+
 AC_INIT([pidgin], [purple_display_version], [devel@pidgin.im])
 
 AC_CANONICAL_SYSTEM
@@ -35,12 +78,20 @@
 AC_SUBST(PURPLE_MICRO_VERSION)
 AC_SUBST(PURPLE_VERSION)
 
-m4_define([lt_current], [m4_eval(100 * purple_major_version + purple_minor_version)])
-m4_define([lt_age], [purple_minor_version])
-m4_define([lt_revision], [purple_micro_version])
-LT_VERSION_INFO="lt_current:lt_revision:lt_age"
-AC_SUBST(LT_VERSION_INFO)
+PURPLE_LT_VERSION_INFO="purple_lt_current:purple_micro_version:purple_minor_version"
+AC_SUBST(PURPLE_LT_VERSION_INFO)
 
+GNT_MAJOR_VERSION=gnt_major_version
+GNT_MINOR_VERSION=gnt_minor_version
+GNT_MICRO_VERSION=gnt_micro_version
+GNT_VERSION=[gnt_display_version]
+AC_SUBST(GNT_MAJOR_VERSION)
+AC_SUBST(GNT_MINOR_VERSION)
+AC_SUBST(GNT_MICRO_VERSION)
+AC_SUBST(GNT_VERSION)
+
+GNT_LT_VERSION_INFO="gnt_lt_current:gnt_micro_version:gnt_minor_version"
+AC_SUBST(GNT_LT_VERSION_INFO)
 
 AC_DEFINE(PIDGIN_NAME, "Pidgin", [The user-visible application name])
 
@@ -677,6 +728,7 @@
 	GADU_LIBS="$GADU_LIBS -lgadu"
 	AC_CHECK_LIB(gadu, gg_libgadu_version, [gadu_libs=yes], , $GADU_LIBS)
 fi
+GADU_CFLAGS=`echo $GADU_CFLAGS |$sedpath 's/-Wall//'`
 
 if test "x$gadu_libs" = "xyes"; then
 	AC_MSG_CHECKING(for libgadu GPL compatibility)
--- a/finch/gntblist.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/finch/gntblist.c	Wed Apr 25 01:12:47 2007 +0000
@@ -1699,8 +1699,17 @@
 
 	newmessage = gnt_entry_get_text(GNT_ENTRY(ggblist->statustext));
 	item = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(ggblist->status));
-	g_return_val_if_fail(item->type == STATUS_PRIMITIVE, FALSE);
-	newprim = item->u.prim;
+
+	switch (item->type) {
+		case STATUS_PRIMITIVE:
+			newprim = item->u.prim;
+			break;
+		case STATUS_SAVED_POPULAR:
+			newprim = purple_savedstatus_get_type(item->u.saved);
+			break;
+		default:
+			goto end;  /* 'New' or 'Saved' is selected, but this should never happen. */
+	}
 
 	if (newprim != prim || ((message && !newmessage) ||
 				(!message && newmessage) ||
@@ -1718,6 +1727,7 @@
 	}
 
 	gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree);
+end:
 	if (ggblist->typing)
 		g_source_remove(ggblist->typing);
 	ggblist->typing = 0;
--- a/finch/gntconv.h	Mon Apr 23 21:25:06 2007 +0000
+++ b/finch/gntconv.h	Wed Apr 25 01:12:47 2007 +0000
@@ -49,6 +49,7 @@
 	GntWidget *tv;            /* text-view */
 	GntWidget *menu;          /* future use */
 	GntWidget *info;
+	void *pad;
 
 	union
 	{
@@ -60,11 +61,14 @@
 struct _FinchConvChat
 {
 	GntWidget *userlist;       /* the userlist */
+	void *pad1;
+	void *pad2;
 };
 
 struct _FinchConvIm
 {
 	void *nothing_for_now;
+	void *something_for_later;
 };
 
 /**
--- a/finch/libgnt/Makefile.am	Mon Apr 23 21:25:06 2007 +0000
+++ b/finch/libgnt/Makefile.am	Wed Apr 25 01:12:47 2007 +0000
@@ -76,7 +76,7 @@
 	$(libgnt_la_headers)
 
 libgnt_la_DEPENDENCIES = 
-libgnt_la_LDFLAGS = -export-dynamic
+libgnt_la_LDFLAGS = -export-dynamic -version_info $(GNT_LT_VERSION_INFO) -no-undefined
 libgnt_la_LIBADD = \
 	$(GLIB_LIBS) \
 	$(GNT_LIBS) \
--- a/finch/libgnt/configure.ac	Mon Apr 23 21:25:06 2007 +0000
+++ b/finch/libgnt/configure.ac	Wed Apr 25 01:12:47 2007 +0000
@@ -1,10 +1,54 @@
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT([libgnt], [0.0.0dev], [devel@pidgin.im])
+AC_PREREQ([2.50])
+
+# UPDATING VERSION NUMBERS FOR RELEASES
+#
+# gnt_micro_version += 1
+#
+# If any functions have been added to libgnt:
+#   gnt_micro_version = 0
+#   gnt_minor_version += 1
+#   gnt_lt_current += 1
+#
+# If backwards compatibility has been broken in libgnt:
+#   gnt_micro_version = 0
+#   gnt_minor_version = 0
+#   gnt_major_version += 1;
+#   gnt_lt_current += 1
+#
+# gnt_version_suffix should be similar to one of the following:
+#   For beta releases:          [beta2]
+#   For code under development: [devel]
+#   For production releases:    []
+#
+# Make sure to update ../../configure.ac with libgnt version changes.
+#
+
+m4_define([gnt_lt_current], [0])
+m4_define([gnt_major_version], [1])
+m4_define([gnt_minor_version], [0])
+m4_define([gnt_micro_version], [0])
+m4_define([gnt_version_suffix], [beta7])
+m4_define([gnt_version],
+          [gnt_major_version.gnt_minor_version.gnt_micro_version])
+m4_define([gnt_display_version], gnt_version[]m4_ifdef([gnt_version_suffix],[gnt_version_suffix]))
+
+AC_INIT([libgnt], [gnt_display_version], [devel@pidgin.im])
 AC_CANONICAL_SYSTEM
 AM_CONFIG_HEADER(config.h)
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 
-AC_PREREQ([2.50])
+GNT_MAJOR_VERSION=gnt_major_version
+GNT_MINOR_VERSION=gnt_minor_version
+GNT_MICRO_VERSION=gnt_micro_version
+GNT_VERSION=[gnt_display_version]
+AC_SUBST(GNT_MAJOR_VERSION)
+AC_SUBST(GNT_MINOR_VERSION)
+AC_SUBST(GNT_MICRO_VERSION)
+AC_SUBST(GNT_VERSION)
+
+GNT_LT_VERSION_INFO="gnt_lt_current:gnt_micro_version:gnt_minor_version"
+AC_SUBST(GNT_LT_VERSION_INFO)
 
 AC_PATH_PROG(sedpath, sed)
 
--- a/libpurple/Makefile.am	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/Makefile.am	Wed Apr 25 01:12:47 2007 +0000
@@ -173,7 +173,7 @@
 libpurple_client_lib = libpurple-client.la
 
 libpurple_client_la_SOURCES = purple-client.c purple-client.h
-
+libpurple_client_la_LDFLAGS = -version-info $(PURPLE_LT_VERSION_INFO) -no-undefined
 libpurple_client_la_LIBADD = $(DBUS_LIBS)
 
 purple-client-bindings.c: dbus-analyze-functions.py $(dbus_exported)
@@ -221,7 +221,7 @@
 	$(dbus_headers)
 
 libpurple_la_DEPENDENCIES = $(STATIC_LINK_LIBS)
-libpurple_la_LDFLAGS = -export-dynamic -version-info $(LT_VERSION_INFO) -no-undefined
+libpurple_la_LDFLAGS = -export-dynamic -version-info $(PURPLE_LT_VERSION_INFO) -no-undefined
 libpurple_la_LIBADD = \
 	$(DBUS_LIBS) \
 	$(GLIB_LIBS) \
--- a/libpurple/Makefile.mingw	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/Makefile.mingw	Wed Apr 25 01:12:47 2007 +0000
@@ -117,7 +117,7 @@
 	sed -e 's/@PURPLE_VERSION@/$(PURPLE_VERSION)/g' \
 	    $@.in > $@
 
-$(OBJECTS): $(PURPLE_CONFIG_H)
+$(OBJECTS): $(PURPLE_CONFIG_H) $(PURPLE_VERSION_H)
 
 $(TARGET).dll $(TARGET).dll.a: $(OBJECTS)
 	$(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -Wl,--out-implib,$(TARGET).dll.a -o $(TARGET).dll
--- a/libpurple/account.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/account.c	Wed Apr 25 01:12:47 2007 +0000
@@ -802,7 +802,7 @@
 
 	xmlnode_free(node);
 
-	purple_buddy_icons_account_loaded_cb();
+	_purple_buddy_icons_account_loaded_cb();
 }
 
 
--- a/libpurple/blist.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/blist.c	Wed Apr 25 01:12:47 2007 +0000
@@ -607,7 +607,7 @@
 	xmlnode_free(purple);
 
 	/* This tells the buddy icon code to do its thing. */
-	purple_buddy_icons_blist_loaded_cb();
+	_purple_buddy_icons_blist_loaded_cb();
 }
 
 
--- a/libpurple/buddyicon.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/buddyicon.c	Wed Apr 25 01:12:47 2007 +0000
@@ -212,6 +212,10 @@
 {
 	const char *filename = purple_imgstore_get_filename(img);
 
+	/* If there's no filename, it can't be one of our images. */
+	if (filename == NULL)
+		return;
+
 	if (img == g_hash_table_lookup(icon_data_cache, filename))
 	{
 		purple_buddy_icon_data_uncache_file(filename);
@@ -694,11 +698,13 @@
 	{
 		const char *filename = purple_imgstore_get_filename(img);
 		purple_account_set_string(account, "buddy_icon", filename);
+		purple_account_set_int(account, "buddy_icon_timestamp", time(NULL));
 		ref_filename(filename);
 	}
 	else
 	{
 		purple_account_set_string(account, "buddy_icon", NULL);
+		purple_account_set_int(account, "buddy_icon_timestamp", 0);
 	}
 	unref_filename(old_icon);
 
@@ -721,7 +727,7 @@
 
 	if (old_img)
 		purple_imgstore_unref(old_img);
-	else
+	else if (old_icon)
 	{
 		/* The old icon may not have been loaded into memory.  In that
 		 * case, we'll need to uncache the filename.  The filenames
@@ -733,6 +739,25 @@
 	return img;
 }
 
+time_t
+purple_buddy_icons_get_account_icon_timestamp(PurpleAccount *account)
+{
+	time_t ret;
+
+	g_return_val_if_fail(account != NULL, 0);
+
+	ret = purple_account_get_int(account, "buddy_icon_timestamp", 0);
+
+	/* This deals with migration cases. */
+	if (ret == 0 && purple_account_get_string(account, "buddy_icon", NULL) != NULL)
+	{
+		ret = time(NULL);
+		purple_account_set_int(account, "buddy_icon_timestamp", ret);
+	}
+
+	return ret;
+}
+
 PurpleStoredImage *
 purple_buddy_icons_find_custom_icon(PurpleContact *contact)
 {
@@ -829,7 +854,7 @@
 
 	if (old_img)
 		purple_imgstore_unref(old_img);
-	else
+	else if (old_icon)
 	{
 		/* The old icon may not have been loaded into memory.  In that
 		 * case, we'll need to uncache the filename.  The filenames
@@ -842,7 +867,7 @@
 }
 
 void
-purple_buddy_icon_set_old_icons_dir(const char *dirname)
+_purple_buddy_icon_set_old_icons_dir(const char *dirname)
 {
 	old_icons_dir = g_strdup(dirname);
 }
@@ -887,9 +912,19 @@
 		FILE *file;
 		char *new_filename;
 
-		if (!read_icon_file(path, &icon_data, &icon_len) ||
-		    icon_data == NULL || icon_len > 0)
+		if (!read_icon_file(path, &icon_data, &icon_len))
 		{
+			g_free(path);
+			delete_buddy_icon_settings(node, setting_name);
+			return;
+		}
+
+		if (icon_data == NULL || icon_len <= 0)
+		{
+			/* This really applies to the icon_len check.
+			 * icon_data should never be NULL if
+			 * read_icon_file() returns TRUE. */
+			purple_debug_error("buddyicon", "Empty buddy icon file: %s\n", path);
 			delete_buddy_icon_settings(node, setting_name);
 			g_free(path);
 			return;
@@ -900,8 +935,11 @@
 		new_filename = purple_buddy_icon_data_calculate_filename(icon_data, icon_len);
 		if (new_filename == NULL)
 		{
+			purple_debug_error("buddyicon",
+				"New icon filename is NULL. This should never happen! "
+				"The old filename was: %s\n", path);
 			delete_buddy_icon_settings(node, setting_name);
-			return;
+			g_return_if_reached();
 		}
 
 		path = g_build_filename(dirname, new_filename, NULL);
@@ -967,14 +1005,14 @@
 	}
 	else
 	{
-		/* If the icon is gone, drop the setting... */
+		purple_debug_error("buddyicon", "Old icon file doesn't exist: %s\n", path);
 		delete_buddy_icon_settings(node, setting_name);
 		g_free(path);
 	}
 }
 
 void
-purple_buddy_icons_account_loaded_cb()
+_purple_buddy_icons_account_loaded_cb()
 {
 	const char *dirname = purple_buddy_icons_get_cache_dir();
 	GList *cur;
@@ -999,7 +1037,7 @@
 }
 
 void
-purple_buddy_icons_blist_loaded_cb()
+_purple_buddy_icons_blist_loaded_cb()
 {
 	PurpleBlistNode *node = purple_blist_get_root();
 	const char *dirname = purple_buddy_icons_get_cache_dir();
@@ -1124,7 +1162,8 @@
 		g_direct_hash, g_direct_equal,
 		NULL, (GFreeFunc)g_hash_table_destroy);
 
-	icon_data_cache = g_hash_table_new(g_str_hash, g_str_equal);
+	icon_data_cache = g_hash_table_new_full(g_str_hash, g_str_equal,
+	                                        g_free, NULL);
 	icon_file_cache = g_hash_table_new_full(g_str_hash, g_str_equal,
 	                                        g_free, NULL);
 	pointer_icon_cache = g_hash_table_new(g_direct_hash, g_direct_equal);
--- a/libpurple/buddyicon.h	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/buddyicon.h	Wed Apr 25 01:12:47 2007 +0000
@@ -261,6 +261,19 @@
                                     guchar *icon_data, size_t icon_len);
 
 /**
+ * Returns the timestamp of when the icon was set.
+ *
+ * This is intended for use in protocols that require a timestamp for
+ * buddy icon update reasons.
+ *
+ * @param account The account
+ *
+ * @return The time the icon was set, or 0 if an error occurred.
+ */
+time_t
+purple_buddy_icons_get_account_icon_timestamp(PurpleAccount *account);
+
+/**
  * Returns the custom buddy icon image for a contact.
  *
  * The caller owns a reference to the image in the store, and must dereference
--- a/libpurple/core.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/core.c	Wed Apr 25 01:12:47 2007 +0000
@@ -401,8 +401,9 @@
 			if (!strcmp(entry, "logs"))
 			{
 				char buf[MAXPATHLEN];
+				size_t linklen;
 
-				if (readlink(name, buf, sizeof(buf) - 1) == -1)
+				if ((linklen = readlink(name, buf, sizeof(buf) - 1) == -1))
 				{
 					purple_debug_error("core", "Error reading symlink %s: %s\n",
 					                   name, strerror(errno));
@@ -412,7 +413,7 @@
 					g_free(old_user_dir);
 					return FALSE;
 				}
-				buf[sizeof(buf) - 1] = '\0';
+				buf[linklen] = '\0';
 
 				logs_dir = g_strconcat(user_dir, G_DIR_SEPARATOR_S "logs", NULL);
 
@@ -640,7 +641,7 @@
 	}
 
 	old_icons_dir = g_build_filename(old_user_dir, "icons", NULL);
-	purple_buddy_icon_set_old_icons_dir(old_icons_dir);
+	_purple_buddy_icon_set_old_icons_dir(old_icons_dir);
 	g_free(old_icons_dir);
 
 	g_free(old_user_dir);
--- a/libpurple/dnsquery.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/dnsquery.c	Wed Apr 25 01:12:47 2007 +0000
@@ -140,7 +140,7 @@
  * Begin the DNS resolver child process functions.
  */
 #ifdef HAVE_SIGNAL_H
-static void
+G_GNUC_NORETURN static void
 trap_gdb_bug()
 {
 	const char *message =
@@ -158,7 +158,7 @@
 }
 #endif
 
-static void
+G_GNUC_NORETURN static void
 purple_dnsquery_resolver_run(int child_out, int child_in, gboolean show_debug)
 {
 	dns_params_t dns_params;
--- a/libpurple/dnssrv.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/dnssrv.c	Wed Apr 25 01:12:47 2007 +0000
@@ -92,7 +92,7 @@
 
 #ifndef _WIN32
 
-static void
+G_GNUC_NORETURN static void
 resolve(int in, int out)
 {
 	GList *ret = NULL;
--- a/libpurple/gaim-compat.h	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/gaim-compat.h	Wed Apr 25 01:12:47 2007 +0000
@@ -345,7 +345,7 @@
 #define gaim_buddy_icon_update   purple_buddy_icon_update
 
 #define gaim_buddy_icon_set_data(icon, data, len) \
-        purple_buddy_icon_set_protocol_data(icon, g_memdup(data, len), len, NULL);
+        purple_buddy_icon_set_data(icon, g_memdup(data, len), len, NULL);
 
 #define gaim_buddy_icon_get_account   purple_buddy_icon_get_account
 #define gaim_buddy_icon_get_username  purple_buddy_icon_get_username
@@ -353,7 +353,7 @@
 #define gaim_buddy_icon_get_type      purple_buddy_icon_get_extension
 
 #define gaim_buddy_icons_set_for_user(icon, data, len) \
-        purple_buddy_icons_set_for_user(icon, g_memdup(data, len), len)
+        purple_buddy_icons_set_for_user(icon, g_memdup(data, len), len, NULL)
 #define gaim_buddy_icons_find           purple_buddy_icons_find
 #define gaim_buddy_icons_set_caching    purple_buddy_icons_set_caching
 #define gaim_buddy_icons_is_caching     purple_buddy_icons_is_caching
@@ -961,7 +961,8 @@
 
 #define GaimStoredImage  PurpleStoredImage
 
-#define gaim_imgstore_add(data, size, filename) purple_imgstore_add_with_id(g_memdup(data, size), size, filename)
+#define gaim_imgstore_add(data, size, filename) \
+        purple_imgstore_add_with_id(g_memdup(data, size), size, filename)
 #define gaim_imgstore_get           purple_imgstore_find_by_id
 #define gaim_imgstore_get_data      purple_imgstore_get_data
 #define gaim_imgstore_get_size      purple_imgstore_get_size
--- a/libpurple/internal.h	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/internal.h	Wed Apr 25 01:12:47 2007 +0000
@@ -187,17 +187,17 @@
 /* This is for the accounts code to notify the buddy icon code that
  * it's done loading.  We may want to replace this with a signal. */
 void
-purple_buddy_icons_account_loaded_cb(void);
+_purple_buddy_icons_account_loaded_cb(void);
 
 /* This is for the buddy list to notify the buddy icon code that
  * it's done loading.  We may want to replace this with a signal. */
 void
-purple_buddy_icons_blist_loaded_cb(void);
+_purple_buddy_icons_blist_loaded_cb(void);
 
 /* This is for the purple_core_migrate() code to tell the buddy
  * icon subsystem about the old icons directory so it can
  * migrate any icons in use. */
 void
-purple_buddy_icon_set_old_icons_dir(const char *dirname);
+_purple_buddy_icon_set_old_icons_dir(const char *dirname);
 
 #endif /* _PURPLE_INTERNAL_H_ */
--- a/libpurple/notify.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/notify.c	Wed Apr 25 01:12:47 2007 +0000
@@ -521,6 +521,7 @@
 	}
 	
 	g_list_free(user_info->user_info_entries);
+	g_free(user_info);
 }
 
 GList *
--- a/libpurple/plugins/psychic.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/plugins/psychic.c	Wed Apr 25 01:12:47 2007 +0000
@@ -9,6 +9,7 @@
 #include "signals.h"
 #include "status.h"
 #include "version.h"
+#include "privacy.h"
 
 #include "plugin.h"
 #include "pluginpref.h"
@@ -47,6 +48,11 @@
     return;
   }
 
+  if(FALSE == purple_privacy_check(acct, name)) {
+    purple_debug_info("psychic", "user %s is blocked", name);
+    return;
+  }
+
   gconv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, acct);
   if(! gconv) {
     purple_debug_info("psychic", "no previous conversation exists\n");
--- a/libpurple/protocols/jabber/auth.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/protocols/jabber/auth.c	Wed Apr 25 01:12:47 2007 +0000
@@ -819,7 +819,7 @@
 		} else {
 			response = xmlnode_new("response");
 			xmlnode_set_namespace(response, "urn:ietf:params:xml:ns:xmpp-sasl");
-			if (c_out) {
+			if (clen > 0) {
 				enc_out = purple_base64_encode((unsigned char*)c_out, clen);
 				xmlnode_insert_data(response, enc_out, -1);
 				g_free(enc_out);
--- a/libpurple/protocols/msn/slp.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/protocols/msn/slp.c	Wed Apr 25 01:12:47 2007 +0000
@@ -955,7 +955,7 @@
 
 	if (obj == NULL)
 	{
-/*		purple_buddy_icons_set_for_user(account, user->passport, NULL, 0, NULL); */
+		purple_buddy_icons_set_for_user(account, user->passport, NULL, 0, NULL);
 		return;
 	}
 
--- a/libpurple/protocols/oscar/oscar.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Wed Apr 25 01:12:47 2007 +0000
@@ -1941,9 +1941,9 @@
 		purple_debug_info("oscar",
 				   "Sending buddy icon to %s (%d bytes)\n",
 				   userinfo->sn, len);
-		/* TODO: XXX: FIXME: Does this actually need the mtime of the file? */
 		aim_im_sendch2_icon(od, userinfo->sn, data, len,
-			time(NULL), aimutil_iconsum(data, len));
+			purple_buddy_icons_get_account_icon_timestamp(account),
+			aimutil_iconsum(data, len));
 	}
 	purple_imgstore_unref(img);
 
@@ -4232,8 +4232,7 @@
 			gconstpointer data = purple_imgstore_get_data(img);
 			args.iconlen   = purple_imgstore_get_size(img);
 			args.iconsum   = aimutil_iconsum(data, args.iconlen);
-			/* TODO: XXX: FIXME: Deal with the timestamp issue. */
-			args.iconstamp = time(NULL);
+			args.iconstamp = purple_buddy_icons_get_account_icon_timestamp(account);
 
 			if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) {
 				bi->ico_informed = FALSE;
--- a/libpurple/protocols/silc/buddy.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/protocols/silc/buddy.c	Wed Apr 25 01:12:47 2007 +0000
@@ -1706,7 +1706,7 @@
 	if (!mime)
 		return;
 
-	t = purple_util_get_image_extension(purple_imgstore_get_data(img), purple_imgstore_get_size(img));
+	t = purple_imgstore_get_extension(img);
 	if (!t || !strcmp(t, "icon")) {
 		silc_mime_free(mime);
 		return;
--- a/libpurple/savedstatuses.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/savedstatuses.c	Wed Apr 25 01:12:47 2007 +0000
@@ -154,7 +154,7 @@
 }
 
 /**
- * A magic number is calcuated for each status, and then the
+ * A magic number is calculated for each status, and then the
  * statuses are ordered by the magic number.  The magic number
  * is the date the status was last used offset by one day for
  * each time the status has been used (but only by 10 days at
--- a/libpurple/win32/global.mak	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/win32/global.mak	Wed Apr 25 01:12:47 2007 +0000
@@ -48,6 +48,7 @@
 PIDGIN_CONFIG_H := $(PIDGIN_TREE_TOP)/config.h
 PURPLE_CONFIG_H := $(PIDGIN_TREE_TOP)/config.h
 PIDGIN_IDLETRACK_DLL := $(PIDGIN_IDLETRACK_TOP)/idletrack.dll
+PURPLE_VERSION_H := $(PURPLE_TOP)/version.h
 PURPLE_DLL := $(PURPLE_TOP)/libpurple.dll
 PURPLE_PERL_DLL := $(PURPLE_PERL_TOP)/perl.dll
 PIDGIN_DLL := $(PIDGIN_TOP)/pidgin.dll
--- a/libpurple/win32/targets.mak	Mon Apr 23 21:25:06 2007 +0000
+++ b/libpurple/win32/targets.mak	Wed Apr 25 01:12:47 2007 +0000
@@ -8,7 +8,14 @@
 $(PIDGIN_CONFIG_H): $(PIDGIN_TREE_TOP)/config.h.mingw
 	cp $(PIDGIN_TREE_TOP)/config.h.mingw $(PIDGIN_CONFIG_H)
 
-$(PURPLE_DLL) $(PURPLE_DLL).a:
+$(PURPLE_VERSION_H): $(PURPLE_VERSION_H).in $(PIDGIN_TREE_TOP)/configure.ac
+	cp $(PURPLE_VERSION_H).in $(PURPLE_VERSION_H)
+	awk 'BEGIN {FS="[\\(\\)\\[\\]]"} \
+	  /^m4_define..purple_major_version/ {system("sed -i -e s/@PURPLE_MAJOR_VERSION@/"$$5"/ $(PURPLE_VERSION_H)");} \
+	  /^m4_define..purple_minor_version/ {system("sed -i -e s/@PURPLE_MINOR_VERSION@/"$$5"/ $(PURPLE_VERSION_H)");} \
+	  /^m4_define..purple_micro_version/ {system("sed -i -e s/@PURPLE_MICRO_VERSION@/"$$5"/ $(PURPLE_VERSION_H)"); exit}' $(PIDGIN_TREE_TOP)/configure.ac
+
+$(PURPLE_DLL) $(PURPLE_DLL).a: $(PURPLE_VERSION_H)
 	$(MAKE) -C $(PURPLE_TOP) -f $(MINGW_MAKEFILE) libpurple.dll
 
 $(PURPLE_PERL_DLL) $(PURPLE_PERL_DLL).a:
--- a/pidgin.spec.in	Mon Apr 23 21:25:06 2007 +0000
+++ b/pidgin.spec.in	Wed Apr 25 01:12:47 2007 +0000
@@ -6,10 +6,10 @@
 # When not doing betas comment this out
 # NOTE: %defines in spec files are evaluated in comments so the correct
 #       way to comment it out is to replace the % with #
-#define beta 7
+%define beta 7
 
 %if 0%{?beta}
-%define pidginver %(echo "@VERSION@"|sed -e 's/dev//; s/beta.*//')
+%define pidginver %(echo "@VERSION@"|sed -e 's/dev.*//; s/beta.*//')
 %else
 %define pidginver @VERSION@
 %endif
@@ -237,24 +237,24 @@
 find $RPM_BUILD_ROOT -type f -name '*.bs' -empty -exec rm -f {} ';'
 
 %if 0%{!?_with_howl:1} && 0%{!?_with_avahi:1}
-rm -f $RPM_BUILD_ROOT%{_libdir}/libpurple/libbonjour.so
+rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/libbonjour.so
 %endif
 
 %if 0%{!?_with_meanwhile:1}
-rm -f $RPM_BUILD_ROOT%{_libdir}/libpurple/libsametime.so
+rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/libsametime.so
 %endif
 
 %if 0%{!?_with_mono:1}
-rm -f $RPM_BUILD_ROOT%{_libdir}/libpurple/mono.so
-rm -f $RPM_BUILD_ROOT%{_libdir}/libpurple/*.dll
+rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/mono.so
+rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/*.dll
 %endif
 
 %if 0%{?_without_silc:1}
-rm -f $RPM_BUILD_ROOT%{_libdir}/libpurple/libsilcpurple.so
+rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/libsilcpurple.so
 %endif
 
 %if 0%{?_without_tcl:1}
-rm -f $RPM_BUILD_ROOT%{_libdir}/libpurple/tcl.so
+rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/tcl.so
 %endif
 
 %if 0%{?_without_text:1}
@@ -265,7 +265,7 @@
 
 %find_lang %{name}
 
-find $RPM_BUILD_ROOT%{_libdir}/libpurple -xtype f -print | \
+find $RPM_BUILD_ROOT%{_libdir}/purple-2 -xtype f -print | \
         sed "s@^$RPM_BUILD_ROOT@@g" | \
         grep -v /libbonjour.so | \
         grep -v /libsametime.so | \
@@ -333,13 +333,12 @@
 %doc %{_mandir}/man3*/*
 
 %dir %{_libdir}/pidgin
-%dir %{perl_vendorarch}/Purple
-%attr(755, root, root) %{perl_vendorarch}/Purple/*
-%attr(755, root, root) %{perl_vendorarch}/auto/Purple/GtkUI*
+%attr(755, root, root) %{perl_vendorarch}/Pidgin.pm
+%attr(755, root, root) %{perl_vendorarch}/auto/Pidgin
 
 %{_bindir}/pidgin
 %{_datadir}/pixmaps/pidgin
-%{_datadir}/icons/hicolor/*/apps/pidgin.png
+%{_datadir}/icons/hicolor/*/apps/pidgin.*
 %dir %{_datadir}/sounds/pidgin
 %{_datadir}/sounds/pidgin/*
 %{_datadir}/applications/*
@@ -352,9 +351,7 @@
 %{_libdir}/libpurple.so.*
 %dir %{_libdir}/purple-2
 %attr(755, root, root) %{perl_vendorarch}/Purple.pm
-%dir %{perl_vendorarch}/auto/Purple
-%attr(755, root, root) %{perl_vendorarch}/auto/Purple/Purple.so
-%attr(755, root, root) %{perl_vendorarch}/auto/Purple/autosplit.ix
+%attr(755, root, root) %{perl_vendorarch}/auto/Purple
 
 %{_datadir}/pixmaps/purple
 
@@ -365,7 +362,6 @@
 %{_bindir}/purple-send-async
 %{_bindir}/purple-url-handler
 %{_libdir}/libpurple-client.so.*
-%doc README.dbus
 %doc libpurple/purple-notifications-example
 %endif
 
@@ -381,7 +377,6 @@
 %doc ChangeLog.API
 %doc HACKING
 %doc PLUGIN_HOWTO
-%doc PROGRAMMING_NOTES
 
 %dir %{_includedir}/libpurple
 %{_includedir}/libpurple/*.h
@@ -397,22 +392,22 @@
 %files -n libpurple-bonjour
 %defattr(-, root, root)
 
-%{_libdir}/libpurple/libbonjour.*
+%{_libdir}/purple-2/libbonjour.*
 %endif
 
 %if 0%{?_with_meanwhile:1}
 %files -n libpurple-meanwhile
 %defattr(-, root, root)
 
-%{_libdir}/libpurple/libsametime.*
+%{_libdir}/purple-2/libsametime.*
 %endif
 
 %if 0%{?_with_mono:1}
 %files libpurple-mono
 %defattr(-, root, root)
 
-%{_libdir}/libpurple/mono.so
-%{_libdir}/libpurple/*.dll
+%{_libdir}/purple-2/mono.so
+%{_libdir}/purple-2/*.dll
 %endif
 
 %if 0%{!?_without_text:1}
@@ -436,6 +431,9 @@
 %endif
 
 %changelog
+* Sun Apr 29 2007 Stu Tomlinson <stu@nosnilmot.com>
+- Update to reflect perl Purple::GtkUI -> Pidgin change
+
 * Wed Apr 25 2007 Stu Tomlinson <stu@nosnilmot.com>
 - Update libpurple to pick up plugins in %%{_libdir}/purple
 
--- a/pidgin/gtkconv.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/pidgin/gtkconv.c	Wed Apr 25 01:12:47 2007 +0000
@@ -2370,8 +2370,13 @@
 
 	gtkconv = PIDGIN_CONVERSATION(conv);
 	account = purple_conversation_get_account(conv);
-	if(account && account->gc)
+
+	if(account && account->gc) {
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl);
+	} else {
+		gtkconv->u.im->icon_timer = 0;
+		return FALSE;
+	}
 
 	gtkconv->auto_resize = TRUE;
 	g_idle_add(reset_auto_resize_cb, gtkconv);
--- a/pidgin/gtkdocklet.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/pidgin/gtkdocklet.c	Wed Apr 25 01:12:47 2007 +0000
@@ -118,6 +118,9 @@
 	DockletStatus newstatus = DOCKLET_STATUS_OFFLINE;
 	gboolean pending = FALSE, connecting = FALSE;
 
+	/* get the current savedstatus */
+	saved_status = purple_savedstatus_get_current();
+
 	/* determine if any ims have unseen messages */
 	convs = get_pending_list(DOCKLET_TOOLTIP_LINE_LIMIT);
 
@@ -168,7 +171,10 @@
 		g_list_free(convs);
 
 	} else if (ui_ops->set_tooltip) {
-		ui_ops->set_tooltip(PIDGIN_NAME);
+		char *tooltip_text = g_strconcat(PIDGIN_NAME " - ",
+			purple_savedstatus_get_title(saved_status), NULL);
+		ui_ops->set_tooltip(tooltip_text);
+		g_free(tooltip_text);
 	}
 
 	for(l = purple_accounts_get_all(); l != NULL; l = l->next) {
@@ -187,7 +193,6 @@
 			connecting = TRUE;
 	}
 
-	saved_status = purple_savedstatus_get_current();
 	prim = purple_savedstatus_get_type(saved_status);
 	if (pending)
 		newstatus = DOCKLET_STATUS_PENDING;
--- a/pidgin/gtkrequest.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/pidgin/gtkrequest.c	Wed Apr 25 01:12:47 2007 +0000
@@ -472,7 +472,9 @@
 
 	if (title != NULL)
 		gtk_window_set_title(GTK_WINDOW(dialog), title);
-
+#ifdef _WIN32
+		gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE);
+#endif
 
 	gtk_dialog_add_button(GTK_DIALOG(dialog),
 			      text_to_stock(cancel_text), 0);
@@ -580,6 +582,9 @@
 
 	if (title != NULL)
 		gtk_window_set_title(GTK_WINDOW(dialog), title);
+#ifdef _WIN32
+		gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE);
+#endif
 
 	for (i = 0; i < action_count; i++) {
 		gtk_dialog_add_button(GTK_DIALOG(dialog),
@@ -1068,6 +1073,9 @@
 
 	if (title != NULL)
 		gtk_window_set_title(GTK_WINDOW(win), title);
+#ifdef _WIN32
+		gtk_window_set_title(GTK_WINDOW(win), PIDGIN_ALERT_TITLE);
+#endif
 
 	gtk_window_set_role(GTK_WINDOW(win), "multifield");
 	gtk_container_set_border_width(GTK_CONTAINER(win), PIDGIN_HIG_BORDER);
@@ -1542,7 +1550,8 @@
 		else
 			gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(filesel), filename);
 	}
-	if ((current_folder != NULL) && (*current_folder != '\0')) {
+	if ((filename == NULL || *filename == '\0' || !g_file_test(filename, G_FILE_TEST_EXISTS)) &&
+				(current_folder != NULL) && (*current_folder != '\0')) {
 		folder_set = gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), current_folder);
 	}
 
@@ -1609,7 +1618,7 @@
 	data->cbs[0] = cancel_cb;
 	data->cbs[1] = ok_cb;
 	data->u.file.savedialog = FALSE;
-	
+
 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
 	dirsel = gtk_file_chooser_dialog_new(
 						title ? title : _("Select Folder..."),
--- a/pidgin/gtksavedstatuses.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/pidgin/gtksavedstatuses.c	Wed Apr 25 01:12:47 2007 +0000
@@ -1677,7 +1677,7 @@
 	GList *sorted, *cur;
 	int i = 0;
 	int index = -1;
-	GdkPixbuf *pixbuf, *emblem;
+	GdkPixbuf *pixbuf;
 	GtkTreeIter iter;
 	GtkCellRenderer *text_rend;
 	GtkCellRenderer *icon_rend;
--- a/pidgin/gtkstatusbox.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/pidgin/gtkstatusbox.c	Wed Apr 25 01:12:47 2007 +0000
@@ -1447,10 +1447,10 @@
 					size_t len = 0;
 					if (filename)
 						data = pidgin_convert_buddy_icon(plug, filename, &len);
-					img = purple_buddy_icons_set_account_icon(box->account, data, len);
-					purple_account_set_buddy_icon_path(box->account, filename);
+					img = purple_buddy_icons_set_account_icon(account, data, len);
+					purple_account_set_buddy_icon_path(account, filename);
 
-					purple_account_set_bool(box->account, "use-global-buddyicon", (filename != NULL));
+					purple_account_set_bool(account, "use-global-buddyicon", (filename != NULL));
 				}
 			}
 		}
@@ -2071,7 +2071,9 @@
 pidgin_status_box_set_buddy_icon(PidginStatusBox *status_box, PurpleStoredImage *img)
 {
 	purple_imgstore_unref(status_box->buddy_icon_img);
-	status_box->buddy_icon_img = purple_imgstore_ref(img);
+	status_box->buddy_icon_img = img;
+	if (status_box->buddy_icon_img != NULL)
+		purple_imgstore_ref(status_box->buddy_icon_img);
 
 	pidgin_status_box_redisplay_buddy_icon(status_box);
 }
@@ -2225,7 +2227,8 @@
 							PurpleSavedStatusSub *sub = purple_savedstatus_get_substatus(ss, acct);
 							if (sub) {
 								const PurpleStatusType *sub_type = purple_savedstatus_substatus_get_type(sub);
-								if (!strcmp(purple_status_type_get_id(sub_type),
+								const char *subtype_status_id = purple_status_type_get_id(sub_type);
+								if (subtype_status_id && !strcmp(subtype_status_id,
 										purple_status_type_get_id(acct_status_type)))
 									found = TRUE;
 							}
--- a/pidgin/gtkutils.c	Mon Apr 23 21:25:06 2007 +0000
+++ b/pidgin/gtkutils.c	Wed Apr 25 01:12:47 2007 +0000
@@ -3070,7 +3070,6 @@
         for (i = 1; i < height - 1; i++) {
                 row = pixels + (i*rowstride);
                 if (row[3] != 0xff || row[rowstride-1] != 0xff) {
-                        printf("0: %d, last: %d\n", row[3], row[rowstride-1]);
                         return FALSE;
                 }
         }
Binary file pidgin/pixmaps/animations/16/connect0.png has changed
Binary file pidgin/pixmaps/animations/16/connect1.png has changed
Binary file pidgin/pixmaps/animations/16/connect2.png has changed
Binary file pidgin/pixmaps/animations/16/connect3.png has changed
Binary file pidgin/pixmaps/animations/16/connect4.png has changed
Binary file pidgin/pixmaps/animations/16/connect5.png has changed
Binary file pidgin/pixmaps/animations/16/connect6.png has changed
Binary file pidgin/pixmaps/animations/16/connect7.png has changed
Binary file pidgin/pixmaps/animations/16/connect8.png has changed
Binary file pidgin/pixmaps/animations/16/connect9.png has changed
Binary file pidgin/pixmaps/logo.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/valgrind-suppressions	Wed Apr 25 01:12:47 2007 +0000
@@ -0,0 +1,154 @@
+{
+   X oddness 1
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:_XReply
+}
+{
+   NSS
+   Memcheck:Cond
+   obj:/usr/lib/libsoftokn3.so
+   obj:/usr/lib/libsoftokn3.so
+   obj:/usr/lib/libsoftokn3.so
+   obj:/usr/lib/libsoftokn3.so
+}
+{
+   X oddness 2
+   Memcheck:Param
+   writev(vector[...])
+   fun:writev
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:_X11TransWritev
+   fun:_XSend
+}
+{
+   X oddness 3
+   Memcheck:Cond
+   fun:XcursorImageHash
+   fun:XcursorNoticePutBitmap
+   fun:_XNoticePutBitmap
+   fun:XPutImage
+}
+{
+   X oddness 4
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:XFlush
+}
+{
+   X oddness 5
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:XDrawLine
+}
+{
+   X oddness 6
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:_XEventsQueued
+}
+{
+   File selector
+   Memcheck:Value4
+   fun:_itoa_word
+   fun:_IO_vfprintf_internal
+   fun:_IO_vsprintf_internal
+   fun:_IO_sprintf
+}
+{
+   File selector 2
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:XRenderComposite
+}
+{
+   TCL leak
+   Memcheck:Leak
+   fun:malloc
+   fun:TclpAlloc
+   fun:Tcl_Alloc
+   fun:Tcl_StaticPackage
+}
+{
+   FontConfig Maybe
+   Memcheck:Leak
+   fun:malloc
+   fun:FcStrCopy
+   fun:FcStrSetAdd
+   fun:FcLangSetCopy
+}
+{
+   File selector 3
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:_XFlushGCCache
+}
+{
+   File selector 4
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:XCreateGC
+}
+{
+   Something else
+   Memcheck:Param
+   write(buf)
+   fun:__write_nocancel
+   fun:_X11TransWrite
+   obj:/usr/X11R6/lib/libX11.so.6.2
+   fun:_XSetClipRectangles
+}
+{
+   New conversation windows
+   Memcheck:Cond
+   obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
+   obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
+   obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
+   obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
+}
+{
+   New conversation windows 2
+   Memcheck:Cond
+   obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
+   obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
+   obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
+   obj:/usr/lib/libgobject-2.0.so.0.400.8
+}
+{
+   NSS Init
+   Memcheck:Leak
+   fun:malloc
+   fun:PR_Malloc
+   fun:PR_CreateStack
+   fun:_PR_InitFdCache
+   fun:_PR_InitIO
+   fun:_PR_ImplicitInitialization
+   fun:PR_Init
+   fun:rsa_nss_init
+   fun:GE_plugin_load
+   fun:gaim_plugin_load
+   fun:gaim_plugins_load_saved
+   fun:main
+}
+