changeset 29680:ce876e58cf6a

propagate from branch 'im.pidgin.pidgin' (head 6a70c2c1325aeb644bff8476f94c5a25f83044fb) to branch 'im.pidgin.cpw.attention_ui' (head d6820cc133d1dfee9b288131b6b7a92fb082e658)
author Marcus Lundblad <ml@update.uu.se>
date Wed, 22 Apr 2009 07:56:16 +0000
parents 474a0cb44f58 (diff) e57315a062cb (current diff)
children 4548c114e953
files libpurple/protocols/jabber/jabber.c libpurple/protocols/jabber/message.c libpurple/protocols/yahoo/yahoo.c pidgin/gtkimhtmltoolbar.c pidgin/gtkimhtmltoolbar.h
diffstat 34 files changed, 417 insertions(+), 207 deletions(-) [+]
line wrap: on
line diff
--- a/AUTHORS	Mon Apr 13 13:37:33 2009 +0000
+++ b/AUTHORS	Wed Apr 22 07:56:16 2009 +0000
@@ -9,6 +9,7 @@
 ------------------
 
 Daniel 'datallah' Atallah - Developer
+Paul 'darkrain42' Aurich - Developer
 John 'rekkanoryo' Bailey - Developer
 Ethan 'Paco-Paco' Blanton - Developer
 Thomas Butter - Developer
@@ -35,7 +36,6 @@
 
 Crazy Patch Writers:
 -------------------
-Paul 'darkrain42' Aurich
 Marcus 'malu' Lundblad
 Dennis 'EvilDennisR' Ristuccia
 Peter 'Fmoo' Ruibal
--- a/ChangeLog	Mon Apr 13 13:37:33 2009 +0000
+++ b/ChangeLog	Wed Apr 22 07:56:16 2009 +0000
@@ -26,6 +26,9 @@
 	IRC:
 	* Correctly handle WHOIS for users who are joined to a large number of
 	  channels.
+	* Notify the user if a /nick command fails, rather than trying
+	  fallback nicks.
+	
 
 	Pidgin:
 	* Added -f command line option to tell Pidgin to ignore NetworkManager
--- a/doc/TCL-HOWTO.dox	Mon Apr 13 13:37:33 2009 +0000
+++ b/doc/TCL-HOWTO.dox	Wed Apr 22 07:56:16 2009 +0000
@@ -173,6 +173,7 @@
 purple::connection displayname gc
 purple::connection handle
 purple::connection list
+purple::connection state
 @endcode
 
   @c purple::connection is a collection of subcommands pertaining to
@@ -192,6 +193,9 @@
   this list are appropriate as @c gc arguments to the other
   @c purple::connection subcommands or other commands requiring a gc.
 
+  @c state returns the PurpleConnectionState of this account as one of
+  the strings "connected", "disconnected", or "connecting".
+
 @code
 purple::conv_send account who text
 @endcode
--- a/libpurple/plugin.h	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/plugin.h	Wed Apr 22 07:56:16 2009 +0000
@@ -105,6 +105,20 @@
 	void *ui_info; /**< Used only by UI-specific plugins to build a preference screen with a custom UI */
 	void *extra_info;
 	PurplePluginUiInfo *prefs_info; /**< Used by any plugin to display preferences.  If #ui_info has been specified, this will be ignored. */
+
+	/**
+	 * This callback has a different use depending on whether this
+	 * plugin type is PURPLE_PLUGIN_STANDARD or PURPLE_PLUGIN_PROTOCOL.
+	 *
+	 * If PURPLE_PLUGIN_STANDARD then the list of actions will show up
+	 * in the Tools menu, under a submenu with the name of the plugin.
+	 * context will be NULL.
+	 *
+	 * If PURPLE_PLUGIN_PROTOCOL then the list of actions will show up
+	 * in the Accounts menu, under a submenu with the name of the
+	 * account.  context will be set to the PurpleConnection for that
+	 * account.  This callback will only be called for online accounts.
+	 */
 	GList *(*actions)(PurplePlugin *plugin, gpointer context);
 
 	void (*_purple_reserved1)(void);
--- a/libpurple/plugins/perl/perl-common.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/plugins/perl/perl-common.c	Wed Apr 22 07:56:16 2009 +0000
@@ -403,7 +403,7 @@
 static SV *
 purple_perl_sv_from_subtype(const PurpleValue *value, void *arg)
 {
-	const char *stash = NULL;
+	const char *stash = "Purple"; /* ? */
 
 	switch (purple_value_get_subtype(value)) {
 		case PURPLE_SUBTYPE_ACCOUNT:
@@ -442,6 +442,9 @@
 		case PURPLE_SUBTYPE_STATUS:
 			stash = "Purple::Status";
 			break;
+		case PURPLE_SUBTYPE_SAVEDSTATUS:
+			stash = "Purple::SavedStatus";
+			break;
 		case PURPLE_SUBTYPE_LOG:
 			stash = "Purple::Log";
 			break;
@@ -451,10 +454,19 @@
 		case PURPLE_SUBTYPE_XMLNODE:
 			stash = "Purple::XMLNode";
 			break;
-
-		default:
-			stash = "Purple"; /* ? */
-	}
+ 		case PURPLE_SUBTYPE_USERINFO:
+ 			stash = "Purple::NotifyUserInfo";
+ 			break;
+ 		case PURPLE_SUBTYPE_STORED_IMAGE:
+ 			stash = "Purple::StoredImage";
+ 			break;
+ 		case PURPLE_SUBTYPE_CERTIFICATEPOOL:
+ 			stash = "Purple::Certificate::Pool";
+ 			break;
+ 		case PURPLE_SUBTYPE_UNKNOWN:
+ 			stash = "Purple::Unknown";
+ 			break;
+  	}
 
 	return sv_2mortal(purple_perl_bless_object(arg, stash));
 }
--- a/libpurple/plugins/tcl/tcl_cmds.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/plugins/tcl/tcl_cmds.c	Wed Apr 22 07:56:16 2009 +0000
@@ -683,8 +683,9 @@
 int tcl_cmd_connection(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
 {
 	Tcl_Obj *list, *elem;
-	const char *cmds[] = { "account", "displayname", "handle", "list", NULL };
-	enum { CMD_CONN_ACCOUNT, CMD_CONN_DISPLAYNAME, CMD_CONN_HANDLE, CMD_CONN_LIST } cmd;
+	const char *cmds[] = { "account", "displayname", "handle", "list", "state", NULL };
+	enum { CMD_CONN_ACCOUNT, CMD_CONN_DISPLAYNAME, CMD_CONN_HANDLE,
+	       CMD_CONN_LIST, CMD_CONN_STATE } cmd;
 	int error;
 	GList *cur;
 	PurpleConnection *gc;
@@ -739,6 +740,25 @@
 		}
 		Tcl_SetObjResult(interp, list);
 		break;
+	case CMD_CONN_STATE:
+		if (objc != 3) {
+			Tcl_WrongNumArgs(interp, 2, objv, "gc");
+			return TCL_ERROR;
+		}
+		if ((gc = tcl_validate_gc(objv[2], interp)) == NULL)
+			return TCL_ERROR;
+		switch (purple_connection_get_state(gc)) {
+		case PURPLE_DISCONNECTED:
+			Tcl_SetObjResult(interp, Tcl_NewStringObj("disconnected", -1));
+			break;
+		case PURPLE_CONNECTED:
+			Tcl_SetObjResult(interp, Tcl_NewStringObj("connected", -1));
+			break;
+		case PURPLE_CONNECTING:
+			Tcl_SetObjResult(interp, Tcl_NewStringObj("connecting", -1));
+			break;
+		}
+		break;
 	}
 
 	return TCL_OK;
