changeset 26565:23b0a0723936

propagate from branch 'im.pidgin.pidgin' (head a59a573e3b9b2eb42ff728ba9ff56095f5c9e0d0) to branch 'im.pidgin.cpw.darkrain42.xmpp.iq-handlers' (head 0799a27c10407559c5289c971bedee02a60d701a)
author Paul Aurich <paul@darkrain42.org>
date Sun, 05 Apr 2009 20:52:06 +0000
parents 457dca546b23 (current diff) f630747a813d (diff)
children 6a6984e95381
files
diffstat 19 files changed, 103 insertions(+), 55 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Sun Apr 05 19:25:45 2009 +0000
+++ b/COPYRIGHT	Sun Apr 05 20:52:06 2009 +0000
@@ -19,6 +19,7 @@
 Christopher Ayoup
 Alex Badea
 John Bailey
+Arunan Balasubramaniam
 R. Tyler Ballance
 Chris Banal
 Luca Barbato
--- a/ChangeLog	Sun Apr 05 19:25:45 2009 +0000
+++ b/ChangeLog	Sun Apr 05 20:52:06 2009 +0000
@@ -35,6 +35,10 @@
 	* The New Account dialog is now broken into three tabs.  Proxy
 	  configuration has been moved from the Advanced tab to the new tab.
 
+	Finch:
+	* The hardware cursor is updated correctly. This will be useful
+	  especially for users of braille terminals, screen readers etc.
+
 version 2.5.5 (03/01/2009):
 	libpurple:
 	* Fix a crash when removing an account with an unknown protocol id.
--- a/configure.ac	Sun Apr 05 19:25:45 2009 +0000
+++ b/configure.ac	Sun Apr 05 20:52:06 2009 +0000
@@ -788,12 +788,19 @@
 dnl #######################################################################
 AC_ARG_ENABLE(vv,
 	[AC_HELP_STRING([--disable-vv], [compile without voice and video support])],
-	enable_vv="$enableval", enable_vv="yes")
+	[enable_vv="$enableval" force_vv=$enableval], [enable_vv="yes" enable_vv=no])
 if test "x$enable_vv" != "xno"; then
 	if test "x$enable_farsight" != "xno" -a "x$enable_gstprops" != "xno"; then
 		AC_DEFINE(USE_VV, 1, [Use voice and video])
 	else
 		enable_vv="no"
+		if test "x$force_vv" = "xyes"; then
+			AC_MSG_ERROR([
+
+Dependencies for voice/video were not met. Install the necessary gstreamer and farsight packages first.
+
+			])
+		fi
 	fi
 fi
 
--- a/doc/finch.1.in	Sun Apr 05 19:25:45 2009 +0000
+++ b/doc/finch.1.in	Sun Apr 05 20:52:06 2009 +0000
@@ -59,7 +59,7 @@
 Display the version information window.
 
 .SH GNT Shortcuts
-You can use the following shortcuts:
+You can use the following shortcuts (see the "\*QWidget Actions\*U" section for a more complete list):
 .TP
 .B Alt \+ a
 Bring up a list of available actions. You can use this list to access the
@@ -378,6 +378,8 @@
 [GntWidget::binding]
 .br
 f11 = context-menu
+.br
+c-x = context-menu
 
 [GntWindow::binding]
 .br
--- a/finch/gntblist.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/gntblist.c	Sun Apr 05 20:52:06 2009 +0000
@@ -61,7 +61,7 @@
 #include <string.h>
 
 #define PREF_ROOT "/finch/blist"
-#define TYPING_TIMEOUT 4000
+#define TYPING_TIMEOUT_S 4
 
 #define SHOW_EMPTY_GROUP_TIMEOUT  60
 
@@ -2016,7 +2016,7 @@
 	}
 
 	if (ggblist->typing)
-		g_source_remove(ggblist->typing);
+		purple_timeout_remove(ggblist->typing);
 	remove_peripherals(ggblist);
 	if (ggblist->tagged)
 		g_list_free(ggblist->tagged);
