changeset 25106:d17d6e83f428

Added layout capabilities to blist themes
author Justin Rodriguez <ffdragon@soc.pidgin.im>
date Tue, 22 Jul 2008 03:08:59 +0000
parents fc3600ba68f1
children 748308865dbf
files pidgin/gtkblist-loader.c pidgin/gtkblist-theme.h pidgin/gtkblist.c
diffstat 3 files changed, 205 insertions(+), 167 deletions(-) [+]
line wrap: on
line diff
--- a/pidgin/gtkblist-loader.c	Fri Jul 18 22:31:28 2008 +0000
+++ b/pidgin/gtkblist-loader.c	Tue Jul 22 03:08:59 2008 +0000
@@ -31,6 +31,7 @@
 /******************************************************************************
  * Globals
  *****************************************************************************/
+#define DEFAULT_TEXT_COLOR "black"
 /*****************************************************************************
  * Buddy List Theme Builder                                                      
  *****************************************************************************/
@@ -43,9 +44,10 @@
 	const gchar *icon_theme = NULL, *tmp;
 	gboolean sucess = TRUE;
 	GdkColor *bgcolor, *expanded_bgcolor, *collapsed_bgcolor, *buddy_bgcolor1, *buddy_bgcolor2;
+	GdkColor color;
 	FontColorPair *expanded, *collapsed, *online, *away, *offline, *message, *status;
 	gdouble transparency;
-	PidginBlistLayout *layout = g_new0(PidginBlistLayout, 1);
+	PidginBlistLayout *layout;
 	GDir *gdir;
 	PidginBlistTheme *theme;
 
@@ -67,28 +69,22 @@
 	root_node = xmlnode_from_file(dir, filename, "blist themes", "blist-loader");
 	g_return_val_if_fail(root_node != NULL, NULL);
 
-	/* colors */
+	/* init all structs and colors */
 	bgcolor = g_new0(GdkColor, 1);
 	expanded_bgcolor = g_new0(GdkColor, 1);
 	collapsed_bgcolor = g_new0(GdkColor, 1); 
 	buddy_bgcolor1 = g_new0(GdkColor, 1);
 	buddy_bgcolor2 = g_new0(GdkColor, 1);
-	
-	/* font color pairs */
+
+	layout = g_new0(PidginBlistLayout, 1);
+
 	expanded = g_new0(FontColorPair, 1);
-	expanded->color = g_new0(GdkColor, 1);
 	collapsed = g_new0(FontColorPair, 1);
-	collapsed->color = g_new0(GdkColor, 1);
 	online = g_new0(FontColorPair, 1);
-	online->color = g_new0(GdkColor, 1);
 	away = g_new0(FontColorPair, 1);
-	away->color = g_new0(GdkColor, 1);
 	offline = g_new0(FontColorPair, 1);
-	offline->color = g_new0(GdkColor, 1); 
-	message = g_new0(FontColorPair, 1);
-	message->color = g_new0(GdkColor, 1); 
+	message = g_new0(FontColorPair, 1); 
 	status = g_new0(FontColorPair, 1);
-	status->color = g_new0(GdkColor, 1);
 
 	/* Parse the tree */	
 	sub_node = xmlnode_get_child(root_node, "description");
@@ -116,12 +112,9 @@
 
 		expanded->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 
-		if ((tmp = xmlnode_get_attrib(sub_sub_node, "color")) != NULL && gdk_color_parse(tmp, expanded->color))
-			gdk_colormap_alloc_color(gdk_colormap_get_system(), expanded->color, FALSE, TRUE);
-		else {
-			g_free(expanded->color);
-			expanded->color = NULL;
-		}
+		if ((tmp = xmlnode_get_attrib(sub_sub_node, "text_color")) != NULL && gdk_color_parse(tmp, &color))
+			expanded->color = g_strdup(tmp);
+		else expanded->color = DEFAULT_TEXT_COLOR;
 	
 
 		if ((tmp = xmlnode_get_attrib(sub_sub_node, "background")) != NULL && gdk_color_parse(tmp, expanded_bgcolor))