--- a/libpurple/protocols/irc/msgs.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/protocols/irc/msgs.c	Wed Apr 22 07:56:16 2009 +0000
@@ -1004,10 +1004,23 @@
 void irc_msg_nickused(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	char *newnick, *buf, *end;
+	PurpleConnection *gc = purple_account_get_connection(irc->account);
 
 	if (!args || !args[1])
 		return;
 
+	if (gc && purple_connection_get_state(gc) == PURPLE_CONNECTED) {
+		/* We only want to do the following dance if the connection
+		   has not been successfully completed.  If it has, just
+		   notify the user that their /nick command didn't go. */
+		buf = g_strdup_printf(_("The nickname \"%s\" is already being used."),
+				      irc->reqnick);
+		purple_notify_error(gc, _("Nickname in use"),
+				    _("Nickname in use"), buf);
+		g_free(buf);
+		g_free(irc->reqnick);
+	}
+
 	if (strlen(args[1]) < strlen(irc->reqnick) || irc->nickused)
 		newnick = g_strdup(args[1]);
 	else
--- a/libpurple/protocols/jabber/jabber.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Wed Apr 22 07:56:16 2009 +0000
@@ -463,7 +463,7 @@
 	JabberStream *js = gc->proto_data;
 
 	if (js->keepalive_timeout == -1) {
-		jabber_ping_jid(js, NULL);
+		jabber_ping_jid(js, js->user->domain);
 		js->keepalive_timeout = purple_timeout_add_seconds(120,
 				(GSourceFunc)(jabber_keepalive_timeout), gc);
 	}
--- a/libpurple/protocols/jabber/message.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/protocols/jabber/message.c	Wed Apr 22 07:56:16 2009 +0000
@@ -636,24 +636,27 @@
 					purple_debug_info("jabber", "found %d smileys\n",
 						g_list_length(smiley_refs));
 
-					if (jm->type == JABBER_MESSAGE_GROUPCHAT) {
-						JabberID *jid = jabber_id_new(jm->from);
-						JabberChat *chat = NULL;
+					if (smiley_refs) {		
+						if (jm->type == JABBER_MESSAGE_GROUPCHAT) {
+							JabberID *jid = jabber_id_new(jm->from);
+							JabberChat *chat = NULL;
 
-						if (jid) {
-							chat = jabber_chat_find(js, jid->node, jid->domain);
-							if (chat) conv = chat->conv;
-						}
+							if (jid) {
+								chat = jabber_chat_find(js, jid->node, jid->domain);
+								if (chat) conv = chat->conv;
+							}
 
-						jabber_id_free(jid);
-					} else {
-						conv =
-							purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY,
-								who, account);
-						if (!conv) {
-							/* we need to create the conversation here */
-							conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
-								account, who);
+							jabber_id_free(jid);
+						} else {
+							conv =
+								purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY,
+									who, account);
+							if (!conv) {
+								/* we need to create the conversation here */
+								conv = 
+									purple_conversation_new(PURPLE_CONV_TYPE_IM,
+									account, who);
+							}
 						}
 					}
 
@@ -685,7 +688,7 @@
 						    TRUE)) {
 						const JabberData *data =
 								jabber_data_find_remote_by_cid(cid);
-						/* if data is already known, we add write it immediatly */
+						/* if data is already known, we write it immediatly */
 						if (data) {
 							purple_debug_info("jabber",
 								"data is already known\n");
--- a/libpurple/protocols/jabber/ping.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/protocols/jabber/ping.c	Wed Apr 22 07:56:16 2009 +0000
@@ -55,15 +55,10 @@
                                   JabberIqType type, const char *id,
                                   xmlnode *packet, gpointer data)
 {
-	char *own_bare_jid = g_strdup_printf("%s@%s", js->user->node,
-	                                     js->user->domain);
-
-	if (!from || !strcmp(from, own_bare_jid)) {
-		/* If the pong is from our bare JID, treat it as a return from the
+	if (purple_strequal(from, js->user->domain))
+		/* If the pong is from the server, assume it's a result of the
 		 * keepalive functions */
 		jabber_keepalive_pong_cb(js);
-	}
-	g_free(own_bare_jid);
 
 	if (type == JABBER_IQ_RESULT) {
 		purple_debug_info("jabber", "PONG!\n");
--- a/libpurple/protocols/yahoo/yahoo.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo.c	Wed Apr 22 07:56:16 2009 +0000
@@ -2975,8 +2975,10 @@
 
 		/* connect to host */
 		if((purple_proxy_connect(NULL, account, host_ip, YAHOO_PAGER_PORT_P2P, yahoo_p2p_init_cb, p2p_data))==NULL)	{
-			yahoo_p2p_disconnect_destroy_data(p2p_data);
 			purple_debug_info("yahoo","p2p: Connection to %s failed\n", host_ip);
+			g_free(p2p_data->host_ip);
+			g_free(p2p_data->host_username);
+			g_free(p2p_data);
 		}
 	}
 }
--- a/pidgin/gtkaccount.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkaccount.c	Wed Apr 22 07:56:16 2009 +0000
@@ -413,7 +413,11 @@
 
 	if (dialog->protocol_menu != NULL)
 	{
+#if GTK_CHECK_VERSION(2,12,0)
+		g_object_ref(G_OBJECT(dialog->protocol_menu));
+#else
 		gtk_widget_ref(dialog->protocol_menu);
+#endif
 		hbox = g_object_get_data(G_OBJECT(dialog->protocol_menu), "container");
 		gtk_container_remove(GTK_CONTAINER(hbox), dialog->protocol_menu);
 	}
@@ -440,13 +444,21 @@
 	{
 		dialog->protocol_menu = pidgin_protocol_option_menu_new(
 				dialog->protocol_id, G_CALLBACK(set_account_protocol_cb), dialog);
+#if GTK_CHECK_VERSION(2,12,0)
+		g_object_ref(G_OBJECT(dialog->protocol_menu));
+#else
 		gtk_widget_ref(dialog->protocol_menu);
+#endif
 	}
 
 	hbox = add_pref_box(dialog, vbox, _("Pro_tocol:"), dialog->protocol_menu);
 	g_object_set_data(G_OBJECT(dialog->protocol_menu), "container", hbox);
 
+#if GTK_CHECK_VERSION(2,12,0)
+	g_object_unref(G_OBJECT(dialog->protocol_menu));
+#else
 	gtk_widget_unref(dialog->protocol_menu);
+#endif
 
 	/* Username */
 	dialog->username_entry = gtk_entry_new();
--- a/pidgin/gtkblist.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkblist.c	Wed Apr 22 07:56:16 2009 +0000
@@ -6630,7 +6630,7 @@
 	purple_signals_disconnect_by_handle(gtkblist);
 
 	if (gtkblist->headline_close)
-		gdk_pixbuf_unref(gtkblist->headline_close);
+		g_object_unref(G_OBJECT(gtkblist->headline_close));
 
 	gtk_widget_destroy(gtkblist->window);
 
--- a/pidgin/gtkdialogs.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkdialogs.c	Wed Apr 22 07:56:16 2009 +0000
@@ -73,6 +73,7 @@
 /* Order: Alphabetical by Last Name */
 static const struct developer developers[] = {
 	{"Daniel 'datallah' Atallah",	NULL, NULL},
+	{"Paul 'darkrain42' Aurich",	NULL, NULL },
 	{"John 'rekkanoryo' Bailey",	N_("bug master"), "rekkanoryo@pidgin.im"},
 	{"Ethan 'Paco-Paco' Blanton",	NULL, NULL},
 	{"Hylke Bons",			N_("artist"), "h.bons@student.rug.nl"},
@@ -101,7 +102,6 @@
 
 /* Order: Alphabetical by Last Name */
 static const struct developer patch_writers[] = {
-	{"Paul 'darkrain42' Aurich", NULL, NULL },
 	{"Marcus 'malu' Lundblad", NULL, NULL},
 	{"Dennis 'EvilDennisR' Ristuccia",	N_("Senior Contributor/QA"),	NULL},
 	{"Peter 'Fmoo' Ruibal",		NULL,	NULL},
@@ -427,7 +427,7 @@
 #endif
 	gtk_widget_destroy(logo);
 	logo = gtk_image_new_from_pixbuf(pixbuf);
-	gdk_pixbuf_unref(pixbuf);
+	g_object_unref(G_OBJECT(pixbuf));
 	/* Insert the logo */
 	obj = gtk_widget_get_accessible(logo);
 	tmp = g_strconcat(PIDGIN_NAME, " " DISPLAY_VERSION, NULL);
--- a/pidgin/gtkdocklet.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkdocklet.c	Wed Apr 22 07:56:16 2009 +0000
@@ -482,7 +482,7 @@
 }
 
 static GtkWidget *
-new_menu_item_with_status_icon(GtkWidget *menu, const char *str, PurpleStatusPrimitive primitive, GtkSignalFunc sf, gpointer data, guint accel_key, guint accel_mods, char *mod)
+new_menu_item_with_status_icon(GtkWidget *menu, const char *str, PurpleStatusPrimitive primitive, GCallback cb, gpointer data, guint accel_key, guint accel_mods, char *mod)
 {
 	GtkWidget *menuitem;
 	GdkPixbuf *pixbuf;
@@ -493,8 +493,8 @@
 	if (menu)
 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
 
-	if (sf)
-		g_signal_connect(G_OBJECT(menuitem), "activate", sf, data);
+	if (cb)
+		g_signal_connect(G_OBJECT(menuitem), "activate", cb, data);
 
 	pixbuf = pidgin_create_status_icon(primitive, menu, PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL);
 	image = gtk_image_new_from_pixbuf(pixbuf);
--- a/pidgin/gtkimhtml.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkimhtml.c	Wed Apr 22 07:56:16 2009 +0000
@@ -782,7 +782,7 @@
 				   gc,
 				   TRUE,
 				   visible_rect.x, visible_rect.y, visible_rect.width, visible_rect.height);
-		gdk_gc_unref(gc);
+		g_object_unref(G_OBJECT(gc));
 
 		if (GTK_WIDGET_CLASS (parent_class)->expose_event)
 			return (* GTK_WIDGET_CLASS (parent_class)->expose_event)
@@ -873,7 +873,7 @@
 		       !gtk_text_iter_begins_tag(&cur, NULL));
 	}
 