@@ -2253,7 +2253,7 @@
 end:
 	g_free(escnewmessage);
 	if (ggblist->typing)
-		g_source_remove(ggblist->typing);
+		purple_timeout_remove(ggblist->typing);
 	ggblist->typing = 0;
 	return FALSE;
 }
@@ -2272,7 +2272,7 @@
 		/* Move the focus to the entry box */
 		/* XXX: Make sure the selected status can have a message */
 		gnt_box_move_focus(GNT_BOX(ggblist->window), 1);
-		ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL);
+		ggblist->typing = purple_timeout_add_seconds(TYPING_TIMEOUT_S, (GSourceFunc)remove_typing_cb, NULL);
 	}
 	else if (now->type == STATUS_SAVED_ALL)
 	{
@@ -2298,7 +2298,7 @@
 		return FALSE;
 
 	if (ggblist->typing)
-		g_source_remove(ggblist->typing);
+		purple_timeout_remove(ggblist->typing);
 	ggblist->typing = 0;
 
 	if (text[0] == '\r' && text[1] == 0)
@@ -2308,7 +2308,7 @@
 		return TRUE;
 	}
 
-	ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL);
+	ggblist->typing = purple_timeout_add_seconds(TYPING_TIMEOUT_S, (GSourceFunc)remove_typing_cb, NULL);
 	return FALSE;
 }
 
--- a/finch/libgnt/gnt.h	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gnt.h	Sun Apr 05 20:52:06 2009 +0000
@@ -48,6 +48,10 @@
 	#define G_PARAM_STATIC_BLURB  G_PARAM_PRIVATE
 #endif
 
+#if !GLIB_CHECK_VERSION(2,14,0)
+	#define g_timeout_add_seconds(time, callback, data)  g_timeout_add(time * 1000, callback, data)
+#endif
+
 /**
  * Initialize GNT.
  */
--- a/finch/libgnt/gntbox.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gntbox.c	Sun Apr 05 20:52:06 2009 +0000
@@ -78,13 +78,11 @@
 
 	g_list_foreach(box->list, (GFunc)gnt_widget_draw, NULL);
 
-	gnt_box_sync_children(box);
-
 	if (box->title && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))
 	{
 		int pos, right;
 		char *title = g_strdup(box->title);
-		
+
 		get_title_thingies(box, title, &pos, &right);
 
 		if (gnt_widget_has_focus(widget))
@@ -96,8 +94,8 @@
 		mvwaddch(widget->window, 0, right, ACS_LTEE | gnt_color_pair(GNT_COLOR_NORMAL));
 		g_free(title);
 	}
-	
-	GNTDEBUG;
+
+	gnt_box_sync_children(box);
 }
 
 static void
@@ -723,6 +721,9 @@
 	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))
 		pos = 0;
 
+	if (!box->active)
+		find_focusable_widget(box);
+
 	for (iter = box->list; iter; iter = iter->next)
 	{
 		GntWidget *w = GNT_WIDGET(iter->data);
@@ -764,6 +765,9 @@
 		copywin(w->window, widget->window, 0, 0,
 				y, x, y + height - 1, x + width - 1, FALSE);
 		gnt_widget_set_position(w, x + widget->priv.x, y + widget->priv.y);
+		if (w == box->active) {
+			wmove(widget->window, y + getcury(w->window), x + getcurx(w->window));
+		}
 	}
 }
 
--- a/finch/libgnt/gntcheckbox.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gntcheckbox.c	Sun Apr 05 20:52:06 2009 +0000
@@ -42,7 +42,7 @@
 		type = GNT_COLOR_HIGHLIGHT;
 	else
 		type = GNT_COLOR_NORMAL;
-	
+
 	wbkgdset(widget->window, '\0' | gnt_color_pair(type));
 
 	text = g_strdup_printf("[%c]", cb->checked ? 'X' : ' ');