@@ -135,12 +128,10 @@
 	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "collapsed")) != NULL)) {
 		collapsed->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 
-		if((tmp = xmlnode_get_attrib(sub_sub_node, "color")) != NULL && gdk_color_parse(tmp, collapsed->color))
-			gdk_colormap_alloc_color(gdk_colormap_get_system(), collapsed->color, FALSE, TRUE);
-		else {
-			g_free(collapsed->color);
-			collapsed->color = NULL;
-		}
+		if((tmp = xmlnode_get_attrib(sub_sub_node, "text_color")) != NULL && gdk_color_parse(tmp, &color))
+			collapsed->color = g_strdup(tmp);
+		else collapsed->color = DEFAULT_TEXT_COLOR;
+
 		if ((tmp = xmlnode_get_attrib(sub_sub_node, "background")) != NULL && gdk_color_parse(tmp, collapsed_bgcolor))
 			gdk_colormap_alloc_color(gdk_colormap_get_system(), collapsed_bgcolor, FALSE, TRUE);
 		else {
@@ -153,11 +144,11 @@
 	if ((sucess = sucess && (sub_node = xmlnode_get_child(root_node, "buddys")) != NULL &&
 		     (sub_sub_node = xmlnode_get_child(sub_node, "placement")) != NULL)) { 
 
-		layout->buddy_icon = atoi(xmlnode_get_attrib(sub_sub_node, "status_icon"));
+		layout->status_icon = atoi(xmlnode_get_attrib(sub_sub_node, "status_icon"));
 		layout->text = atoi(xmlnode_get_attrib(sub_sub_node, "name"));
-		layout->buddy_icon = atoi(xmlnode_get_attrib(sub_sub_node, "buddy_icon"));
+		layout->emblem = atoi(xmlnode_get_attrib(sub_sub_node, "emblem"));
 		layout->protocol_icon = atoi(xmlnode_get_attrib(sub_sub_node, "protocol_icon"));
-		layout->emblem = atoi(xmlnode_get_attrib(sub_sub_node, "emblem"));
+		layout->buddy_icon = atoi(xmlnode_get_attrib(sub_sub_node, "buddy_icon"));		
 		layout->show_status = atoi(xmlnode_get_attrib(sub_sub_node, "status_icon")) != 0;
 	}
 
@@ -180,52 +171,37 @@
 
 	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "online_text")) != NULL)) {
 		online->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
-		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), online->color))
-			gdk_colormap_alloc_color(gdk_colormap_get_system(), online->color, FALSE, TRUE);
-		else {
-			g_free(online->color);
-			online->color = NULL;
-		}
+		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), &color))
+			online->color = g_strdup(tmp);
+		else online->color = DEFAULT_TEXT_COLOR;
 	}
 
 	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "away_text")) != NULL)) {
 		away->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
-		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), away->color))
-			gdk_colormap_alloc_color(gdk_colormap_get_system(), away->color, FALSE, TRUE);
-		else {
-			g_free(away->color);
-			away->color = NULL;
-		}
+		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), &color))
+			away->color = g_strdup(tmp);
+		else away->color = DEFAULT_TEXT_COLOR;
 	}
 
 	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "offline_text")) != NULL)) {
 		offline->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
-		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), offline->color))
-			gdk_colormap_alloc_color(gdk_colormap_get_system(), offline->color, FALSE, TRUE);
-		else {
-			g_free(offline->color);
-			online->color = NULL;
-		}
+		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), &color))
+			online->color = g_strdup(tmp);
+		else online->color = DEFAULT_TEXT_COLOR;
 	}
 	
 	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "message_text")) != NULL)) {
 		message->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
-		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), message->color))
-			gdk_colormap_alloc_color(gdk_colormap_get_system(), message->color, FALSE, TRUE);
-		else {
-			g_free(message->color);
-			message->color = NULL;
-		}
+		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), &color))
+			message->color = g_strdup(tmp);
+		else message->color = DEFAULT_TEXT_COLOR;
 	}
 	
 	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "status_text")) != NULL)) {
 		status->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
-		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), status->color))
-			gdk_colormap_alloc_color(gdk_colormap_get_system(), status->color, FALSE, TRUE);
-		else {
-			g_free(status->color);
-			status->color = NULL;
-		}
+		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), &color))
+			status->color = g_strdup(tmp);
+		else status->color = DEFAULT_TEXT_COLOR;
 	}
 
 	/* name is required for theme manager */