-	gdk_gc_unref(gc);
+	g_object_unref(G_OBJECT(gc));
 
 	if (GTK_WIDGET_CLASS (parent_class)->expose_event)
 		return (* GTK_WIDGET_CLASS (parent_class)->expose_event)
@@ -1384,7 +1384,7 @@
 		gtk_widget_destroy(imhtml->tip_window);
 	}
 	if(imhtml->tip_timer)
-		gtk_timeout_remove(imhtml->tip_timer);
+		g_source_remove(imhtml->tip_timer);
 
 	for(scalables = imhtml->scalables; scalables; scalables = scalables->next) {
 		struct scalable_data *sd = scalables->data;
@@ -1451,7 +1451,7 @@
 	GObjectClass   *gobject_class;
 	object_class = (GtkObjectClass*) klass;
 	gobject_class = (GObjectClass*) klass;
-	parent_class = gtk_type_class(GTK_TYPE_TEXT_VIEW);
+	parent_class = g_type_class_ref(GTK_TYPE_TEXT_VIEW);
 	signals[URL_CLICKED] = g_signal_new("url_clicked",
 						G_TYPE_FROM_CLASS(gobject_class),
 						G_SIGNAL_RUN_FIRST,
--- a/pidgin/gtkimhtml.h	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkimhtml.h	Wed Apr 22 07:56:16 2009 +0000
@@ -40,13 +40,13 @@
  **************************************************************************/
 /*@{*/
 
-#define GTK_TYPE_IMHTML            (gtk_imhtml_get_type ())
-#define GTK_IMHTML(obj)            (GTK_CHECK_CAST ((obj), GTK_TYPE_IMHTML, GtkIMHtml))
-#define GTK_IMHTML_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_IMHTML, GtkIMHtmlClass))
-#define GTK_IS_IMHTML(obj)         (GTK_CHECK_TYPE ((obj), GTK_TYPE_IMHTML))
-#define GTK_IS_IMHTML_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IMHTML))
+#define GTK_TYPE_IMHTML            (gtk_imhtml_get_type())
+#define GTK_IMHTML(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_IMHTML, GtkIMHtml))
+#define GTK_IMHTML_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_IMHTML, GtkIMHtmlClass))
+#define GTK_IS_IMHTML(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_IMHTML))
+#define GTK_IS_IMHTML_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_IMHTML))
 #define GTK_IMHTML_SCALABLE(obj)   ((GtkIMHtmlScalable *)obj)
-#define GTK_IMHTML_ANIMATION(obj)   ((GtkIMHtmlAnimation *)obj)
+#define GTK_IMHTML_ANIMATION(obj)  ((GtkIMHtmlAnimation *)obj)
 
 typedef struct _GtkIMHtml			GtkIMHtml;
 typedef struct _GtkIMHtmlClass		GtkIMHtmlClass;
--- a/pidgin/gtkimhtmltoolbar.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkimhtmltoolbar.c	Wed Apr 22 07:56:16 2009 +0000
@@ -1211,7 +1211,7 @@
 	GObjectClass   *gobject_class;
 	object_class = (GtkObjectClass*) class;
 	gobject_class = (GObjectClass*) class;
-	parent_class = gtk_type_class(GTK_TYPE_HBOX);
+	parent_class = g_type_class_ref(GTK_TYPE_HBOX);
 	gobject_class->finalize = gtk_imhtmltoolbar_finalize;
 
 	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations/toolbar");
--- a/pidgin/gtkimhtmltoolbar.h	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkimhtmltoolbar.h	Wed Apr 22 07:56:16 2009 +0000
@@ -32,11 +32,11 @@
 
 #define DEFAULT_FONT_FACE "Helvetica 12"
 
-#define GTK_TYPE_IMHTMLTOOLBAR            (gtk_imhtmltoolbar_get_type ())
-#define GTK_IMHTMLTOOLBAR(obj)            (GTK_CHECK_CAST ((obj), GTK_TYPE_IMHTMLTOOLBAR, GtkIMHtmlToolbar))
-#define GTK_IMHTMLTOOLBAR_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_IMHTMLTOOLBAR, GtkIMHtmlToolbarClass))
-#define GTK_IS_IMHTMLTOOLBAR(obj)         (GTK_CHECK_TYPE ((obj), GTK_TYPE_IMHTMLTOOLBAR))
-#define GTK_IS_IMHTMLTOOLBAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IMHTMLTOOLBAR))
+#define GTK_TYPE_IMHTMLTOOLBAR            (gtk_imhtmltoolbar_get_type())
+#define GTK_IMHTMLTOOLBAR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_IMHTMLTOOLBAR, GtkIMHtmlToolbar))
+#define GTK_IMHTMLTOOLBAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_IMHTMLTOOLBAR, GtkIMHtmlToolbarClass))
+#define GTK_IS_IMHTMLTOOLBAR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_IMHTMLTOOLBAR))
+#define GTK_IS_IMHTMLTOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_IMHTMLTOOLBAR))
 
 typedef struct _GtkIMHtmlToolbar		GtkIMHtmlToolbar;
 typedef struct _GtkIMHtmlToolbarClass		GtkIMHtmlToolbarClass;
--- a/pidgin/gtkmenutray.h	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkmenutray.h	Wed Apr 22 07:56:16 2009 +0000
@@ -26,12 +26,12 @@
 
 #include <gtk/gtk.h>
 
-#define PIDGIN_TYPE_MENU_TRAY				(pidgin_menu_tray_get_gtype())
-#define PIDGIN_MENU_TRAY(obj)				(GTK_CHECK_CAST((obj), PIDGIN_TYPE_MENU_TRAY, PidginMenuTray))
-#define PIDGIN_MENU_TRAY_CLASS(klass)		(GTK_CHECK_CLASS_CAST((klass), PIDGIN_TYPE_MENU_TRAY, PidginMenuTrayClass))
-#define PIDGIN_IS_MENU_TRAY(obj)			(GTK_CHECK_TYPE((obj), PIDGIN_TYPE_MENU_TRAY))
-#define PIDGIN_IS_MENU_TRAY_CLASS(klass)	(GTK_CHECK_CLASS_TYPE((klass), PIDGIN_TYPE_MENU_TRAY))
-#define PIDGIN_MENU_TRAY_GET_CLASS(obj)	(GTK_CHECK_GET_CLASS((obj), PIDGIN_TYPE_MENU_TRAY, PidginMenuTrayClass))
+#define PIDGIN_TYPE_MENU_TRAY            (pidgin_menu_tray_get_gtype())
+#define PIDGIN_MENU_TRAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), PIDGIN_TYPE_MENU_TRAY, PidginMenuTray))
+#define PIDGIN_MENU_TRAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), PIDGIN_TYPE_MENU_TRAY, PidginMenuTrayClass))
+#define PIDGIN_IS_MENU_TRAY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), PIDGIN_TYPE_MENU_TRAY))
+#define PIDGIN_IS_MENU_TRAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PIDGIN_TYPE_MENU_TRAY))
+#define PIDGIN_MENU_TRAY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), PIDGIN_TYPE_MENU_TRAY, PidginMenuTrayClass))
 
 typedef struct _PidginMenuTray				PidginMenuTray;
 typedef struct _PidginMenuTrayClass		PidginMenuTrayClass;
--- a/pidgin/gtkprefs.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkprefs.c	Wed Apr 22 07:56:16 2009 +0000
@@ -638,7 +638,7 @@
 		gtk_list_store_set(prefs_sound_themes, &iter, 0, pixbuf, 2, purple_theme_get_name(theme), -1);
 
 		if (pixbuf != NULL)
-			gdk_pixbuf_unref(pixbuf);
+			g_object_unref(G_OBJECT(pixbuf));
 
 	} else if (PIDGIN_IS_BLIST_THEME(theme) || PIDGIN_IS_STATUS_ICON_THEME(theme)){
 		GtkListStore *store;
@@ -665,7 +665,7 @@
 
 		g_free(markup);
 		if (pixbuf != NULL)
-			gdk_pixbuf_unref(pixbuf);
+			g_object_unref(G_OBJECT(pixbuf));
 	}
 
 }