@@ -51,7 +51,8 @@
 
 	wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_NORMAL));
 	mvwaddstr(widget->window, 0, 4, GNT_BUTTON(cb)->priv->text);
-	
+	wmove(widget->window, 0, 1);
+
 	GNTDEBUG;
 }
 
--- a/finch/libgnt/gntcombobox.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gntcombobox.c	Sun Apr 05 20:52:06 2009 +0000
@@ -73,7 +73,7 @@
 	char *text = NULL, *s;
 	GntColorType type;
 	int len;
-	
+
 	if (box->dropdown && box->selected)
 		text = gnt_tree_get_selection_text(GNT_TREE(box->dropdown));
 
@@ -94,6 +94,7 @@
 	whline(widget->window, ' ' | gnt_color_pair(type), widget->priv.width - 4 - len);
 	mvwaddch(widget->window, 1, widget->priv.width - 3, ACS_VLINE | gnt_color_pair(GNT_COLOR_NORMAL));
 	mvwaddch(widget->window, 1, widget->priv.width - 2, ACS_DARROW | gnt_color_pair(GNT_COLOR_NORMAL));
+	wmove(widget->window, 1, 1);
 
 	g_free(text);
 	GNTDEBUG;
--- a/finch/libgnt/gntentry.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gntentry.c	Sun Apr 05 20:52:06 2009 +0000
@@ -271,6 +271,7 @@
 	GntEntry *entry = GNT_ENTRY(widget);
 	int stop;
 	gboolean focus;
+	int curpos;
 
 	if ((focus = gnt_widget_has_focus(widget)))
 		wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_TEXT_NORMAL));
@@ -289,9 +290,10 @@
 	if (stop < widget->priv.width)
 		mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop);
 
+	curpos = gnt_util_onscreen_width(entry->scroll, entry->cursor);
 	if (focus)
-		mvwchgat(widget->window, 0, gnt_util_onscreen_width(entry->scroll, entry->cursor),
-				1, A_REVERSE, GNT_COLOR_TEXT_NORMAL, NULL);
+		mvwchgat(widget->window, 0, curpos, 1, A_REVERSE, GNT_COLOR_TEXT_NORMAL, NULL);
+	wmove(widget->window, 0, curpos);
 
 	GNTDEBUG;
 }
--- a/finch/libgnt/gnttextview.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gnttextview.c	Sun Apr 05 20:52:06 2009 +0000
@@ -177,7 +177,7 @@
 					gnt_color_pair(GNT_COLOR_HIGHLIGHT_D));
 	}
 
-	GNTDEBUG;
+	wmove(widget->window, 0, 0);
 }
 
 static void
--- a/finch/libgnt/gnttree.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gnttree.c	Sun Apr 05 20:52:06 2009 +0000
@@ -28,7 +28,7 @@
 #include <string.h>
 #include <ctype.h>
 
-#define SEARCH_TIMEOUT 4000   /* 4 secs */
+#define SEARCH_TIMEOUT_S 4   /* 4 secs */
 #define SEARCHING(tree)  (tree->priv->search && tree->priv->search->len > 0)
 
 #define COLUMN_INVISIBLE(tree, index)  (tree->columns[index].flags & GNT_TREE_COLUMN_INVISIBLE)
@@ -420,6 +420,7 @@
 	GntTreeRow *row;
 	int pos, up, down = 0;
 	int rows, scrcol;
+	int current = 0;
 
 	if (!GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED))
 		return;
@@ -518,6 +519,7 @@
 
 		if (row == tree->current)
 		{
+			current = i;
 			attr |= A_BOLD;
 			if (gnt_widget_has_focus(widget))
 				attr |= gnt_color_pair(GNT_COLOR_HIGHLIGHT);
@@ -606,6 +608,7 @@
 		mvwaddnstr(widget->window, widget->priv.height - pos - 1, pos,
 				tree->priv->search->str, str - tree->priv->search->str);
 	}
