changeset 15735:cf58d8ec3b0d

merge of '943e1b86728490e22c089e8aba18e950e8a726c2' and 'ec0240858e45006ba6bc6bf78be7edaeeffa963a'
author Sean Egan <seanegan@gmail.com>
date Mon, 26 Feb 2007 06:24:41 +0000
parents 72d66bc51c43 (diff) 427ca6a0aa87 (current diff)
children dad514810a45
files pidgin/gtkaccount.c
diffstat 31 files changed, 278 insertions(+), 94 deletions(-) [+]
line wrap: on
line diff
--- a/configure.ac	Mon Feb 26 06:34:08 2007 +0000
+++ b/configure.ac	Mon Feb 26 06:24:41 2007 +0000
@@ -1929,11 +1929,16 @@
 		   pidgin/pixmaps/protocols/48/scalable/Makefile
 		   pidgin/pixmaps/status/Makefile
 		   pidgin/pixmaps/status/16/Makefile
+		   pidgin/pixmaps/status/16/rtl/Makefile
 		   pidgin/pixmaps/status/16/scalable/Makefile
 		   pidgin/pixmaps/status/22/Makefile
+		   pidgin/pixmaps/status/22/rtl/Makefile
 		   pidgin/pixmaps/status/22/scalable/Makefile
 		   pidgin/pixmaps/status/32/Makefile
+		   pidgin/pixmaps/status/32/rtl/Makefile
 		   pidgin/pixmaps/status/32/scalable/Makefile
+		   pidgin/pixmaps/status/48/Makefile
+		   pidgin/pixmaps/status/48/rtl/Makefile
 		   pidgin/pixmaps/toolbar/Makefile
 		   pidgin/pixmaps/toolbar/16/Makefile
 		   pidgin/pixmaps/toolbar/16/scalable/Makefile
--- a/pidgin/gaimstock.c	Mon Feb 26 06:34:08 2007 +0000
+++ b/pidgin/gaimstock.c	Mon Feb 26 06:24:41 2007 +0000
@@ -105,72 +105,74 @@
   gboolean extra_small;
   gboolean small;
   gboolean medium;
+  gboolean large;
   gboolean huge;