@@ -702,7 +702,7 @@
 	gtk_list_store_set(prefs_status_icon_themes, &iter, 0, pixbuf, 1, "<b>(Default)</b> - None\n<span color='dim grey'>"
 								    "The default Pidgin status icon theme</span>", 2, "", -1);
 
-	gdk_pixbuf_unref(pixbuf);
+	g_object_unref(G_OBJECT(pixbuf));
 }
 
 /* builds a theme combo box from a list store with colums: icon preview, markup, theme name */
--- a/pidgin/gtksmiley.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtksmiley.c	Wed Apr 22 07:56:16 2009 +0000
@@ -74,7 +74,7 @@
 	gtk_widget_destroy(smiley->parent);
 	g_free(smiley->filename);
 	if (smiley->custom_pixbuf)
-		gdk_pixbuf_unref(smiley->custom_pixbuf);
+		g_object_unref(G_OBJECT(smiley->custom_pixbuf));
 	g_free(smiley);
 }
 
@@ -344,7 +344,7 @@
 	pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, 64, 64, FALSE, NULL);
 	gtk_image_set_from_pixbuf(GTK_IMAGE(s->smiley_image), pixbuf);
 	if (pixbuf)
-		gdk_pixbuf_unref(pixbuf);
+		g_object_unref(G_OBJECT(pixbuf));
 	gtk_widget_grab_focus(s->smile);
 }
 
@@ -459,8 +459,8 @@
 pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image)
 {
 	if (editor->custom_pixbuf)
-		gdk_pixbuf_unref(editor->custom_pixbuf);
-	editor->custom_pixbuf = image ? gdk_pixbuf_ref(image) : NULL;
+		g_object_unref(G_OBJECT(editor->custom_pixbuf));
+	editor->custom_pixbuf = image ? g_object_ref(G_OBJECT(image)) : NULL;
 	if (image)
 		gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image);
 }
--- a/pidgin/gtksourceundomanager.h	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtksourceundomanager.h	Wed Apr 22 07:56:16 2009 +0000
@@ -28,12 +28,12 @@
 
 #include <gtk/gtk.h>
 
-#define GTK_SOURCE_TYPE_UNDO_MANAGER             	(gtk_source_undo_manager_get_type ())
-#define GTK_SOURCE_UNDO_MANAGER(obj)			(GTK_CHECK_CAST ((obj), GTK_SOURCE_TYPE_UNDO_MANAGER, GtkSourceUndoManager))
-#define GTK_SOURCE_UNDO_MANAGER_CLASS(klass)		(GTK_CHECK_CLASS_CAST ((klass), GTK_SOURCE_TYPE_UNDO_MANAGER, GtkSourceUndoManagerClass))
-#define GTK_SOURCE_IS_UNDO_MANAGER(obj)			(GTK_CHECK_TYPE ((obj), GTK_SOURCE_TYPE_UNDO_MANAGER))
-#define GTK_SOURCE_IS_UNDO_MANAGER_CLASS(klass)  	(GTK_CHECK_CLASS_TYPE ((klass), GTK_SOURCE_TYPE_UNDO_MANAGER))
-#define GTK_SOURCE_UNDO_MANAGER_GET_CLASS(obj)  	(GTK_CHECK_GET_CLASS ((obj), GTK_SOURCE_TYPE_UNDO_MANAGER, GtkSourceUndoManagerClass))
+#define GTK_SOURCE_TYPE_UNDO_MANAGER            (gtk_source_undo_manager_get_type())
+#define GTK_SOURCE_UNDO_MANAGER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_SOURCE_TYPE_UNDO_MANAGER, GtkSourceUndoManager))
+#define GTK_SOURCE_UNDO_MANAGER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GTK_SOURCE_TYPE_UNDO_MANAGER, GtkSourceUndoManagerClass))
+#define GTK_SOURCE_IS_UNDO_MANAGER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_SOURCE_TYPE_UNDO_MANAGER))
+#define GTK_SOURCE_IS_UNDO_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_SOURCE_TYPE_UNDO_MANAGER))
+#define GTK_SOURCE_UNDO_MANAGER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_SOURCE_TYPE_UNDO_MANAGER, GtkSourceUndoManagerClass))
 
 
 typedef struct _GtkSourceUndoManager        	GtkSourceUndoManager;
--- a/pidgin/gtkstatusbox.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkstatusbox.c	Wed Apr 22 07:56:16 2009 +0000
@@ -536,12 +536,12 @@
 
 	for (i = 0; i < G_N_ELEMENTS(statusbox->connecting_pixbufs); i++) {
 		if (statusbox->connecting_pixbufs[i] != NULL)
-			gdk_pixbuf_unref(statusbox->connecting_pixbufs[i]);
+			g_object_unref(G_OBJECT(statusbox->connecting_pixbufs[i]));
 	}
 
 	for (i = 0; i < G_N_ELEMENTS(statusbox->typing_pixbufs); i++) {
 		if (statusbox->typing_pixbufs[i] != NULL)
-			gdk_pixbuf_unref(statusbox->typing_pixbufs[i]);
+			g_object_unref(G_OBJECT(statusbox->typing_pixbufs[i]));
 	}
 
 	g_object_unref(G_OBJECT(statusbox->store));