+	wmove(widget->window, current, pos);
 
 	gnt_widget_queue_update(widget);
 }
@@ -818,7 +821,7 @@
 			gnt_bindable_perform_action_key(GNT_BINDABLE(tree), text);
 		}
 		g_source_remove(tree->priv->search_timeout);
-		tree->priv->search_timeout = g_timeout_add(SEARCH_TIMEOUT, search_timeout, tree);
+		tree->priv->search_timeout = g_timeout_add_seconds(SEARCH_TIMEOUT_S, search_timeout, tree);
 		return TRUE;
 	} else if (text[0] == ' ' && text[1] == 0) {
 		/* Space pressed */
@@ -930,7 +933,7 @@
 		return FALSE;
 	GNT_WIDGET_SET_FLAGS(GNT_WIDGET(tree), GNT_WIDGET_DISABLE_ACTIONS);
 	tree->priv->search = g_string_new(NULL);
-	tree->priv->search_timeout = g_timeout_add(SEARCH_TIMEOUT, search_timeout, tree);
+	tree->priv->search_timeout = g_timeout_add_seconds(SEARCH_TIMEOUT_S, search_timeout, tree);
 	return TRUE;
 }
 
--- a/finch/libgnt/gntwm.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/libgnt/gntwm.c	Sun Apr 05 20:52:06 2009 +0000
@@ -135,6 +135,17 @@
 	src = widget->window;
 	dst = node->window;
 	copywin(src, dst, node->scroll, 0, 0, 0, getmaxy(dst) - 1, getmaxx(dst) - 1, 0);
+
+	/* Update the hardware cursor */
+	if (GNT_IS_WINDOW(widget) || GNT_IS_BOX(widget)) {
+		GntWidget *active = GNT_BOX(widget)->active;
+		if (active) {
+			int curx = active->priv.x + getcurx(active->window);
+			int cury = active->priv.y + getcury(active->window);
+			if (wmove(node->window, cury - widget->priv.y, curx - widget->priv.x) != OK)
+				wmove(node->window, 0, 0);
+		}
+	}
 }
 
 /**
@@ -397,7 +408,7 @@
 	wm->positions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 	if (gnt_style_get_bool(GNT_STYLE_REMPOS, TRUE))
 		read_window_positions(wm);
-	g_timeout_add(IDLE_CHECK_INTERVAL * 1000, check_idle, NULL);
+	g_timeout_add_seconds(IDLE_CHECK_INTERVAL, check_idle, NULL);
 	time(&last_active_time);
 	gnt_wm_switch_workspace(wm, 0);
 }
@@ -1101,8 +1112,8 @@
 
 	g_hash_table_foreach(wm->nodes, (GHFunc)refresh_node, GINT_TO_POINTER(TRUE));
 	g_signal_emit(wm, signals[SIG_TERMINAL_REFRESH], 0);
+	gnt_ws_draw_taskbar(wm->cws, TRUE);
 	update_screen(wm);
-	gnt_ws_draw_taskbar(wm->cws, TRUE);
 	curs_set(0);   /* endwin resets the cursor to normal */
 
 	return TRUE;
@@ -1872,8 +1883,8 @@
 		}
 	}
 
+	gnt_ws_draw_taskbar(wm->cws, FALSE);
 	update_screen(wm);
-	gnt_ws_draw_taskbar(wm->cws, FALSE);
 }
 
 void gnt_wm_window_decorate(GntWM *wm, GntWidget *widget)
@@ -1885,6 +1896,7 @@
 {
 	GntWS *s;
 	int pos;
+	gboolean transient = !!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_TRANSIENT);
 
 	s = gnt_wm_widget_find_workspace(wm, widget);
 
@@ -1908,10 +1920,12 @@
 			if (s->ordered && wm->cws == s)
 				gnt_wm_raise_window(wm, s->ordered->data);
 		}
+	} else if (transient && wm->cws && wm->cws->ordered) {
+		gnt_wm_update_window(wm, wm->cws->ordered->data);
 	}
 