+  gboolean rtl;
 } const sized_stock_icons [] = {
-	{ PIDGIN_STOCK_STATUS_AVAILABLE,   "status", "available.png", 	TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_AVAILABLE_I, "status", "available_i.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_AWAY, 	   "status", "away.png",	TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_AWAY_I, 	"status", "away_i.png",		TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_BUSY, 	"status", "busy.png", 		TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_BUSY_I, 	"status", "busy_i.png", 	TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_CHAT, 	"status", "chat.png",		TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_XA, 	"status", "extended-away.png",	TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_XA_I, 	"status", "extended-away_i.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_LOGIN, 	"status", "log-in.png",		TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_LOGOUT, 	"status", "log-out.png",	TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_OFFLINE, 	"status", "offline.png",	TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_PERSON, 	"status", "person.png",		TRUE, TRUE, TRUE, FALSE },
-	{ PIDGIN_STOCK_STATUS_MESSAGE, 	"status", "message-pending.png",TRUE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_AVAILABLE,   "status", "available.png", 	TRUE, TRUE, TRUE, TRUE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_AVAILABLE_I, "status", "available_i.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_AWAY, 	   "status", "away.png",	TRUE, TRUE, TRUE, TRUE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_AWAY_I, 	"status", "away_i.png",		TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_BUSY, 	"status", "busy.png", 		TRUE, TRUE, TRUE, TRUE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_BUSY_I, 	"status", "busy_i.png", 	TRUE, FALSE, FALSE, FALSE, FALSE,FALSE },
+	{ PIDGIN_STOCK_STATUS_CHAT, 	"status", "chat.png",		TRUE, TRUE, TRUE, TRUE, FALSE, TRUE },
+	{ PIDGIN_STOCK_STATUS_XA, 	"status", "extended-away.png",	TRUE, TRUE, TRUE, TRUE, FALSE, TRUE },
+	{ PIDGIN_STOCK_STATUS_XA_I, 	"status", "extended-away_i.png",TRUE, FALSE, FALSE, FALSE, FALSE, TRUE },
+	{ PIDGIN_STOCK_STATUS_LOGIN, 	"status", "log-in.png",		TRUE, TRUE, TRUE, TRUE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_LOGOUT, 	"status", "log-out.png",	TRUE, TRUE, TRUE, TRUE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_OFFLINE, 	"status", "offline.png",	TRUE, TRUE, TRUE, TRUE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_PERSON, 	"status", "person.png",		TRUE, TRUE, TRUE, TRUE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_MESSAGE, 	"status", "message-pending.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
 	
-	{ PIDGIN_STOCK_STATUS_IGNORED,	"emblems", "blocked.png",	TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_FOUNDER,	"emblems", "founder.png",	TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_OPERATOR,	"emblems", "operator.png",	TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_HALFOP, 	"emblems", "half-operator.png",	TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_STATUS_VOICE, 	"emblems", "voice.png",		TRUE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_IGNORED,	"emblems", "blocked.png",	TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_FOUNDER,	"emblems", "founder.png",	TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_OPERATOR,	"emblems", "operator.png",	TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_HALFOP, 	"emblems", "half-operator.png",	TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_STATUS_VOICE, 	"emblems", "voice.png",		TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
 
-	{ PIDGIN_STOCK_DIALOG_AUTH,	"dialogs", "auth.png",		TRUE, FALSE, FALSE, TRUE },
-	{ PIDGIN_STOCK_DIALOG_COOL,	"dialogs", "cool.png", 		FALSE, FALSE, FALSE, TRUE },
-	{ PIDGIN_STOCK_DIALOG_ERROR,	"dialogs", "error.png",		TRUE, FALSE, FALSE, TRUE },
-	{ PIDGIN_STOCK_DIALOG_INFO,	"dialogs", "info.png",		TRUE, FALSE, FALSE, TRUE },
-	{ PIDGIN_STOCK_DIALOG_MAIL,	"dialogs", "mail.png",		TRUE, FALSE, FALSE, TRUE },
-	{ PIDGIN_STOCK_DIALOG_QUESTION,	"dialogs", "question.png",	TRUE, FALSE, FALSE, TRUE },
-	{ PIDGIN_STOCK_DIALOG_WARNING,	"dialogs", "warning.png",	FALSE, FALSE, FALSE, TRUE },
+	{ PIDGIN_STOCK_DIALOG_AUTH,	"dialogs", "auth.png",		TRUE, FALSE, FALSE, FALSE, TRUE, FALSE },
+	{ PIDGIN_STOCK_DIALOG_COOL,	"dialogs", "cool.png", 		FALSE, FALSE, FALSE, FALSE, TRUE, FALSE },
+	{ PIDGIN_STOCK_DIALOG_ERROR,	"dialogs", "error.png",		TRUE, FALSE, FALSE, FALSE, TRUE, FALSE },
+	{ PIDGIN_STOCK_DIALOG_INFO,	"dialogs", "info.png",		TRUE, FALSE, FALSE, FALSE, TRUE, FALSE },
+	{ PIDGIN_STOCK_DIALOG_MAIL,	"dialogs", "mail.png",		TRUE, FALSE, FALSE, FALSE, TRUE, FALSE },
+	{ PIDGIN_STOCK_DIALOG_QUESTION,	"dialogs", "question.png",	TRUE, FALSE, FALSE, FALSE, TRUE, FALSE },
+	{ PIDGIN_STOCK_DIALOG_WARNING,	"dialogs", "warning.png",	FALSE, FALSE, FALSE, FALSE, TRUE, FALSE },
 
-	{ PIDGIN_STOCK_ANIMATION_CONNECT0, "animations", "connect0.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT1, "animations", "connect1.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT2, "animations", "connect2.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT3, "animations", "connect3.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT4, "animations", "connect4.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT5, "animations", "connect5.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT6, "animations", "connect6.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT7, "animations", "connect7.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT8, "animations", "connect8.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_TYPING0,  "animations", "typing0.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_TYPING1,  "animations", "typing1.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_TYPING2,  "animations", "typing2.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_TYPING3,  "animations", "typing3.png",TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_ANIMATION_TYPING4,  "animations", "typing4.png",TRUE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT0, "animations", "connect0.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT1, "animations", "connect1.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT2, "animations", "connect2.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT3, "animations", "connect3.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT4, "animations", "connect4.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT5, "animations", "connect5.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT6, "animations", "connect6.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT7, "animations", "connect7.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT8, "animations", "connect8.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_TYPING0,  "animations", "typing0.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_TYPING1,  "animations", "typing1.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_TYPING2,  "animations", "typing2.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_TYPING3,  "animations", "typing3.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_ANIMATION_TYPING4,  "animations", "typing4.png",TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
 
-	{ PIDGIN_STOCK_TOOLBAR_ACCOUNTS, "toolbar", "accounts.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_BGCOLOR, "toolbar", "change-bgcolor.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_FGCOLOR, "toolbar", "change-fgcolor.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_SMILEY, "toolbar", "emote-select.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, "toolbar", "font-size-down.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_TEXT_LARGER, "toolbar", "font-size-up.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, "toolbar", "insert-image.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_INSERT_LINK, "toolbar", "insert-link.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, "toolbar", "message-new.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_PLUGINS, "toolbar", "plugins.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_TYPING, "toolbar", "typing.png", TRUE, FALSE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TOOLBAR_PENDING, "status", "message-pending.png", TRUE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_ACCOUNTS, "toolbar", "accounts.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_BGCOLOR, "toolbar", "change-bgcolor.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_FGCOLOR, "toolbar", "change-fgcolor.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_SMILEY, "toolbar", "emote-select.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, "toolbar", "font-size-down.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_TEXT_LARGER, "toolbar", "font-size-up.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, "toolbar", "insert-image.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_INSERT_LINK, "toolbar", "insert-link.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, "toolbar", "message-new.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_PLUGINS, "toolbar", "plugins.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_TYPING, "toolbar", "typing.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TOOLBAR_PENDING, "status", "message-pending.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
 	
-	{ PIDGIN_STOCK_TRAY_AVAILABLE, "tray", "tray-online.png", FALSE, TRUE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TRAY_AWAY, "tray", "tray-away.png", FALSE, TRUE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TRAY_BUSY, "tray", "tray-busy.png", FALSE, TRUE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TRAY_XA, "tray", "tray-extended-away.png", FALSE, TRUE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TRAY_OFFLINE, "tray", "tray-offline.png", FALSE, TRUE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TRAY_CONNECT, "tray", "tray-connecting.png", FALSE, TRUE, FALSE, FALSE },
-	{ PIDGIN_STOCK_TRAY_PENDING, "tray", "tray-message.png", FALSE, TRUE, FALSE, FALSE }
+	{ PIDGIN_STOCK_TRAY_AVAILABLE, "tray", "tray-online.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TRAY_AWAY, "tray", "tray-away.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TRAY_BUSY, "tray", "tray-busy.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TRAY_XA, "tray", "tray-extended-away.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TRAY_OFFLINE, "tray", "tray-offline.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TRAY_CONNECT, "tray", "tray-connecting.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE },
+	{ PIDGIN_STOCK_TRAY_PENDING, "tray", "tray-message.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE }
 };
 
 static gchar *
@@ -194,7 +196,7 @@
 
 static void
 add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, 
-	       const char *size, const char *file)
+	       gboolean rtl, const char *size, const char *file)
 {
 	char *filename;
 	GtkIconSource *source;	
@@ -202,7 +204,8 @@
 	filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, file, NULL);
 	source = gtk_icon_source_new();
         gtk_icon_source_set_filename(source, filename);
-        gtk_icon_source_set_direction_wildcarded(source, TRUE);
+	gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR);
+        gtk_icon_source_set_direction_wildcarded(source, !rtl);
 	gtk_icon_source_set_size(source, sizeid);
         gtk_icon_source_set_size_wildcarded(source, FALSE);
         gtk_icon_source_set_state_wildcarded(source, TRUE);
@@ -219,8 +222,22 @@
 	        gtk_icon_set_add_source(iconset, source);
 	        gtk_icon_source_free(source);
 	}
+        g_free(filename);
 
-        g_free(filename);
+       if (rtl) {
+		filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, "rtl", file, NULL);
+                source = gtk_icon_source_new();
+                gtk_icon_source_set_filename(source, filename);
+                gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL);
+                gtk_icon_source_set_size(source, sizeid);
+                gtk_icon_source_set_size_wildcarded(source, FALSE);
+                gtk_icon_source_set_state_wildcarded(source, TRUE);
+                gtk_icon_set_add_source(iconset, source);
+		g_free(filename);
+		gtk_icon_source_free(source);
+        }
+
+
 }
 
 void
@@ -230,7 +247,7 @@
 	GtkIconFactory *icon_factory;
 	size_t i;
 	GtkWidget *win;
-	GtkIconSize extra_small, small, medium, huge;
+	GtkIconSize extra_small, small, medium, large, huge;
 	
 	if (stock_initted)
 		return;
@@ -288,6 +305,7 @@
 	extra_small =  gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL, 16, 16);
 	small =        gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_SMALL, 22, 22);
 	medium =       gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MEDIUM, 32, 32);
+	large =        gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_LARGE, 48, 48);
 	huge =         gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_HUGE, 64, 64);
 
 	for (i = 0; i < G_N_ELEMENTS(sized_stock_icons); i++)
@@ -297,19 +315,23 @@
 		iconset = gtk_icon_set_new();
 		if (sized_stock_icons[i].extra_small)
 			add_sized_icon(iconset, extra_small,
-				       sized_stock_icons[i].dir,
+				       sized_stock_icons[i].dir, sized_stock_icons[i].rtl,
 				       "16", sized_stock_icons[i].filename);
                if (sized_stock_icons[i].small)
                         add_sized_icon(iconset, small,
-				       sized_stock_icons[i].dir, 
+				       sized_stock_icons[i].dir,  sized_stock_icons[i].rtl,
                                        "22", sized_stock_icons[i].filename);
                if (sized_stock_icons[i].medium)
                         add_sized_icon(iconset, medium,
-			               sized_stock_icons[i].dir, 
+			               sized_stock_icons[i].dir,  sized_stock_icons[i].rtl,
                                        "32", sized_stock_icons[i].filename);
+	       if (sized_stock_icons[i].large)
+		       add_sized_icon(iconset, large,
+                                      sized_stock_icons[i].dir, sized_stock_icons[i].rtl,
+                                      "48", sized_stock_icons[i].filename);
                if (sized_stock_icons[i].huge)
                         add_sized_icon(iconset, huge,
-	                               sized_stock_icons[i].dir, 
+	                               sized_stock_icons[i].dir,  sized_stock_icons[i].rtl,
                                        "64", sized_stock_icons[i].filename);
 
 		gtk_icon_factory_add(icon_factory, sized_stock_icons[i].name, iconset);
--- a/pidgin/gaimstock.h	Mon Feb 26 06:34:08 2007 +0000
+++ b/pidgin/gaimstock.h	Mon Feb 26 06:24:41 2007 +0000
@@ -142,6 +142,7 @@
 #define PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL    "pidgin-icon-size-tango-extra-small"
 #define PIDGIN_ICON_SIZE_TANGO_SMALL          "pidgin-icon-size-tango-small"
 #define PIDGIN_ICON_SIZE_TANGO_MEDIUM         "pidgin-icon-size-tango-medium"
+#define PIDGIN_ICON_SIZE_TANGO_LARGE          "pidgin-icon-size-tango-large"
 #define PIDGIN_ICON_SIZE_TANGO_HUGE           "pidgin-icon-size-tango-huge"
 /**
  * Sets up the gaim stock repository.
--- a/pidgin/gtkconv.c	Mon Feb 26 06:34:08 2007 +0000
+++ b/pidgin/gtkconv.c	Mon Feb 26 06:24:41 2007 +0000
@@ -146,6 +146,15 @@
 static PidginWindow *hidden_convwin = NULL;
 static GList *window_list = NULL;
 
+/* Lists of status icons at all available sizes for use as window icons */
+static GList *available_list = NULL;
+static GList *away_list = NULL;
+static GList *busy_list = NULL;
+static GList *xa_list = NULL;
+static GList *login_list = NULL;
+static GList *logout_list = NULL;
+static GList *offline_list = NULL;
+static GHashTable *prpl_lists = NULL;
 
 static gboolean update_send_to_selection(PidginWindow *win);
 static void generate_send_to_items(PidginWindow *win);
@@ -2204,13 +2213,46 @@
 /**************************************************************************
  * A bunch of buddy icon functions
  **************************************************************************/
-GdkPixbuf *
-pidgin_conv_get_tab_icon(GaimConversation *conv, gboolean small_icon)
+
+static GList *get_prpl_icon_list(GaimAccount *account)
+{
+	GList *l = NULL;
+	GdkPixbuf *pixbuf;
+	GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(gaim_account_get_protocol_id(account)));
+	const char *prpl = prpl_info->list_icon(account, NULL);
+	char *filename, *path;
+	l = g_hash_table_lookup(prpl_lists, prpl);
+	if (l)
+		return l;
+	filename = g_strdup_printf("%s.png", prpl);
+	
+	path = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "16", filename, NULL);
+	pixbuf = gdk_pixbuf_new_from_file(path, NULL);
+	if (pixbuf)
+		l = g_list_append(l, pixbuf);
+	g_free(path);
+	
+	path = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", filename, NULL);
+        pixbuf = gdk_pixbuf_new_from_file(path, NULL);
+        if (pixbuf)
+                l = g_list_append(l, pixbuf);
+        g_free(path);
+	
+	path = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "48", filename, NULL);
+        pixbuf = gdk_pixbuf_new_from_file(path, NULL);
+        if (pixbuf)
+                l = g_list_append(l, pixbuf);
+        g_free(path);
+	
+	g_hash_table_insert(prpl_lists, g_strdup(prpl), l);
+	return l;
+}
+
+static GList *
+pidgin_conv_get_tab_icons(GaimConversation *conv)
 {
 	GaimAccount *account = NULL;
 	const char *name = NULL;
-	GdkPixbuf *status = NULL;
-	GaimBlistUiOps *ops = gaim_blist_get_ui_ops();
 
 	g_return_val_if_fail(conv != NULL, NULL);
 
@@ -2224,29 +2266,69 @@
 	if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) {
 		GaimBuddy *b = gaim_find_buddy(account, name);
 		if (b != NULL) {
-			/* I hate this hack.  It fixes a bug where the pending message icon
-			 * displays in the conv tab even though it shouldn't.
-			 * A better solution would be great. */
-			if (ops && ops->update)
-				ops->update(NULL, (GaimBlistNode*)b);
-
-			status = pidgin_blist_get_status_icon((GaimBlistNode*)b,
-				(small_icon ? PIDGIN_STATUS_ICON_SMALL : PIDGIN_STATUS_ICON_LARGE));
+                	GaimPresence *p;
+	                p = gaim_buddy_get_presence(b);
+			if (gaim_presence_is_status_primitive_active(p, GAIM_STATUS_AWAY))
+				return away_list;
+			if (gaim_presence_is_status_primitive_active(p, GAIM_STATUS_UNAVAILABLE))
+				return busy_list;
+			if (gaim_presence_is_status_primitive_active(p, GAIM_STATUS_EXTENDED_AWAY))
+				return xa_list;
+			if (gaim_presence_is_status_primitive_active(p, GAIM_STATUS_OFFLINE))
+				return offline_list;
+			else
+				return available_list;
 		}
 	}
 
-	/* If they don't have a buddy icon, then use the PRPL icon */
-	if (status == NULL)
-		status = pidgin_create_prpl_icon(account, small_icon ? PIDGIN_PRPL_ICON_SMALL : PIDGIN_PRPL_ICON_LARGE);
-
-	return status;
-}
+	return get_prpl_icon_list(account);
+}
+
+GdkPixbuf *
+pidgin_conv_get_tab_icon(GaimConversation *conv, gboolean small_icon)
+{
+        GaimAccount *account = NULL;
+        const char *name = NULL;
+        GdkPixbuf *status = NULL;
+        GaimBlistUiOps *ops = gaim_blist_get_ui_ops();
+
+        g_return_val_if_fail(conv != NULL, NULL);
+
+        account = gaim_conversation_get_account(conv);
+        name = gaim_conversation_get_name(conv);
+
+        g_return_val_if_fail(account != NULL, NULL);
+        g_return_val_if_fail(name != NULL, NULL);
+
+        /* Use the buddy icon, if possible */
+        if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) {
+                GaimBuddy *b = gaim_find_buddy(account, name);
+                if (b != NULL) {
+                        /* I hate this hack.  It fixes a bug where the pending message icon
+                          * displays in the conv tab even though it shouldn't.
+                          * A better solution would be great. */
+                        if (ops && ops->update)
+                                ops->update(NULL, (GaimBlistNode*)b);
+
+                        status = pidgin_blist_get_status_icon((GaimBlistNode*)b,
+                                (small_icon ? PIDGIN_STATUS_ICON_SMALL : PIDGIN_STATUS_ICON_LARGE));
+                }
+        }
+
+        /* If they don't have a buddy icon, then use the PRPL icon */
+        if (status == NULL)
+                status = pidgin_create_prpl_icon(account, small_icon ? PIDGIN_PRPL_ICON_SMALL : PIDGIN_PRPL_ICON_LARGE);
+
+        return status;
+}
+
 
 static void
 update_tab_icon(GaimConversation *conv)
 {
 	PidginConversation *gtkconv;
 	PidginWindow *win;
+	GList *l;	
 	GdkPixbuf *status = NULL;
 
 	g_return_if_fail(conv != NULL);
@@ -2270,9 +2352,9 @@
 		(gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_IM ||
 		 gtkconv->u.im->anim == NULL))
 	{
-		status = pidgin_conv_get_tab_icon(conv, FALSE);
-
-		gtk_window_set_icon(GTK_WINDOW(win->window), status);
+		l = pidgin_conv_get_tab_icons(conv);
+
+		gtk_window_set_icon_list(GTK_WINDOW(win->window), l);
 
 		if (status != NULL)
 			g_object_unref(status);
@@ -5745,16 +5827,18 @@
 	 */
 	if (pidgin_conv_window_is_active_conversation(conv))
 	{
+		GList *l = NULL;
 		if ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) &&
 				(gtkconv->u.im->anim))
 		{
 			window_icon =
 				gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim);
 			g_object_ref(window_icon);
+			l = g_list_append(l, window_icon);
 		} else {
-			window_icon = pidgin_conv_get_tab_icon(conv, FALSE);
+			l = pidgin_conv_get_tab_icons(conv);
 		}
-		gtk_window_set_icon(GTK_WINDOW(win->window), window_icon);
+		gtk_window_set_icon_list(GTK_WINDOW(win->window), l);
 		if (window_icon != NULL)
 			g_object_unref(G_OBJECT(window_icon));
 	}
@@ -7653,6 +7737,34 @@
 	return window_list;
 }
 
+static GList* 
+make_status_icon_list(const char *stock, GtkWidget *w)
+{
+	GList *l = NULL;
+	l = g_list_append(l, gtk_widget_render_icon (w, stock,
+                                       gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), "GtkWindow"));
+	l = g_list_append(l, gtk_widget_render_icon (w, stock,
+                                       gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow"));
+	l = g_list_append(l, gtk_widget_render_icon (w, stock,
+                                       gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MEDIUM), "GtkWindow"));
+	l = g_list_append(l, gtk_widget_render_icon (w, stock,
+                                       gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE), "GtkWindow"));
+	return l;
+}
+
+static void 
+create_icon_lists(GtkWidget *w) 
+{
+	available_list = make_status_icon_list(PIDGIN_STOCK_STATUS_AVAILABLE, w);
+	busy_list = make_status_icon_list(PIDGIN_STOCK_STATUS_BUSY, w);
+	xa_list = make_status_icon_list(PIDGIN_STOCK_STATUS_XA, w);
+	login_list = make_status_icon_list(PIDGIN_STOCK_STATUS_LOGIN, w);
+	logout_list = make_status_icon_list(PIDGIN_STOCK_STATUS_LOGOUT, w);
+	offline_list = make_status_icon_list(PIDGIN_STOCK_STATUS_OFFLINE, w);
+	away_list = make_status_icon_list(PIDGIN_STOCK_STATUS_AWAY, w);
+	prpl_lists = g_hash_table_new(g_str_hash, g_str_equal);
+}
+
 PidginWindow *
 pidgin_conv_window_new()
 {
@@ -7672,6 +7784,10 @@
 	gtk_container_set_border_width(GTK_CONTAINER(win->window), 0);
 	GTK_WINDOW(win->window)->allow_shrink = TRUE;
 
+	if (available_list == NULL) {
+		create_icon_lists(win->window);
+	}
+
 	g_signal_connect(G_OBJECT(win->window), "delete_event",
 	                 G_CALLBACK(close_win_cb), win);
 
--- a/pidgin/pixmaps/status/16/Makefile.am	Mon Feb 26 06:34:08 2007 +0000
+++ b/pidgin/pixmaps/status/16/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = scalable
+SUBDIRS = rtl scalable
 
 EXTRA_DIST = 	available.png \
 		available_i.png \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/status/16/rtl/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -0,0 +1,6 @@
+EXTRA_DIST = 	chat.png extended-away.png extended-away_i.png
+
+pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/16/rtl
+
+pidginstatuspix_DATA = $(EXTRA_DIST)
+
Binary file pidgin/pixmaps/status/16/rtl/chat.png has changed
Binary file pidgin/pixmaps/status/16/rtl/extended-away.png has changed
Binary file pidgin/pixmaps/status/16/rtl/extended-away_i.png has changed
--- a/pidgin/pixmaps/status/22/Makefile.am	Mon Feb 26 06:34:08 2007 +0000
+++ b/pidgin/pixmaps/status/22/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = scalable
+SUBDIRS = rtl scalable
 
 EXTRA_DIST = 	available.png \
 		away.png \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/status/22/rtl/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -0,0 +1,6 @@
+EXTRA_DIST = 	chat.png extended-away.png
+
+pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/22/rtl
+
+pidginstatuspix_DATA = $(EXTRA_DIST)
+
Binary file pidgin/pixmaps/status/22/rtl/chat.png has changed
Binary file pidgin/pixmaps/status/22/rtl/extended-away.png has changed
--- a/pidgin/pixmaps/status/32/Makefile.am	Mon Feb 26 06:34:08 2007 +0000
+++ b/pidgin/pixmaps/status/32/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = scalable
+SUBDIRS = rtl scalable
 
 EXTRA_DIST = 	available.png \
 		away.png \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/status/32/rtl/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -0,0 +1,6 @@
+EXTRA_DIST = 	chat.png extended-away.png
+
+pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/32/rtl
+
+pidginstatuspix_DATA = $(EXTRA_DIST)
+
Binary file pidgin/pixmaps/status/32/rtl/chat.png has changed
Binary file pidgin/pixmaps/status/32/rtl/extended-away.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/status/48/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -0,0 +1,16 @@
+SUBDIRS = rtl
+
+EXTRA_DIST = 	available.png \
+		away.png \
+		busy.png \
+		chat.png \
+		extended-away.png \
+		log-in.png \
+		log-out.png \
+		offline.png \
+		person.png
+
+pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/48
+
+pidginstatuspix_DATA = $(EXTRA_DIST)
+
Binary file pidgin/pixmaps/status/48/available.png has changed
Binary file pidgin/pixmaps/status/48/away.png has changed
Binary file pidgin/pixmaps/status/48/busy.png has changed
Binary file pidgin/pixmaps/status/48/chat.png has changed
Binary file pidgin/pixmaps/status/48/extended-away.png has changed
Binary file pidgin/pixmaps/status/48/log-in.png has changed
Binary file pidgin/pixmaps/status/48/log-out.png has changed
Binary file pidgin/pixmaps/status/48/offline.png has changed
Binary file pidgin/pixmaps/status/48/person.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/status/48/rtl/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -0,0 +1,6 @@
+EXTRA_DIST = 	chat.png extended-away.png
+
+pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/48/rtl
+
+pidginstatuspix_DATA = $(EXTRA_DIST)
+
Binary file pidgin/pixmaps/status/48/rtl/chat.png has changed
Binary file pidgin/pixmaps/status/48/rtl/extended-away.png has changed
--- a/pidgin/pixmaps/status/Makefile.am	Mon Feb 26 06:34:08 2007 +0000
+++ b/pidgin/pixmaps/status/Makefile.am	Mon Feb 26 06:24:41 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = 16 22 32
+SUBDIRS = 16 22 32 48
 
 EXTRA_DIST = \
 	Makefile.mingw \