@@ -1202,7 +1202,7 @@
 
 	for (i = 0; i < G_N_ELEMENTS(status_box->connecting_pixbufs); i++) {
 		if (status_box->connecting_pixbufs[i] != NULL)
-			gdk_pixbuf_unref(status_box->connecting_pixbufs[i]);
+			g_object_unref(G_OBJECT(status_box->connecting_pixbufs[i]));
 	}
 
 	status_box->connecting_index = 0;
@@ -1225,7 +1225,7 @@
 
 	for (i = 0; i < G_N_ELEMENTS(status_box->typing_pixbufs); i++) {
 		if (status_box->typing_pixbufs[i] != NULL)
-			gdk_pixbuf_unref(status_box->typing_pixbufs[i]);
+			g_object_unref(G_OBJECT(status_box->typing_pixbufs[i]));
 	}
 
 	status_box->typing_index = 0;
--- a/pidgin/gtkutils.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkutils.c	Wed Apr 22 07:56:16 2009 +0000
@@ -358,7 +358,7 @@
 }
 
 GtkWidget *pidgin_new_check_item(GtkWidget *menu, const char *str,
-		GtkSignalFunc sf, gpointer data, gboolean checked)
+		GCallback cb, gpointer data, gboolean checked)
 {
 	GtkWidget *menuitem;
 	menuitem = gtk_check_menu_item_new_with_mnemonic(str);
@@ -368,8 +368,8 @@
 
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), checked);
 
-	if (sf)
-		g_signal_connect(G_OBJECT(menuitem), "activate", sf, data);
+	if (cb)
+		g_signal_connect(G_OBJECT(menuitem), "activate", cb, data);
 
 	gtk_widget_show_all(menuitem);
 
@@ -439,7 +439,7 @@
 }
 
 
-GtkWidget *pidgin_new_item_from_stock(GtkWidget *menu, const char *str, const char *icon, GtkSignalFunc sf, gpointer data, guint accel_key, guint accel_mods, char *mod)
+GtkWidget *pidgin_new_item_from_stock(GtkWidget *menu, const char *str, const char *icon, GCallback cb, gpointer data, guint accel_key, guint accel_mods, char *mod)
 {
 	GtkWidget *menuitem;
 	/*
@@ -456,8 +456,8 @@
 	if (menu)
 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
 
-	if (sf)
-		g_signal_connect(G_OBJECT(menuitem), "activate", sf, data);
+	if (cb)
+		g_signal_connect(G_OBJECT(menuitem), "activate", cb, data);
 
 	if (icon != NULL) {
 		image = gtk_image_new_from_stock(icon, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
@@ -1627,7 +1627,7 @@
 						    _("Set as buddy icon"), DND_BUDDY_ICON,
 						    (ft ? _("Send image file") : _("Insert in message")), (ft ? DND_FILE_TRANSFER : DND_IM_IMAGE),
 							NULL);
-			gdk_pixbuf_unref(pb);
+			g_object_unref(G_OBJECT(pb));
 			return;
 		}
 
--- a/pidgin/gtkutils.h	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkutils.h	Wed Apr 22 07:56:16 2009 +0000
@@ -233,14 +233,14 @@
  *
  * @param menu     The menu to which to append the check menu item.
  * @param str      The title to use for the newly created menu item.
- * @param sf       A function to call when the menu item is activated.
+ * @param cb       A function to call when the menu item is activated.
  * @param data     Data to pass to the signal function.
  * @param checked  The initial state of the check item
  *
  * @return The newly created menu item.
  */
 GtkWidget *pidgin_new_check_item(GtkWidget *menu, const char *str,
-		GtkSignalFunc sf, gpointer data, gboolean checked);
+		GCallback cb, gpointer data, gboolean checked);
 
 /**
  * Creates a menu item.
@@ -249,7 +249,7 @@
  * @param str        The title for the menu item.
  * @param icon       An icon to place to the left of the menu item,
  *                   or @c NULL for no icon.
- * @param sf         A function to call when the menu item is activated.
+ * @param cb         A function to call when the menu item is activated.
  * @param data       Data to pass to the signal function.
  * @param accel_key  Something.
  * @param accel_mods Something.
@@ -258,7 +258,7 @@
  * @return The newly created menu item.
  */
 GtkWidget *pidgin_new_item_from_stock(GtkWidget *menu, const char *str,
-									const char *icon, GtkSignalFunc sf,
+									const char *icon, GCallback cb,
 									gpointer data, guint accel_key,
 									guint accel_mods, char *mod);
 
--- a/pidgin/gtkwhiteboard.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/gtkwhiteboard.c	Wed Apr 22 07:56:16 2009 +0000
@@ -624,7 +624,7 @@
 							   update_rect.x, update_rect.y,
 							   update_rect.width, update_rect.height);
 
-	gdk_gc_unref(gfx_con);
+	g_object_unref(G_OBJECT(gfx_con));
 }
 
 /* Uses Bresenham's algorithm (as provided by Wikipedia) */
--- a/pidgin/plugins/contact_priority.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/plugins/contact_priority.c	Wed Apr 22 07:56:16 2009 +0000
@@ -31,7 +31,7 @@
 select_account(GtkWidget *widget, PurpleAccount *account, gpointer data)
 {
 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(data),
-														(gdouble)purple_account_get_int(account, "score", 0));
+	                          (gdouble)purple_account_get_int(account, "score", 0));
 }
 
 static void
@@ -142,18 +142,18 @@
 	spin = gtk_spin_button_new((GtkAdjustment *)adj, 1, 0);
 
 	optmenu = pidgin_account_option_menu_new(NULL, TRUE,
-																						 G_CALLBACK(select_account),
-																						 NULL, spin);
+	                                         G_CALLBACK(select_account),
+	                                         NULL, spin);
 	gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 0);
 
 	/* this is where we set up the spin button we made above */
 	account = g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))))),
-															"account");
+	                            "account");
 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
-														(gdouble)purple_account_get_int(account, "score", 0));
+	                          (gdouble)purple_account_get_int(account, "score", 0));
 	gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(spin), GTK_ADJUSTMENT(adj));
 	g_signal_connect(G_OBJECT(spin), "value-changed",
-									 G_CALLBACK(account_update), optmenu);
+	                 G_CALLBACK(account_update), optmenu);
 	gtk_box_pack_start(GTK_BOX(hbox), spin, FALSE, FALSE, 0);
 
 	gtk_widget_show_all(ret);
@@ -178,29 +178,29 @@
 	PURPLE_PLUGIN_MAGIC,
 	PURPLE_MAJOR_VERSION,
 	PURPLE_MINOR_VERSION,
-	PURPLE_PLUGIN_STANDARD,                             /**< type           */
+	PURPLE_PLUGIN_STANDARD,                         /**< type           */
 	PIDGIN_PLUGIN_TYPE,                             /**< ui_requirement */
-	0,                                                /**< flags          */
-	NULL,                                             /**< dependencies   */
-	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */
+	0,                                              /**< flags          */
+	NULL,                                           /**< dependencies   */
+	PURPLE_PRIORITY_DEFAULT,                        /**< priority       */
 
-	CONTACT_PRIORITY_PLUGIN_ID,                       /**< id             */
-	N_("Contact Priority"),                           /**< name           */
-	DISPLAY_VERSION,                                  /**< version        */
+	CONTACT_PRIORITY_PLUGIN_ID,                     /**< id             */
+	N_("Contact Priority"),                         /**< name           */
+	DISPLAY_VERSION,                                /**< version        */
                                                     /**< summary        */
 	N_("Allows for controlling the values associated with different buddy states."),
                                                     /**< description    */
 	N_("Allows for changing the point values of idle/away/offline states for buddies in contact priority computations."),
-	"Etan Reisner <deryni@eden.rutgers.edu>",         /**< author         */
-	PURPLE_WEBSITE,                                     /**< homepage       */
+	"Etan Reisner <deryni@eden.rutgers.edu>",       /**< author         */
+	PURPLE_WEBSITE,                                 /**< homepage       */
 