+	gnt_ws_draw_taskbar(wm->cws, FALSE);
 	update_screen(wm);
-	gnt_ws_draw_taskbar(wm->cws, FALSE);
 }
 
 time_t gnt_wm_get_idle_time()
@@ -2119,7 +2133,7 @@
 	if (write_timeout) {
 		g_source_remove(write_timeout);
 	}
-	write_timeout = g_timeout_add(10000, write_already, wm);
+	write_timeout = g_timeout_add_seconds(10, write_already, wm);
 }
 
 void gnt_wm_move_window(GntWM *wm, GntWidget *widget, int x, int y)
@@ -2181,8 +2195,8 @@
 		GntNode *nd = g_hash_table_lookup(wm->nodes, wm->_list.window);
 		top_panel(nd->panel);
 	}
+	gnt_ws_draw_taskbar(wm->cws, FALSE);
 	update_screen(wm);
-	gnt_ws_draw_taskbar(wm->cws, FALSE);
 }
 
 void gnt_wm_update_window(GntWM *wm, GntWidget *widget)
@@ -2207,8 +2221,8 @@
 
 	if (ws == wm->cws || GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_TRANSIENT)) {
 		gnt_wm_copy_win(widget, node);
+		gnt_ws_draw_taskbar(wm->cws, FALSE);
 		update_screen(wm);
-		gnt_ws_draw_taskbar(wm->cws, FALSE);
 	} else if (ws && ws != wm->cws && GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_URGENT)) {
 		if (!act || (act && !g_list_find(act, ws)))
 			act = g_list_prepend(act, ws);
--- a/finch/plugins/gntgf.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/finch/plugins/gntgf.c	Sun Apr 05 20:52:06 2009 +0000
@@ -47,6 +47,7 @@
 #include <blist.h>
 #include <conversation.h>
 #include <debug.h>
+#include <eventloop.h>
 #include <util.h>
 
 #include <gnt.h>
@@ -75,7 +76,7 @@
 {
 	toasters = g_list_remove(toasters, toast);
 	gnt_widget_destroy(toast->window);
-	g_source_remove(toast->timer);
+	purple_timeout_remove(toast->timer);
 	g_free(toast);
 }
 
@@ -220,7 +221,7 @@
 	}
 	gnt_widget_draw(window);
 
-	toast->timer = g_timeout_add(4000, (GSourceFunc)remove_toaster, toast);
+	toast->timer = purple_timeout_add_seconds(4, (GSourceFunc)remove_toaster, toast);
 	toasters = g_list_prepend(toasters, toast);
 }
 
--- a/libpurple/media-gst.h	Sun Apr 05 19:25:45 2009 +0000
+++ b/libpurple/media-gst.h	Sun Apr 05 20:52:06 2009 +0000
@@ -24,8 +24,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef __MEDIA_GST_H_
-#define __MEDIA_GST_H_
+#ifndef _PURPLE_MEDIA_GST_H_
+#define _PURPLE_MEDIA_GST_H_
 
 #include "media.h"
 #include "mediamanager.h"
@@ -170,4 +170,4 @@
 
 G_END_DECLS
 
-#endif  /* __MEDIA_GST_H_ */
+#endif  /* _PURPLE_MEDIA_GST_H_ */
--- a/libpurple/media.h	Sun Apr 05 19:25:45 2009 +0000
+++ b/libpurple/media.h	Sun Apr 05 20:52:06 2009 +0000
@@ -24,11 +24,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef __MEDIA_H_
-#define __MEDIA_H_
-
-#include "signals.h"
-#include "util.h"
+#ifndef _PURPLE_MEDIA_H_
+#define _PURPLE_MEDIA_H_
 
 #include <glib.h>
 #include <glib-object.h>
@@ -129,6 +126,9 @@
 	PURPLE_MEDIA_NETWORK_PROTOCOL_TCP,
 } PurpleMediaNetworkProtocol;
 