--- a/pidgin/gtkblist-theme.h	Fri Jul 18 22:31:28 2008 +0000
+++ b/pidgin/gtkblist-theme.h	Tue Jul 22 03:08:59 2008 +0000
@@ -63,17 +63,17 @@
 typedef struct
 {
 	gchar *font;
-	GdkColor *color;
+	gchar *color;
 
 } FontColorPair;
 
 typedef struct
 {
-	gint buddy_icon;
+	gint status_icon;
 	gint text;
-	gint status_icon;
+	gint emblem;
 	gint protocol_icon;
-	gint emblem;
+	gint buddy_icon;
 	gboolean show_status; 
 
 } PidginBlistLayout;
--- a/pidgin/gtkblist.c	Fri Jul 18 22:31:28 2008 +0000
+++ b/pidgin/gtkblist.c	Tue Jul 22 03:08:59 2008 +0000
@@ -127,6 +127,7 @@
 	PidginMiniDialog *signed_on_elsewhere;
 
 	PidginBlistTheme *current_theme;
+
 } PidginBuddyListPrivate;
 
 #define PIDGIN_BUDDY_LIST_GET_PRIVATE(list) \
@@ -5231,11 +5232,148 @@
 }
 #endif
 
+/* builds the blist layout according to to the current theme */
+static void
+pidgin_blist_build_layout(PurpleBuddyList *list)
+{
+	GtkTreeViewColumn *column;
+	PidginBlistLayout *layout;
+	PidginBlistTheme *theme;
+	GtkCellRenderer *rend;
+	gint i;
+
+	column = gtkblist->text_column;
+
+	if ((theme = pidgin_blist_get_theme()) != NULL)
+		layout = pidgin_blist_theme_get_layout(theme);
+	else {
+		/* Default Layout */
+		layout = g_new0(PidginBlistLayout, 1);
+
+		layout->status_icon = 0;				
+		layout->text = 1;
+		layout->emblem = 2;
+		layout->protocol_icon = 3;
+		layout->buddy_icon = 4;
+		layout->show_status = 5; 
+	}
+
+	gtk_tree_view_column_clear(column);
+
+	/* group */
+	rend = pidgin_cell_renderer_expander_new();
+	gtk_tree_view_column_pack_start(column, rend, FALSE);
+	gtk_tree_view_column_set_attributes(column, rend,
+					    "visible", GROUP_EXPANDER_VISIBLE_COLUMN,
+					    "expander-visible", GROUP_EXPANDER_COLUMN,
+#if GTK_CHECK_VERSION(2,6,0)
+					    "sensitive", GROUP_EXPANDER_COLUMN,
+					    "cell-background-gdk", BGCOLOR_COLUMN,
+#endif
+					    NULL);
+
+	/* contact */
+	rend = pidgin_cell_renderer_expander_new();
+	gtk_tree_view_column_pack_start(column, rend, FALSE);
+	gtk_tree_view_column_set_attributes(column, rend,
+					    "expander-visible", CONTACT_EXPANDER_COLUMN,
+#if GTK_CHECK_VERSION(2,6,0)
+					    "sensitive", CONTACT_EXPANDER_COLUMN,
+					    "cell-background-gdk", BGCOLOR_COLUMN,
+#endif
+					    "visible", CONTACT_EXPANDER_VISIBLE_COLUMN,
+					    NULL);
+
+	for (i = 0; i < 5; i++) {
+
+		if (layout->status_icon == i) {		
+			/* status icons */
+			rend = gtk_cell_renderer_pixbuf_new();
+			gtk_tree_view_column_pack_start(column, rend, FALSE);
+			gtk_tree_view_column_set_attributes(column, rend,
+							    "pixbuf", STATUS_ICON_COLUMN,
+							    "visible", STATUS_ICON_VISIBLE_COLUMN,
+#if GTK_CHECK_VERSION(2,6,0)
+							    "cell-background-gdk", BGCOLOR_COLUMN,
+#endif	
+							    NULL);
+			g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL);
+
+		} else if (layout->text == i) {
+			/* name */
+			gtkblist->text_rend = rend = gtk_cell_renderer_text_new();
+			gtk_tree_view_column_pack_start (column, rend, TRUE);
+			gtk_tree_view_column_set_attributes(column, rend,
+#if GTK_CHECK_VERSION(2,6,0)
+							    "cell-background-gdk", BGCOLOR_COLUMN,
+#endif
+							    "markup", NAME_COLUMN,
+							    NULL);
+#if GTK_CHECK_VERSION(2,6,0)
+			g_signal_connect(G_OBJECT(rend), "editing-started", G_CALLBACK(gtk_blist_renderer_editing_started_cb), NULL);
+			g_signal_connect(G_OBJECT(rend), "editing-canceled", G_CALLBACK(gtk_blist_renderer_editing_cancelled_cb), list);
+#endif
+			g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), list);
+			g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL);
+#if GTK_CHECK_VERSION(2,6,0)
+			g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+#endif
+
+			/* idle */
+			rend = gtk_cell_renderer_text_new();
+			g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL);
+			gtk_tree_view_column_pack_start(column, rend, FALSE);
+			gtk_tree_view_column_set_attributes(column, rend,
+							    "markup", IDLE_COLUMN,
+							    "visible", IDLE_VISIBLE_COLUMN,
+#if GTK_CHECK_VERSION(2,6,0)
+							    "cell-background-gdk", BGCOLOR_COLUMN,
+#endif
+							    NULL);
+		} else if (layout->emblem == i) {
+			/* emblem */
+			rend = gtk_cell_renderer_pixbuf_new();
+			g_object_set(rend, "xalign", 1.0, "yalign", 0.5, "ypad", 0, "xpad", 3, NULL);
+			gtk_tree_view_column_pack_start(column, rend, FALSE);
+			gtk_tree_view_column_set_attributes(column, rend, "pixbuf", EMBLEM_COLUMN,
+#if GTK_CHECK_VERSION(2,6,0)
+									  "cell-background-gdk", BGCOLOR_COLUMN,
+#endif
+									  "visible", EMBLEM_VISIBLE_COLUMN, NULL);
+
+		} else if (layout->protocol_icon == i) {
+			/* protocol icon */
+			rend = gtk_cell_renderer_pixbuf_new();
+			gtk_tree_view_column_pack_start(column, rend, FALSE);
+			gtk_tree_view_column_set_attributes(column, rend,
+							   "pixbuf", PROTOCOL_ICON_COLUMN,
+							   "visible", PROTOCOL_ICON_VISIBLE_COLUMN,
+#if GTK_CHECK_VERSION(2,6,0)
+							   "cell-background-gdk", BGCOLOR_COLUMN,
+#endif
+							  NULL);
+			g_object_set(rend, "xalign", 0.0, "xpad", 3, "ypad", 0, NULL);
+
+		} else if (layout->buddy_icon == i) {
+			/* buddy icon */
+			rend = gtk_cell_renderer_pixbuf_new();
+			g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL);
+			gtk_tree_view_column_pack_start(column, rend, FALSE);
+			gtk_tree_view_column_set_attributes(column, rend, "pixbuf", BUDDY_ICON_COLUMN,
+#if GTK_CHECK_VERSION(2,6,0)
+							    "cell-background-gdk", BGCOLOR_COLUMN,
+#endif
+							    "visible", BUDDY_ICON_VISIBLE_COLUMN,
+							    NULL);
+		}
+
+	}/* end for loop */
+}
+
 static void pidgin_blist_show(PurpleBuddyList *list)
 {
 	PidginBuddyListPrivate *priv;
 	void *handle;
-	GtkCellRenderer *rend;
 	GtkTreeViewColumn *column;
 	GtkWidget *menu;
 	GtkWidget *ebox;
@@ -5446,114 +5584,16 @@
 
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE);
 
-	/* columns */
+	/* expander columns */
 	column = gtk_tree_view_column_new();
 	gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column);
 	gtk_tree_view_column_set_visible(column, FALSE);
 	gtk_tree_view_set_expander_column(GTK_TREE_VIEW(gtkblist->treeview), column);
 
-	/* group */
-	gtkblist->text_column = column = gtk_tree_view_column_new ();
-	rend = pidgin_cell_renderer_expander_new();
-	gtk_tree_view_column_pack_start(column, rend, FALSE);
-	gtk_tree_view_column_set_attributes(column, rend,
-					    "visible", GROUP_EXPANDER_VISIBLE_COLUMN,
-					    "expander-visible", GROUP_EXPANDER_COLUMN,
-#if GTK_CHECK_VERSION(2,6,0)
-					    "sensitive", GROUP_EXPANDER_COLUMN,
-					    "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-					    NULL);
-
-	/* contact */
-	rend = pidgin_cell_renderer_expander_new();
-	gtk_tree_view_column_pack_start(column, rend, FALSE);
-	gtk_tree_view_column_set_attributes(column, rend,
-					    "expander-visible", CONTACT_EXPANDER_COLUMN,
-#if GTK_CHECK_VERSION(2,6,0)
-					    "sensitive", CONTACT_EXPANDER_COLUMN,
-					    "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-					    "visible", CONTACT_EXPANDER_VISIBLE_COLUMN,
-					    NULL);
-
-	/* status icons */
-	rend = gtk_cell_renderer_pixbuf_new();
-	gtk_tree_view_column_pack_start(column, rend, FALSE);
-	gtk_tree_view_column_set_attributes(column, rend,
-					    "pixbuf", STATUS_ICON_COLUMN,
-					    "visible", STATUS_ICON_VISIBLE_COLUMN,
-#if GTK_CHECK_VERSION(2,6,0)
-					    "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-					    NULL);
-	g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL);
-
-	/* name */
-	gtkblist->text_rend = rend = gtk_cell_renderer_text_new();
-	gtk_tree_view_column_pack_start (column, rend, TRUE);
-	gtk_tree_view_column_set_attributes(column, rend,
-#if GTK_CHECK_VERSION(2,6,0)
-					    "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-					    "markup", NAME_COLUMN,
-					    NULL);
-#if GTK_CHECK_VERSION(2,6,0)
-	g_signal_connect(G_OBJECT(rend), "editing-started", G_CALLBACK(gtk_blist_renderer_editing_started_cb), NULL);
-	g_signal_connect(G_OBJECT(rend), "editing-canceled", G_CALLBACK(gtk_blist_renderer_editing_cancelled_cb), list);
-#endif
-	g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), list);
-	g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL);
-#if GTK_CHECK_VERSION(2,6,0)
-	g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-#endif
-	gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column);
-
-	/* idle */
-	rend = gtk_cell_renderer_text_new();
-	g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL);
-	gtk_tree_view_column_pack_start(column, rend, FALSE);
-	gtk_tree_view_column_set_attributes(column, rend,
-					    "markup", IDLE_COLUMN,
-					    "visible", IDLE_VISIBLE_COLUMN,
-#if GTK_CHECK_VERSION(2,6,0)
-					    "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-					    NULL);
-
-	/* emblem */
-	rend = gtk_cell_renderer_pixbuf_new();
-	g_object_set(rend, "xalign", 1.0, "yalign", 0.5, "ypad", 0, "xpad", 3, NULL);
-	gtk_tree_view_column_pack_start(column, rend, FALSE);
-	gtk_tree_view_column_set_attributes(column, rend, "pixbuf", EMBLEM_COLUMN,
-#if GTK_CHECK_VERSION(2,6,0)
-							  "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-							  "visible", EMBLEM_VISIBLE_COLUMN, NULL);
-
-	/* protocol icon */
-	rend = gtk_cell_renderer_pixbuf_new();
-	gtk_tree_view_column_pack_start(column, rend, FALSE);
-	gtk_tree_view_column_set_attributes(column, rend,
-					   "pixbuf", PROTOCOL_ICON_COLUMN,
-					   "visible", PROTOCOL_ICON_VISIBLE_COLUMN,
-#if GTK_CHECK_VERSION(2,6,0)
-					   "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-					  NULL);
-	g_object_set(rend, "xalign", 0.0, "xpad", 3, "ypad", 0, NULL);
-
-	/* buddy icon */
-	rend = gtk_cell_renderer_pixbuf_new();
-	g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL);
-	gtk_tree_view_column_pack_start(column, rend, FALSE);
-	gtk_tree_view_column_set_attributes(column, rend, "pixbuf", BUDDY_ICON_COLUMN,
-#if GTK_CHECK_VERSION(2,6,0)
-					    "cell-background-gdk", BGCOLOR_COLUMN,
-#endif
-					    "visible", BUDDY_ICON_VISIBLE_COLUMN,
-					    NULL);
-
+	/* everything else column */
+	gtkblist->text_column = gtk_tree_view_column_new ();
+	gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->text_column);
+	pidgin_blist_build_layout(list);
 
 	g_signal_connect(G_OBJECT(gtkblist->treeview), "row-activated", G_CALLBACK(gtk_blist_row_activated_cb), NULL);
 	g_signal_connect(G_OBJECT(gtkblist->treeview), "row-expanded", G_CALLBACK(gtk_blist_row_expanded_cb), NULL);
@@ -6034,6 +6074,9 @@
 	char *mark, *esc;
 	PurpleBlistNode *selected_node = NULL;
 	GtkTreeIter iter;
+	FontColorPair *pair;
+	PidginBlistTheme *theme;
+	const gchar *text_color, *text_font;
 
 	group = (PurpleGroup*)gnode;
 
@@ -6048,9 +6091,25 @@
 		           purple_blist_get_group_online_count(group),
 		           purple_blist_get_group_size(group, FALSE));
 	}
+	
+	theme = pidgin_blist_get_theme();
+	if (theme == NULL) {
+		text_color = "black";
+		text_font = "";
+	} else if (expanded) {
+		pair = pidgin_blist_theme_get_expanded_text_info(theme);
+		text_color = pair->color;
+		text_font = pair->font;
+	}else {
+		pair = pidgin_blist_theme_get_collapsed_text_info(theme);
+		text_color = pair->color;
+		text_font = pair->font;
+	}
+		
 
 	esc = g_markup_escape_text(group->name, -1);
-	mark = g_strdup_printf("<span weight='bold'>%s</span>%s", esc ? esc : "", group_count);
+	mark = g_strdup_printf("<span foreground='%s' font_desc='%s'><span weight='bold'>%s</span>%s</span>",
+							text_color, text_font, esc ? esc : "", group_count);
 
 	g_free(esc);
 	return mark;
@@ -7187,6 +7246,7 @@
 pidgin_blist_set_theme(PidginBlistTheme *theme)
 {
 	PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	PurpleBuddyList *list = purple_get_blist();
 
 	if (theme != NULL)
 		purple_prefs_set_string(PIDGIN_PREFS_ROOT "/blist/theme", 
@@ -7195,7 +7255,9 @@
 
 	priv->current_theme = theme;
 
-	pidgin_blist_refresh(purple_get_blist());
+	pidgin_blist_build_layout(list);
+
+	pidgin_blist_refresh(list);
 }