-	NULL,                                             /**< load           */
-	NULL,                                             /**< unload         */
-	NULL,                                             /**< destroy        */
-	&ui_info,                                         /**< ui_info        */
-	NULL,                                             /**< extra_info     */
-	NULL,                                             /**< prefs_info     */
-	NULL,                                             /**< actions        */
+	NULL,                                           /**< load           */
+	NULL,                                           /**< unload         */
+	NULL,                                           /**< destroy        */
+	&ui_info,                                       /**< ui_info        */
+	NULL,                                           /**< extra_info     */
+	NULL,                                           /**< prefs_info     */
+	NULL,                                           /**< actions        */
 
 	/* padding */
 	NULL,
--- a/pidgin/plugins/markerline.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/plugins/markerline.c	Wed Apr 22 07:56:16 2009 +0000
@@ -84,7 +84,7 @@
 		gdk_gc_set_rgb_fg_color(gc, &red);
 		gdk_draw_line(event->window, gc,
 					0, y, visible_rect.width, y);
-		gdk_gc_unref(gc);
+		g_object_unref(G_OBJECT(gc));
 	}
 	return FALSE;
 }
--- a/pidgin/plugins/ticker/gtkticker.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/plugins/ticker/gtkticker.c	Wed Apr 22 07:56:16 2009 +0000
@@ -41,7 +41,7 @@
 		gboolean	       include_internals,
 		GtkCallback       callback,
 		gpointer          callback_data);
-static GtkType gtk_ticker_child_type (GtkContainer     *container);
+static GType gtk_ticker_child_type   (GtkContainer     *container);
 
 
 static GtkContainerClass *parent_class = NULL;
@@ -97,7 +97,7 @@
 	widget_class = (GtkWidgetClass*) class;
 	container_class = (GtkContainerClass*) class;
 
-	parent_class = gtk_type_class (GTK_TYPE_CONTAINER);
+	parent_class = g_type_class_ref (GTK_TYPE_CONTAINER);
 
 	gobject_class->finalize = gtk_ticker_finalize;
 
@@ -112,7 +112,7 @@
 	container_class->child_type = gtk_ticker_child_type;
 }
 
-static GtkType gtk_ticker_child_type (GtkContainer *container)
+static GType gtk_ticker_child_type (GtkContainer *container)
 {
 	return GTK_TYPE_WIDGET;
 }
--- a/pidgin/plugins/ticker/gtkticker.h	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/plugins/ticker/gtkticker.h	Wed Apr 22 07:56:16 2009 +0000
@@ -33,11 +33,11 @@
 extern "C" {
 #endif /* __cplusplus */
 
-#define GTK_TYPE_TICKER                  (gtk_ticker_get_type ())
-#define GTK_TICKER(obj)                  (GTK_CHECK_CAST ((obj), GTK_TYPE_TICKER, GtkTicker))
-#define GTK_TICKER_CLASS(klass)          (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_TICKER, GtkTickerClass))
-#define GTK_IS_TICKER(obj)               (GTK_CHECK_TYPE ((obj), GTK_TYPE_TICKER))
-#define GTK_IS_TICKER_CLASS(klass)       (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TICKER))
+#define GTK_TYPE_TICKER            (gtk_ticker_get_type())
+#define GTK_TICKER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_TICKER, GtkTicker))
+#define GTK_TICKER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_TICKER, GtkTickerClass))
+#define GTK_IS_TICKER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_TICKER))
+#define GTK_IS_TICKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_TICKER))
 
 
 typedef struct _GtkTicker        GtkTicker;
@@ -72,7 +72,7 @@
 };
 
 
-GtkType    gtk_ticker_get_type          (void);
+GType      gtk_ticker_get_type          (void);
 GtkWidget* gtk_ticker_new               (void);
 void       gtk_ticker_add               (GtkTicker       *ticker,
                                         GtkWidget      *widget);
--- a/pidgin/plugins/win32/transparency/win2ktrans.c	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/plugins/win32/transparency/win2ktrans.c	Wed Apr 22 07:56:16 2009 +0000
@@ -182,7 +182,7 @@
 
 	/* On slider val change, update window's transparency level */
 	g_signal_connect(GTK_OBJECT(slider), "value-changed",
-		GTK_SIGNAL_FUNC(change_alpha), win);
+		G_CALLBACK(change_alpha), win);
 
 	gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5);
 
@@ -563,7 +563,7 @@
 	button = pidgin_prefs_checkbox(_("_IM window transparency"),
 		OPT_WINTRANS_IM_ENABLED, imtransbox);
 	g_signal_connect(GTK_OBJECT(button), "clicked",
-		GTK_SIGNAL_FUNC(update_convs_wintrans),
+		G_CALLBACK(update_convs_wintrans),
 		(gpointer) OPT_WINTRANS_IM_ENABLED);
 
 	trans_box = gtk_vbox_new(FALSE, 18);
@@ -572,12 +572,12 @@
 	gtk_widget_show(trans_box);
 
 	g_signal_connect(GTK_OBJECT(button), "clicked",
-		GTK_SIGNAL_FUNC(pidgin_toggle_sensitive), trans_box);
+		G_CALLBACK(pidgin_toggle_sensitive), trans_box);
 
 	button = pidgin_prefs_checkbox(_("_Show slider bar in IM window"),
 		OPT_WINTRANS_IM_SLIDER, trans_box);
 	g_signal_connect(GTK_OBJECT(button), "clicked",
-		GTK_SIGNAL_FUNC(update_convs_wintrans),
+		G_CALLBACK(update_convs_wintrans),
 		(gpointer) OPT_WINTRANS_IM_SLIDER);
 
 	button = pidgin_prefs_checkbox(
@@ -587,7 +587,7 @@
 	button = pidgin_prefs_checkbox(_("Always on top"), OPT_WINTRANS_IM_ONTOP,
 		trans_box);
 	g_signal_connect(GTK_OBJECT(button), "clicked",
-		GTK_SIGNAL_FUNC(update_convs_wintrans),
+		G_CALLBACK(update_convs_wintrans),
 		(gpointer) OPT_WINTRANS_IM_ONTOP);
 
 	gtk_box_pack_start(GTK_BOX(imtransbox), trans_box, FALSE, FALSE, 5);
@@ -604,9 +604,9 @@
 	gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1);
 
 	g_signal_connect(GTK_OBJECT(slider), "value-changed",
-		GTK_SIGNAL_FUNC(alpha_change), NULL);
+		G_CALLBACK(alpha_change), NULL);
 	g_signal_connect(GTK_OBJECT(slider), "focus-out-event",
-		GTK_SIGNAL_FUNC(alpha_pref_set_int),
+		G_CALLBACK(alpha_pref_set_int),
 		(gpointer) OPT_WINTRANS_IM_ALPHA);
 
 	gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5);
@@ -620,7 +620,7 @@
 	button = pidgin_prefs_checkbox(_("_Buddy List window transparency"),
 		OPT_WINTRANS_BL_ENABLED, bltransbox);
 	g_signal_connect(GTK_OBJECT(button), "clicked",
-		GTK_SIGNAL_FUNC(set_blist_trans),
+		G_CALLBACK(set_blist_trans),
 		(gpointer) OPT_WINTRANS_BL_ENABLED);
 
 	trans_box = gtk_vbox_new(FALSE, 18);
@@ -628,14 +628,14 @@
 		gtk_widget_set_sensitive(GTK_WIDGET(trans_box), FALSE);
 	gtk_widget_show(trans_box);
 	g_signal_connect(GTK_OBJECT(button), "clicked",
-		GTK_SIGNAL_FUNC(pidgin_toggle_sensitive), trans_box);
+		G_CALLBACK(pidgin_toggle_sensitive), trans_box);
 	button = pidgin_prefs_checkbox(
 		_("Remove Buddy List window transparency on focus"),
 		OPT_WINTRANS_BL_ONFOCUS, trans_box);
 	button = pidgin_prefs_checkbox(_("Always on top"), OPT_WINTRANS_BL_ONTOP,
 		trans_box);
 	g_signal_connect(GTK_OBJECT(button), "clicked",
-		GTK_SIGNAL_FUNC(set_blist_trans),
+		G_CALLBACK(set_blist_trans),
 		(gpointer) OPT_WINTRANS_BL_ONTOP);
 	gtk_box_pack_start(GTK_BOX(bltransbox), trans_box, FALSE, FALSE, 5);
 
@@ -652,9 +652,9 @@
 	gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1);
 
 	g_signal_connect(GTK_OBJECT(slider), "value-changed",
-		GTK_SIGNAL_FUNC(bl_alpha_change), NULL);
+		G_CALLBACK(bl_alpha_change), NULL);
 	g_signal_connect(GTK_OBJECT(slider), "focus-out-event",
-		GTK_SIGNAL_FUNC(alpha_pref_set_int),
+		G_CALLBACK(alpha_pref_set_int),
 		(gpointer) OPT_WINTRANS_BL_ALPHA);
 
 	gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5);
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Mon Apr 13 13:37:33 2009 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Wed Apr 22 07:56:16 2009 +0000
@@ -813,6 +813,7 @@
 
     ; Shortcuts..
     Delete "$DESKTOP\Pidgin.lnk"
+    Delete "$SMPROGRAMS\Pidgin.lnk"
 
     Goto done
 
--- a/po/de.po	Mon Apr 13 13:37:33 2009 +0000
+++ b/po/de.po	Wed Apr 22 07:56:16 2009 +0000
@@ -11,9 +11,9 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-03-28 16:59+0100\n"
-"PO-Revision-Date: 2009-03-28 16:53+0100\n"
-"Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
+"POT-Creation-Date: 2009-04-16 16:28+0200\n"
+"PO-Revision-Date: 2009-04-16 16:27+0200\n"
+"Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n"
 "Language-Team: German <de@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -614,19 +614,6 @@
 msgid "Send To"
 msgstr "Senden an"
 
-msgid "Invite message"
-msgstr "Einladungsnachricht"
-
-msgid "Invite"
-msgstr "Einladen"
-
-msgid ""
-"Please enter the name of the user you wish to invite,\n"
-"along with an optional invite message."
-msgstr ""
-"Bitte geben Sie den Benutzernamen der Person ein, die Sie einladen möchten "
-"zusammen mit einer optionalen Einladungsnachricht."
-
 msgid "Conversation"
 msgstr "Unterhaltung"
 
@@ -889,6 +876,39 @@
 msgid "System Log"
 msgstr "System-Mitschnitt"
 
+msgid "Calling ... "
+msgstr "Anrufen..."
+
+msgid "Hangup"
+msgstr "Auflegen"
+
+#. Number of actions
+msgid "Accept"
+msgstr "Akzeptieren"
+
+msgid "Reject"
+msgstr "Ablehnen"
+
+msgid "Call in progress."
+msgstr "Anruf läuft."
+
+msgid "The call has been terminated."
+msgstr "Der Anruf wurde beendet."
+
+#, c-format
+msgid "%s wishes to start an audio session with you."
+msgstr "%s möchte eine Audio-Sitzung mit Ihnen starten."
+
+#, c-format
+msgid "%s is trying to start an unsupported media session type with you."
+msgstr ""
+
+msgid "You have rejected the call."
+msgstr "Sie haben den Anruf abgelehnt."
+
+msgid "call: Make an audio call."
+msgstr "call: Einen Audio-Anruf tätigen."
+
 msgid "Emails"
 msgstr "E-Mails"
 
@@ -923,6 +943,9 @@
 msgid "IM"
 msgstr "Nachricht"
 
+msgid "Invite"
+msgstr "Einladen"
+
 msgid "(none)"
 msgstr "(kein)"
 
@@ -1092,7 +1115,7 @@
 
 #, c-format
 msgid "%s has paused while typing to you (%s)"
-msgstr "%s hat beim Schreiben an Sie (%s) angehalten"
+msgstr "%s hat beim Tippen an Sie (%s) angehalten"
 
 #, c-format
 msgid "%s has signed on (%s)"
@@ -1537,6 +1560,27 @@
 msgid "Lastlog plugin."
 msgstr "Verlauf-Plugin."
 
+msgid ""
+"\n"
+"Fetching TinyURL..."
+msgstr ""
+
+msgid "Only create TinyURL for urls of this length or greater"
+msgstr ""
+
+msgid "TinyURL (or other) address prefix"
+msgstr ""
+
+#, fuzzy
+msgid "TinyURL"
+msgstr "URL anpassen"
+
+msgid "TinyURL plugin"
+msgstr ""
+
+msgid "When receiving a message with URL(s), TinyURL for easier copying"
+msgstr ""
+
 msgid "accounts"
 msgstr "Konten"
 
@@ -1638,13 +1682,6 @@
 msgid "SSL Certificate Verification"
 msgstr "SSL-Zertifikatsüberprüfung"
 
-#. Number of actions
-msgid "Accept"
-msgstr "Akzeptieren"
-
-msgid "Reject"
-msgstr "Ablehnen"
-
 msgid "_View Certificate..."
 msgstr "Ze_rtifikat ansehen..."
 
@@ -1792,6 +1829,18 @@
 msgid "%s left the room (%s)."
 msgstr "%s hat den Raum verlassen (%s)."
 
+#, fuzzy
+msgid "Invite to chat"
+msgstr "Zur Konferenz einladen"
+
+#. Put our happy label in it.
+msgid ""
+"Please enter the name of the user you wish to invite, along with an optional "
+"invite message."
+msgstr ""
+"Bitte geben Sie den Benutzernamen der Person ein, die Sie einladen möchten "
+"zusammen mit einer optionalen Einladungsnachricht."
+
 #, c-format
 msgid "Failed to get connection: %s"
 msgstr "Kann keine Verbindung herstellen: %s"
@@ -2631,7 +2680,7 @@
 msgstr "Nicht nachfragen. Immer als Alarm sichern."
 
 msgid "One Time Password"
-msgstr ""
+msgstr "Einmalpasswort"
 
 #. *< type
 #. *< ui_requirement
@@ -2640,13 +2689,13 @@
 #. *< priority
 #. *< id
 msgid "One Time Password Support"
-msgstr ""
+msgstr "Unterstützung für Einmalpasswörter"
 
 #. *< name
 #. *< version
 #. *  summary
 msgid "Enforce that passwords are used only once."
-msgstr ""
+msgstr "Erzwinge, dass Passwörter nur einmal verwendet werden."
 
 #. *  description
 msgid ""
@@ -3748,6 +3797,10 @@
 msgid "Operating System"
 msgstr "Betriebssystem"
 
+#, fuzzy
+msgid "Local Time"
+msgstr "Lokale Datei:"
+
 msgid "Last Activity"
 msgstr "Letzte Aktivität"
 
@@ -4493,6 +4546,37 @@
 msgid "%s has buzzed you!"
 msgstr "%s hat bei Ihnen angeklopft!"
 
+#, fuzzy, c-format
+msgid "Unable to initiate media with %s: invalid JID"
+msgstr "Kann die Nachricht an %s nicht senden, ungültige JID"
+
+#, fuzzy, c-format
+msgid "Unable to initiate media with %s: user is not online"
+msgstr "Kann die Datei nicht an %s senden, Benutzer ist nicht online"
+
+#, fuzzy, c-format
+msgid "Unable to initiate media with %s: not subscribed to user presence"
+msgstr ""
+"Kann die Datei nicht an %s senden, Anwesenheit des Benutzers nicht abonniert"
+
+#, fuzzy
+msgid "Media Initiation Failed"
+msgstr "Registrierung fehlgeschlagen"
+
+#, fuzzy, c-format
+msgid ""
+"Please select the resource of %s with which you would like to start a media "
+"session."
+msgstr ""
+"Bitte wählen Sie die Ressource von %s, an die Sie eine Datei schicken möchten"
+
+msgid "Select a Resource"
+msgstr "Wählen Sie eine Ressource"
+
+#, fuzzy
+msgid "Initiate Media"
+msgstr "Initiiere _Chat"
+
 msgid "config:  Configure a chat room."
 msgstr "config:  Konfiguriere einen Chatraum."
 
@@ -4687,9 +4771,6 @@
 msgstr ""
 "Bitte wählen Sie die Ressource von %s, an die Sie eine Datei schicken möchten"
 
-msgid "Select a Resource"
-msgstr "Wählen Sie eine Ressource"
-
 msgid "Edit User Mood"
 msgstr "Benutzerstimmung ändern"
 
@@ -7308,9 +7389,8 @@
 msgid "Change his/her memo as you like"
 msgstr ""
 
-#, fuzzy
 msgid "_Modify"
-msgstr "Bearbeiten"
+msgstr "_Bearbeiten"
 
 #, fuzzy
 msgid "Memo Modify"
@@ -10345,6 +10425,16 @@
 msgid "I_M"
 msgstr "I_M"
 
+#, fuzzy
+msgid "_Audio Call"
+msgstr "Chat _hinzufügen"
+
+msgid "Audio/_Video Call"
+msgstr "Audio/_Video-Anruf"
+
+msgid "_Video Call"
+msgstr "_Video-Anruf"
+
 msgid "_Send File..."
 msgstr "_Datei versenden..."
 
@@ -10775,14 +10865,6 @@
 msgid "Invite Buddy Into Chat Room"
 msgstr "Buddy in einen Chatraum einladen"
 
-#. Put our happy label in it.
-msgid ""
-"Please enter the name of the user you wish to invite, along with an optional "
-"invite message."
-msgstr ""
-"Bitte geben Sie den Benutzernamen der Person ein, die Sie einladen möchten "
-"zusammen mit einer optionalen Einladungsnachricht."
-
 msgid "_Buddy:"
 msgstr "_Buddy:"
 
@@ -10857,6 +10939,22 @@
 msgid "/Conversation/Clea_r Scrollback"
 msgstr "/Unterhaltung/_Leeren"
 
+#, fuzzy
+msgid "/Conversation/M_edia"
+msgstr "/Unterhaltung/Me_hr"
+
+#, fuzzy
+msgid "/Conversation/Media/_Audio Call"
+msgstr "/Unterhaltung/Me_hr"
+
+#, fuzzy
+msgid "/Conversation/Media/_Video Call"
+msgstr "/Unterhaltung/Me_hr"
+
+#, fuzzy
+msgid "/Conversation/Media/Audio\\/Video _Call"
+msgstr "/Unterhaltung/Betrachte _Mitschnitt"
+
 msgid "/Conversation/Se_nd File..."
 msgstr "/Unterhaltung/Datei _senden..."
 
@@ -10929,6 +11027,18 @@
 msgid "/Conversation/View Log"
 msgstr "/Unterhaltung/Betrachte Mitschnitt"
 
+#, fuzzy
+msgid "/Conversation/Media/Audio Call"
+msgstr "/Unterhaltung/Mehr"
+
+#, fuzzy
+msgid "/Conversation/Media/Video Call"
+msgstr "/Unterhaltung/Betrachte Mitschnitt"
+
+#, fuzzy
+msgid "/Conversation/Media/Audio\\/Video Call"
+msgstr "/Unterhaltung/Mehr"
+
 msgid "/Conversation/Send File..."
 msgstr "/Unterhaltung/Datei senden ..."
 
@@ -12073,6 +12183,23 @@
 msgid "Exiting because another libpurple client is already running.\n"
 msgstr "Wird geschlossen, da bereits ein anderer libpurple-Client läuft\n"
 
+msgid "/_Media"
+msgstr "/_Medien"
+
+msgid "/Media/_Hangup"
+msgstr "/Medien/_Auflegen"
+
+msgid "Calling..."
+msgstr "Anrufen..."
+
+#, c-format
+msgid "%s wishes to start an audio/video session with you."
+msgstr ""
+
+#, c-format
+msgid "%s wishes to start a video session with you."
+msgstr ""
+
 #, c-format
 msgid "%s has %d new message."
 msgid_plural "%s has %d new messages."
@@ -12240,43 +12367,33 @@
 msgid "Pounce Target"
 msgstr "Alarm-Ziel"
 
-#, fuzzy
 msgid "Started typing"
-msgstr "zu tippen beginnt"
-
-#, fuzzy
+msgstr "Beginnt zu tippen"
+
 msgid "Paused while typing"
-msgstr "beim Tippen anhält"
-
-#, fuzzy
+msgstr "Hat beim Tippen angehalten"
+
 msgid "Signed on"
-msgstr "sich anmeldet"
-
-#, fuzzy
+msgstr "Hat sich anmeldet"
+
 msgid "Returned from being idle"
-msgstr "%s ist nicht mehr inaktiv (%s)"
-
-#, fuzzy
+msgstr "Ist nicht mehr inaktiv"
+
 msgid "Returned from being away"
-msgstr "wieder anwesend ist"
-
-#, fuzzy
+msgstr "Ist wieder anwesend"
+
 msgid "Stopped typing"
-msgstr "Tippen gestoppt"
-
-#, fuzzy
+msgstr "Hat das Tippen gestoppt"
+
 msgid "Signed off"
-msgstr "sich abmeldet"
-
-#, fuzzy
+msgstr "Hat sich abmeldet"
+
 msgid "Became idle"
-msgstr "untätig wird"
-
-#, fuzzy
+msgstr "Wurde untätig"
+
 msgid "Went away"
-msgstr "Bei Abwesenheit"
-
-#, fuzzy
+msgstr "Ging hinaus"
+
 msgid "Sent a message"
 msgstr "Eine Nachricht senden"
 
@@ -12420,9 +12537,6 @@
 msgid "Cannot start browser configuration program."
 msgstr "Kann das Browser-Konfigurationsprogramm nicht starten."
 
-msgid "ST_UN server:"
-msgstr "ST_UN Server:"
-
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
 msgstr "<span style=\"italic\">Beispiel: stunserver.org</span>"
 
@@ -12447,6 +12561,10 @@
 msgid "_End port:"
 msgstr "_End-Port:"
 
+#. TURN server
+msgid "Relay Server (TURN)"
+msgstr "Relay-Server (TURN)"
+
 msgid "Proxy Server &amp; Browser"
 msgstr "Proxy-Server &amp; Browser"
 
@@ -12477,7 +12595,7 @@
 
 #. This is a global option that affects SOCKS4 usage even with account-specific proxy settings
 msgid "Use remote DNS with SOCKS4 proxies"
-msgstr "Remote-DNS mit SOCKS4-Proxys benuten"
+msgstr "Remote-DNS mit SOCKS4-Proxys benutzen"
 
 msgid "_User:"
 msgstr "_Benutzer:"
@@ -14003,3 +14121,16 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr ""
 "Dieses Plugin ist nützlich zur Fehlersuche in XMPP-Servern oder -Clients."
+
+#~ msgid "Invite message"
+#~ msgstr "Einladungsnachricht"
+
+#~ msgid ""
+#~ "Please enter the name of the user you wish to invite,\n"
+#~ "along with an optional invite message."
+#~ msgstr ""
+#~ "Bitte geben Sie den Benutzernamen der Person ein, die Sie einladen "
+#~ "möchten zusammen mit einer optionalen Einladungsnachricht."
+
+#~ msgid "ST_UN server:"
+#~ msgstr "ST_UN Server:"