+#include "signals.h"
+#include "util.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -685,4 +685,4 @@
 
 G_END_DECLS
 
-#endif  /* __MEDIA_H_ */
+#endif  /* _PURPLE_MEDIA_H_ */
--- a/libpurple/mediamanager.h	Sun Apr 05 19:25:45 2009 +0000
+++ b/libpurple/mediamanager.h	Sun Apr 05 20:52:06 2009 +0000
@@ -24,12 +24,17 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef __MEDIA_MANAGER_H_
-#define __MEDIA_MANAGER_H_
+#ifndef _PURPLE_MEDIA_MANAGER_H_
+#define _PURPLE_MEDIA_MANAGER_H_
 
 #include <glib.h>
 #include <glib-object.h>
 
+/** @copydoc _PurpleMediaManager */
+typedef struct _PurpleMediaManager PurpleMediaManager;
+/** @copydoc _PurpleMediaManagerClass */
+typedef struct _PurpleMediaManagerClass PurpleMediaManagerClass;
+
 #include "connection.h"
 #include "media.h"
 
@@ -42,11 +47,6 @@
 #define PURPLE_IS_MEDIA_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_MANAGER))
 #define PURPLE_MEDIA_MANAGER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerClass))
 
-/** @copydoc _PurpleMediaManager */
-typedef struct _PurpleMediaManager PurpleMediaManager;
-/** @copydoc _PurpleMediaManagerClass */
-typedef struct _PurpleMediaManagerClass PurpleMediaManagerClass;
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -220,4 +220,4 @@
 
 G_END_DECLS
 
-#endif  /* __MEDIA_MANAGER_H_ */
+#endif  /* _PURPLE_MEDIA_MANAGER_H_ */
--- a/libpurple/util.h	Sun Apr 05 19:25:45 2009 +0000
+++ b/libpurple/util.h	Sun Apr 05 20:52:06 2009 +0000
@@ -31,23 +31,26 @@
 
 #include <stdio.h>
 
+typedef struct _PurpleUtilFetchUrlData PurpleUtilFetchUrlData;
+typedef struct _PurpleMenuAction PurpleMenuAction;
+typedef struct _PurpleKeyValuePair PurpleKeyValuePair;
+
 #include "account.h"
 #include "xmlnode.h"
 #include "notify.h"
 
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-typedef struct _PurpleUtilFetchUrlData PurpleUtilFetchUrlData;
-
-typedef struct _PurpleMenuAction
+struct _PurpleMenuAction
 {
 	char *label;
 	PurpleCallback callback;
 	gpointer data;
 	GList *children;
-} PurpleMenuAction;
+};
 
 typedef char *(*PurpleInfoFieldFormatCallback)(const char *field, size_t len);
 
@@ -57,12 +60,12 @@
  * This is used by, among other things, purple_gtk_combo* functions to pass in a
  * list of key-value pairs so it can display a user-friendly value.
  */
-typedef struct _PurpleKeyValuePair
+struct _PurpleKeyValuePair
 {
 	gchar *key;
 	void *value;
 
-} PurpleKeyValuePair;
+};
 
 /**
  * Creates a new PurpleMenuAction.
--- a/pidgin/gtkimhtml.c	Sun Apr 05 19:25:45 2009 +0000
+++ b/pidgin/gtkimhtml.c	Sun Apr 05 20:52:06 2009 +0000
@@ -3320,7 +3320,8 @@
 			pos++;
 		} else if ((pos == 0 || wpos == 0 || isspace(*(c - 1))) &&
 		           (len_protocol = gtk_imhtml_is_protocol(c)) > 0 &&
-				   c[len_protocol] && !isspace(c[len_protocol])) {
+				   c[len_protocol] && !isspace(c[len_protocol]) &&
+				   (c[len_protocol] != '<' || !gtk_imhtml_is_tag(c + 1, NULL, NULL, NULL))) {
 			br = FALSE;
 			if (wpos > 0) {
 				gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos);