Mercurial > pidgin.yaz
changeset 23478:4aeef8c3cce3
restructured much of the loader and themes for the buddy list, along with a basic trial of group background
color
author | Justin Rodriguez <ffdragon@soc.pidgin.im> |
---|---|
date | Tue, 15 Jul 2008 06:29:46 +0000 |
parents | a473766abaee |
children | edb03a8d54bd |
files | libpurple/xmlnode.h pidgin/gtkblist-loader.c pidgin/gtkblist-loader.h pidgin/gtkblist-theme.c pidgin/gtkblist-theme.h pidgin/gtkblist.c pidgin/gtkblist.h pidgin/gtkprefs.c |
diffstat | 8 files changed, 314 insertions(+), 237 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/xmlnode.h Fri Jul 11 19:13:24 2008 +0000 +++ b/libpurple/xmlnode.h Tue Jul 15 06:29:46 2008 +0000 @@ -26,6 +26,8 @@ #ifndef _PURPLE_XMLNODE_H_ #define _PURPLE_XMLNODE_H_ +#include <glib.h> + #ifdef __cplusplus extern "C" { #endif
--- a/pidgin/gtkblist-loader.c Fri Jul 11 19:13:24 2008 +0000 +++ b/pidgin/gtkblist-loader.c Tue Jul 15 06:29:46 2008 +0000 @@ -21,6 +21,9 @@ * */ +#include <stdlib.h> + +#include "xmlnode.h" #include "gtkblist-loader.h" #include "gtkblist-theme.h" @@ -32,11 +35,16 @@ *****************************************************************************/ static gpointer -pidgin_buddy_list_loader_build(const gchar *dir) +pidgin_blist_loader_build(const gchar *dir) { xmlnode *root_node, *sub_node, *sub_sub_node; gchar *filename, *filename_full, *data; - const gchar *icon_theme, *bgcolor, *expanded_bgcolor, *minimized_bgcolor, *buddy_bgcolor1, *buddy_bgcolor2; + const gchar *icon_theme; + GdkColor *bgcolor = NULL, + *expanded_bgcolor = NULL, + *minimized_bgcolor = NULL, + *buddy_bgcolor1 = NULL, + *buddy_bgcolor2 = NULL; font_color_pair *expanded = g_new0(font_color_pair, 1), *minimized = g_new0(font_color_pair, 1), *online = g_new0(font_color_pair, 1), @@ -47,7 +55,7 @@ gdouble transparency; blist_layout *layout = g_new0(blist_layout, 1); GDir *gdir; - PidginBuddyListTheme *theme; + PidginBlistTheme *theme; /* Find the theme file */ gdir = g_dir_open(dir, 0, NULL); @@ -68,26 +76,32 @@ sub_node = xmlnode_get_child(root_node, "description"); data = xmlnode_get_data(sub_node); - /* <inon_theme> */ + /* <icon_theme> */ sub_node = xmlnode_get_child(root_node, "icon_theme"); icon_theme = xmlnode_get_attrib(sub_node, "name"); - /* <buddy_list> */ - sub_node = xmlnode_get_child(root_node, "buddy_list"); - bgcolor = xmlnode_get_attrib(sub_node, "color"); + /* <blist> */ + sub_node = xmlnode_get_child(root_node, "blist"); transparency = atof(xmlnode_get_attrib(sub_node, "transparency")); + if(gdk_color_parse(xmlnode_get_attrib(sub_node, "color"), bgcolor)) + gdk_colormap_alloc_color(gdk_colormap_get_system(), bgcolor, FALSE, TRUE); + /* <groups> */ sub_node = xmlnode_get_child(root_node, "groups"); sub_sub_node = xmlnode_get_child(root_node, "expanded"); expanded->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font")); - expanded->color = g_strdup(xmlnode_get_attrib(sub_sub_node, "color")); - expanded_bgcolor = g_strdup(xmlnode_get_attrib(sub_sub_node, "background")); + if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), expanded->color)) + gdk_colormap_alloc_color(gdk_colormap_get_system(), expanded->color, FALSE, TRUE); + if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "background"), expanded_bgcolor)) + gdk_colormap_alloc_color(gdk_colormap_get_system(), expanded_bgcolor, FALSE, TRUE); sub_sub_node = xmlnode_get_child(root_node, "minimized"); minimized->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font")); - minimized->color = g_strdup(xmlnode_get_attrib(sub_sub_node, "color")); - minimized_bgcolor = xmlnode_get_attrib(sub_sub_node, "background"); + if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), minimized->color)) + gdk_colormap_alloc_color(gdk_colormap_get_system(), minimized->color, FALSE, TRUE); + if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "background"), minimized_bgcolor)) + gdk_colormap_alloc_color(gdk_colormap_get_system(), minimized_bgcolor, FALSE, TRUE); /* <buddys> */ sub_node = xmlnode_get_child(root_node, "buddys"); @@ -100,31 +114,38 @@ layout->show_status = (gboolean) atoi(xmlnode_get_attrib(sub_sub_node, "status_icon")); sub_sub_node = xmlnode_get_child(root_node, "background"); - buddy_bgcolor1 = xmlnode_get_attrib(sub_sub_node, "color1"); - buddy_bgcolor2 = xmlnode_get_attrib(sub_sub_node, "color2"); + if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color1"), buddy_bgcolor1)) + gdk_colormap_alloc_color(gdk_colormap_get_system(), buddy_bgcolor1, FALSE, TRUE); + if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color2"), buddy_bgcolor2)) + gdk_colormap_alloc_color(gdk_colormap_get_system(), buddy_bgcolor2, FALSE, TRUE); sub_sub_node = xmlnode_get_child(root_node, "online_text"); online->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font")); - online->color = g_strdup(xmlnode_get_attrib(sub_sub_node, "color")); + 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); sub_sub_node = xmlnode_get_child(root_node, "away_text"); away->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font")); - away->color = g_strdup(xmlnode_get_attrib(sub_sub_node, "color")); + 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); sub_sub_node = xmlnode_get_child(root_node, "offline_text"); offline->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font")); - offline->color = g_strdup(xmlnode_get_attrib(sub_sub_node, "color")); + 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); sub_sub_node = xmlnode_get_child(root_node, "message_text"); message->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font")); - message->color = g_strdup(xmlnode_get_attrib(sub_sub_node, "color")); + 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); sub_sub_node = xmlnode_get_child(root_node, "status_text"); status->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font")); - status->color = g_strdup(xmlnode_get_attrib(sub_sub_node, "color")); + 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); /* the new theme */ - theme = g_object_new(PIDGIN_TYPE_BUDDY_LIST_THEME, + theme = g_object_new(PIDGIN_TYPE_BLIST_THEME, "type", "blist", "name", xmlnode_get_attrib(root_node, "name"), "author", xmlnode_get_attrib(root_node, "author"), @@ -161,33 +182,33 @@ *****************************************************************************/ static void -pidgin_buddy_list_theme_loader_class_init (PidginBuddyListThemeLoaderClass *klass) +pidgin_blist_theme_loader_class_init (PidginBlistThemeLoaderClass *klass) { PurpleThemeLoaderClass *loader_klass = PURPLE_THEME_LOADER_CLASS(klass); - loader_klass->purple_theme_loader_build = pidgin_buddy_list_loader_build; + loader_klass->purple_theme_loader_build = pidgin_blist_loader_build; } GType -pidgin_buddy_list_theme_loader_get_type (void) +pidgin_blist_theme_loader_get_type (void) { static GType type = 0; if (type == 0) { static const GTypeInfo info = { - sizeof (PidginBuddyListThemeLoaderClass), + sizeof (PidginBlistThemeLoaderClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc)pidgin_buddy_list_theme_loader_class_init, /* class_init */ + (GClassInitFunc)pidgin_blist_theme_loader_class_init, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ - sizeof (PidginBuddyListThemeLoader), + sizeof (PidginBlistThemeLoader), 0, /* n_preallocs */ NULL, /* instance_init */ NULL, /* value table */ }; type = g_type_register_static (PURPLE_TYPE_THEME_LOADER, - "PidginBuddyListThemeLoader", + "PidginBlistThemeLoader", &info, 0); } return type;
--- a/pidgin/gtkblist-loader.h Fri Jul 11 19:13:24 2008 +0000 +++ b/pidgin/gtkblist-loader.h Tue Jul 15 06:29:46 2008 +0000 @@ -23,8 +23,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#ifndef _PIDGIN_BUDDY_LIST_THEME_LOADER_H_ -#define _PIDGIN_BUDDY_LIST_THEME_LOADER_H_ +#ifndef _PIDGIN_BLIST_THEME_LOADER_H_ +#define _PIDGIN_BLIST_THEME_LOADER_H_ #include <glib.h> #include <glib-object.h> @@ -34,24 +34,24 @@ * A pidgin buddy list theme loader. extends PurpleThemeLoader (theme-loader.h) * This is a class designed to build sound themes * - * PidginBuddyListThemeLoader is a GObject. + * PidginBlistThemeLoader is a GObject. */ -typedef struct _PidginBuddyListThemeLoader PidginBuddyListThemeLoader; -typedef struct _PidginBuddyListThemeLoaderClass PidginBuddyListThemeLoaderClass; +typedef struct _PidginBlistThemeLoader PidginBlistThemeLoader; +typedef struct _PidginBlistThemeLoaderClass PidginBlistThemeLoaderClass; -#define PIDGIN_TYPE_BUDDY_LIST_THEME_LOADER (pidgin_buddy_list_theme_loader_get_type ()) -#define PIDGIN_BUDDY_LIST_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIDGIN_TYPE_BUDDY_LIST_THEME_LOADER, PidginBuddyListThemeLoader)) -#define PIDGIN_BUDDY_LIST_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIDGIN_TYPE_BUDDY_LIST_THEME_LOADER, PidginBuddyListThemeLoaderClass)) -#define PIDGIN_IS_BUDDY_LIST_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIDGIN_TYPE_BUDDY_LIST_THEME_LOADER)) -#define PIDGIN_IS_BUDDY_LIST_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIDGIN_TYPE_BUDDY_LIST_THEME_LOADER)) -#define PIDGIN_BUDDY_LIST_THEME_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIDGIN_TYPE_BUDDY_LIST_THEME_LOADER, PidginBuddyListThemeLoaderClass)) +#define PIDGIN_TYPE_BLIST_THEME_LOADER (pidgin_blist_theme_loader_get_type ()) +#define PIDGIN_BLIST_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIDGIN_TYPE_BLIST_THEME_LOADER, PidginBlistThemeLoader)) +#define PIDGIN_BLIST_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIDGIN_TYPE_BLIST_THEME_LOADER, PidginBlistThemeLoaderClass)) +#define PIDGIN_IS_BLIST_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIDGIN_TYPE_BLIST_THEME_LOADER)) +#define PIDGIN_IS_BLIST_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIDGIN_TYPE_BLIST_THEME_LOADER)) +#define PIDGIN_BLIST_THEME_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIDGIN_TYPE_BLIST_THEME_LOADER, PidginBlistThemeLoaderClass)) -struct _PidginBuddyListThemeLoader +struct _PidginBlistThemeLoader { PurpleThemeLoader parent; }; -struct _PidginBuddyListThemeLoaderClass +struct _PidginBlistThemeLoaderClass { PurpleThemeLoaderClass parent_class; }; @@ -65,7 +65,7 @@ * GObject foo. * @internal. */ -GType pidgin_buddy_list_theme_loader_get_type(void); +GType pidgin_blist_theme_loader_get_type(void); G_END_DECLS -#endif /* _PIDGIN_BUDDY_LIST_THEME_LOADER_H_ */ +#endif /* _PIDGIN_BLIST_THEME_LOADER_H_ */
--- a/pidgin/gtkblist-theme.c Fri Jul 11 19:13:24 2008 +0000 +++ b/pidgin/gtkblist-theme.c Tue Jul 15 06:29:46 2008 +0000 @@ -23,12 +23,11 @@ #include "gtkblist-theme.h" -#define PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(Gobject) \ - ((PidginBuddyListThemePrivate *) ((PIDGIN_BUDDY_LIST_THEME(Gobject))->priv)) +#define PIDGIN_BLIST_THEME_GET_PRIVATE(Gobject) \ + ((PidginBlistThemePrivate *) ((PIDGIN_BLIST_THEME(Gobject))->priv)) #define free_font_and_color(font_color_pair) \ g_free(font_color_pair->font); \ - g_free(font_color_pair->color); \ g_free(font_color_pair) /****************************************************************************** * Structs @@ -37,20 +36,20 @@ gchar *icon_theme; /* Buddy list */ - gchar *bgcolor; + GdkColor *bgcolor; gdouble opacity; blist_layout *layout; /* groups */ - gchar *expanded_color; + GdkColor *expanded_color; font_color_pair *expanded; - gchar *minimized_color; - font_color_pair *minimized; + GdkColor *collapsed_color; + font_color_pair *collapsed; /* buddy */ - gchar *buddy_bgcolor1; - gchar *buddy_bgcolor2; + GdkColor *buddy_bgcolor1; + GdkColor *buddy_bgcolor2; font_color_pair *online; font_color_pair *away; @@ -58,7 +57,7 @@ font_color_pair *message; font_color_pair *status; -} PidginBuddyListThemePrivate; +} PidginBlistThemePrivate; /****************************************************************************** * Globals @@ -77,8 +76,8 @@ PROP_LAYOUT, PROP_EXPANDED_COLOR, PROP_EXPANDED_TEXT, - PROP_MINIMIZED_COLOR, - PROP_MINIMIZED_TEXT, + PROP_COLLAPSED_COLOR, + PROP_COLLAPSED_TEXT, PROP_BGCOLOR1, PROP_BGCOLOR2, PROP_ONLINE, @@ -92,18 +91,18 @@ *****************************************************************************/ static void -pidgin_buddy_list_theme_init(GTypeInstance *instance, +pidgin_blist_theme_init(GTypeInstance *instance, gpointer klass) { - (PIDGIN_BUDDY_LIST_THEME(instance))->priv = g_new0(PidginBuddyListThemePrivate, 1); + (PIDGIN_BLIST_THEME(instance))->priv = g_new0(PidginBlistThemePrivate, 1); } static void -pidgin_buddy_list_theme_get_property(GObject *obj, guint param_id, GValue *value, +pidgin_blist_theme_get_property(GObject *obj, guint param_id, GValue *value, GParamSpec *psec) { - PidginBuddyListThemePrivate *priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(obj); + PidginBlistThemePrivate *priv = PIDGIN_BLIST_THEME_GET_PRIVATE(obj); switch(param_id) { case PROP_ICON_THEME: @@ -119,22 +118,22 @@ g_value_set_pointer(value, priv->layout); break; case PROP_EXPANDED_COLOR: - g_value_set_string(value, priv->expanded_color); + g_value_set_pointer(value, priv->expanded_color); break; case PROP_EXPANDED_TEXT: g_value_set_pointer(value, priv->expanded); break; - case PROP_MINIMIZED_COLOR: - g_value_set_string(value, priv->minimized_color); + case PROP_COLLAPSED_COLOR: + g_value_set_pointer(value, priv->collapsed_color); break; - case PROP_MINIMIZED_TEXT: - g_value_set_pointer(value, priv->minimized); + case PROP_COLLAPSED_TEXT: + g_value_set_pointer(value, priv->collapsed); break; case PROP_BGCOLOR1: - g_value_set_string(value, priv->buddy_bgcolor1); + g_value_set_pointer(value, priv->buddy_bgcolor1); break; case PROP_BGCOLOR2: - g_value_set_string(value, priv->buddy_bgcolor2); + g_value_set_pointer(value, priv->buddy_bgcolor2); break; case PROP_ONLINE: g_value_set_pointer(value, priv->online); @@ -158,10 +157,10 @@ } static void -pidgin_buddy_list_theme_set_property(GObject *obj, guint param_id, const GValue *value, +pidgin_blist_theme_set_property(GObject *obj, guint param_id, const GValue *value, GParamSpec *psec) { - PidginBuddyListThemePrivate *priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(obj); + PidginBlistThemePrivate *priv = PIDGIN_BLIST_THEME_GET_PRIVATE(obj); switch(param_id) { case PROP_ICON_THEME: @@ -169,8 +168,7 @@ priv->icon_theme = g_strdup(g_value_get_string(value)); break; case PROP_BACKGROUND_COLOR: - g_free(priv->bgcolor); - priv->bgcolor = g_strdup(g_value_get_string(value)); + priv->bgcolor = g_value_get_pointer(value); break; case PROP_OPACITY: priv->opacity = g_value_get_double(value); @@ -180,28 +178,24 @@ priv->layout = g_value_get_pointer(value); break; case PROP_EXPANDED_COLOR: - g_free(priv->expanded_color); - priv->expanded_color = g_strdup(g_value_get_string(value)); + priv->expanded_color = g_value_get_pointer(value); break; case PROP_EXPANDED_TEXT: free_font_and_color(priv->expanded); priv->expanded = g_value_get_pointer(value); break; - case PROP_MINIMIZED_COLOR: - g_free(priv->minimized_color); - priv->minimized_color = g_strdup(g_value_get_string(value)); + case PROP_COLLAPSED_COLOR: + priv->collapsed_color = g_value_get_pointer(value); break; - case PROP_MINIMIZED_TEXT: - free_font_and_color(priv->minimized); - priv->minimized = g_value_get_pointer(value); + case PROP_COLLAPSED_TEXT: + free_font_and_color(priv->collapsed); + priv->collapsed = g_value_get_pointer(value); break; case PROP_BGCOLOR1: - g_free(priv->buddy_bgcolor1); - priv->buddy_bgcolor1 = g_strdup(g_value_get_string(value)); + priv->buddy_bgcolor1 = g_value_get_pointer(value); break; case PROP_BGCOLOR2: - g_free(priv->buddy_bgcolor2); - priv->buddy_bgcolor2 = g_strdup(g_value_get_string(value)); + priv->buddy_bgcolor2 = g_value_get_pointer(value); break; case PROP_ONLINE: free_font_and_color(priv->online); @@ -229,27 +223,21 @@ } } static void -pidgin_buddy_list_theme_finalize (GObject *obj) +pidgin_blist_theme_finalize (GObject *obj) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(obj); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(obj); /* Buddy List */ g_free(priv->icon_theme); - g_free(priv->bgcolor); g_free(priv->layout); /* Group */ - g_free(priv->expanded_color); free_font_and_color(priv->expanded); - g_free(priv->minimized_color); - free_font_and_color(priv->minimized); + free_font_and_color(priv->collapsed); /* Buddy */ - g_free(priv->buddy_bgcolor1); - g_free(priv->buddy_bgcolor2); - free_font_and_color(priv->online); free_font_and_color(priv->away); free_font_and_color(priv->offline); @@ -262,16 +250,16 @@ } static void -pidgin_buddy_list_theme_class_init (PidginBuddyListThemeClass *klass) +pidgin_blist_theme_class_init (PidginBlistThemeClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); GParamSpec *pspec; parent_class = g_type_class_peek_parent (klass); - obj_class->get_property = pidgin_buddy_list_theme_get_property; - obj_class->set_property = pidgin_buddy_list_theme_set_property; - obj_class->finalize = pidgin_buddy_list_theme_finalize; + obj_class->get_property = pidgin_blist_theme_get_property; + obj_class->set_property = pidgin_blist_theme_set_property; + obj_class->finalize = pidgin_blist_theme_finalize; /* Icon Theme */ pspec = g_param_spec_string("icon-theme", "Icon Theme", @@ -281,9 +269,8 @@ g_object_class_install_property(obj_class, PROP_ICON_THEME, pspec); /* Buddy List */ - pspec = g_param_spec_string("background-color", "Background Color", + pspec = g_param_spec_pointer("background-color", "Background Color", "The background color for the buddy list", - NULL, G_PARAM_READWRITE); g_object_class_install_property(obj_class, PROP_BACKGROUND_COLOR, pspec); @@ -301,9 +288,8 @@ g_object_class_install_property(obj_class, PROP_LAYOUT, pspec); /* Group */ - pspec = g_param_spec_string("expanded-color", "Expanded Background Color", + pspec = g_param_spec_pointer("expanded-color", "Expanded Background Color", "The background color of an expanded group", - NULL, G_PARAM_READWRITE); g_object_class_install_property(obj_class, PROP_EXPANDED_COLOR, pspec); @@ -312,27 +298,24 @@ G_PARAM_READWRITE); g_object_class_install_property(obj_class, PROP_EXPANDED_TEXT, pspec); - pspec = g_param_spec_string("minimized-color", "Minimized Background Color", - "The background color of a minimized group", - NULL, + pspec = g_param_spec_pointer("collapsed-color", "Collapsed Background Color", + "The background color of a collapsed group", G_PARAM_READWRITE); g_object_class_install_property(obj_class, PROP_EXPANDED_COLOR, pspec); - pspec = g_param_spec_pointer("minimized-text", "Minimized Text", - "The text information for when a group is minimized", + pspec = g_param_spec_pointer("collapsed-text", "Collapsed Text", + "The text information for when a group is collapsed", G_PARAM_READWRITE); g_object_class_install_property(obj_class, PROP_EXPANDED_TEXT, pspec); /* Buddy */ - pspec = g_param_spec_string("buddy-bgcolor1", "Buddy Background Color 1", + pspec = g_param_spec_pointer("buddy-bgcolor1", "Buddy Background Color 1", "The background color of a buddy", - NULL, G_PARAM_READWRITE); g_object_class_install_property(obj_class, PROP_BGCOLOR1, pspec); - pspec = g_param_spec_string("buddy-bgcolor2", "Buddy Background Color 2", + pspec = g_param_spec_pointer("buddy-bgcolor2", "Buddy Background Color 2", "The background color of a buddy", - NULL, G_PARAM_READWRITE); g_object_class_install_property(obj_class, PROP_BGCOLOR2, pspec); @@ -363,24 +346,24 @@ } GType -pidgin_buddy_list_theme_get_type (void) +pidgin_blist_theme_get_type (void) { static GType type = 0; if (type == 0) { static const GTypeInfo info = { - sizeof (PidginBuddyListThemeClass), + sizeof (PidginBlistThemeClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc)pidgin_buddy_list_theme_class_init, /* class_init */ + (GClassInitFunc)pidgin_blist_theme_class_init, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ - sizeof (PidginBuddyListTheme), + sizeof (PidginBlistTheme), 0, /* n_preallocs */ - pidgin_buddy_list_theme_init, /* instance_init */ + pidgin_blist_theme_init, /* instance_init */ NULL, /* value table */ }; type = g_type_register_static (PURPLE_TYPE_THEME, - "PidginBuddyListTheme", + "PidginBlistTheme", &info, 0); } return type; @@ -392,169 +375,169 @@ *****************************************************************************/ const gchar * -pidgin_buddy_list_theme_get_icon_theme(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_icon_theme(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->icon_theme; } gdouble -pidgin_buddy_list_theme_get_opacity(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_opacity(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), 1.0); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), 1.0); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->opacity; } const blist_layout * -pidgin_buddy_list_theme_get_layout(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_layout(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->layout; } -const gchar * -pidgin_buddy_list_theme_get_expanded_background_color(PidginBuddyListTheme *theme) +const GdkColor * +pidgin_blist_theme_get_expanded_background_color(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->expanded_color; } const font_color_pair * -pidgin_buddy_list_theme_get_expanded_text_info(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_expanded_text_info(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->expanded; } -const gchar * -pidgin_buddy_list_theme_get_minimized_background_color(PidginBuddyListTheme *theme) +const GdkColor * +pidgin_blist_theme_get_collapsed_background_color(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); - return priv->minimized_color; + return priv->collapsed_color; } const font_color_pair * -pidgin_buddy_list_theme_get_minimized_text_info(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_collapsed_text_info(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); - return priv->minimized; + return priv->collapsed; } -const gchar * -pidgin_buddy_list_theme_get_buddy_color_1(PidginBuddyListTheme *theme) +const GdkColor * +pidgin_blist_theme_get_buddy_color_1(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->buddy_bgcolor1; } -const gchar * -pidgin_buddy_list_theme_get_buddy_color_2(PidginBuddyListTheme *theme) +const GdkColor * +pidgin_blist_theme_get_buddy_color_2(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->buddy_bgcolor2; } const font_color_pair * -pidgin_buddy_list_theme_get_online_text_info(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_online_text_info(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->online; } const font_color_pair * -pidgin_buddy_list_theme_get_away_text_info(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_away_text_info(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->away; } const font_color_pair * -pidgin_buddy_list_theme_get_offline_text_info(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_offline_text_info(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->offline; } const font_color_pair * -pidgin_buddy_list_theme_get_unread_message_text_info(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_unread_message_text_info(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->message; } const font_color_pair * -pidgin_buddy_list_theme_get_status_text_info(PidginBuddyListTheme *theme) +pidgin_blist_theme_get_status_text_info(PidginBlistTheme *theme) { - PidginBuddyListThemePrivate *priv; + PidginBlistThemePrivate *priv; - g_return_val_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme), NULL); + g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL); - priv = PIDGIN_BUDDY_LIST_THEME_GET_PRIVATE(G_OBJECT(theme)); + priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme)); return priv->status; }
--- a/pidgin/gtkblist-theme.h Fri Jul 11 19:13:24 2008 +0000 +++ b/pidgin/gtkblist-theme.h Tue Jul 15 06:29:46 2008 +0000 @@ -23,38 +23,39 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#ifndef _PIDGIN_BUDDY_LIST_THEME_H_ -#define _PIDGIN_BUDDY_LIST_THEME_H_ +#ifndef _PIDGIN_BLIST_THEME_H_ +#define _PIDGIN_BLIST_THEME_H_ #include <glib.h> #include <glib-object.h> +#include <gtk/gtk.h> + #include "theme.h" -#include "sound.h" /** * extends PurpleTheme (theme.h) * A pidgin buddy list theme. * This is an object for Purple to represent a sound theme. * - * PidginBuddyListTheme is a PurpleTheme Object. + * PidginBlistTheme is a PurpleTheme Object. */ -typedef struct _PidginBuddyListTheme PidginBuddyListTheme; -typedef struct _PidginBuddyListThemeClass PidginBuddyListThemeClass; +typedef struct _PidginBlistTheme PidginBlistTheme; +typedef struct _PidginBlistThemeClass PidginBlistThemeClass; -#define PIDGIN_TYPE_BUDDY_LIST_THEME (pidgin_buddy_list_theme_get_type ()) -#define PIDGIN_BUDDY_LIST_THEME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIDGIN_TYPE_BUDDY_LIST_THEME, PidginBuddyListTheme)) -#define PIDGIN_BUDDY_LIST_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIDGIN_TYPE_BUDDY_LIST_THEME, PidginBuddyListThemeClass)) -#define PIDGIN_IS_BUDDY_LIST_THEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIDGIN_TYPE_BUDDY_LIST_THEME)) -#define PIDGIN_IS_BUDDY_LIST_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIDGIN_TYPE_BUDDY_LIST_THEME)) -#define PIDGIN_BUDDY_LIST_THEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIDGIN_TYPE_BUDDY_LIST_THEME, PidginBuddyListThemeClass)) +#define PIDGIN_TYPE_BLIST_THEME (pidgin_blist_theme_get_type ()) +#define PIDGIN_BLIST_THEME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIDGIN_TYPE_BLIST_THEME, PidginBlistTheme)) +#define PIDGIN_BLIST_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIDGIN_TYPE_BLIST_THEME, PidginBlistThemeClass)) +#define PIDGIN_IS_BLIST_THEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIDGIN_TYPE_BLIST_THEME)) +#define PIDGIN_IS_BLIST_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIDGIN_TYPE_BLIST_THEME)) +#define PIDGIN_BLIST_THEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIDGIN_TYPE_BLIST_THEME, PidginBlistThemeClass)) -struct _PidginBuddyListTheme +struct _PidginBlistTheme { PurpleTheme parent; gpointer priv; }; -struct _PidginBuddyListThemeClass +struct _PidginBlistThemeClass { PurpleThemeClass parent_class; }; @@ -62,7 +63,7 @@ typedef struct { gchar *font; - gchar *color; + GdkColor *color; } font_color_pair; @@ -87,14 +88,14 @@ * GObject foo. * @internal. */ -GType pidgin_buddy_list_theme_get_type(void); +GType pidgin_blist_theme_get_type(void); /** * Returns the icon theme to be used with the buddy list theme * * @returns the icon theme */ -const gchar *pidgin_buddy_list_theme_get_icon_theme(PidginBuddyListTheme *theme); +const gchar *pidgin_blist_theme_get_icon_theme(PidginBlistTheme *theme); /** * Returns the opacity of the buddy list window @@ -102,91 +103,91 @@ * * @returns the opacity */ -gdouble pidgin_buddy_list_theme_get_opacity(PidginBuddyListTheme *theme); +gdouble pidgin_blist_theme_get_opacity(PidginBlistTheme *theme); /** * Returns the layout to be used with the buddy list * * @returns the buddy list layout */ -const blist_layout *pidgin_buddy_list_theme_get_layout(PidginBuddyListTheme *theme); +const blist_layout *pidgin_blist_theme_get_layout(PidginBlistTheme *theme); /** * Returns the background color to be used with expanded groups * * @returns a color */ -const gchar *pidgin_buddy_list_theme_get_expanded_background_color(PidginBuddyListTheme *theme); +const GdkColor *pidgin_blist_theme_get_expanded_background_color(PidginBlistTheme *theme); /** * Returns the text font and color to be used with expanded groups * * @returns a font and color pair */ -const font_color_pair *pidgin_buddy_list_theme_get_expanded_text_info(PidginBuddyListTheme *theme); +const font_color_pair *pidgin_blist_theme_get_expanded_text_info(PidginBlistTheme *theme); /** - * Returns the background color to be used with minimized groups + * Returns the background color to be used with collapsed groups * * @returns a color */ -const gchar *pidgin_buddy_list_theme_get_minimized_background_color(PidginBuddyListTheme *theme); +const GdkColor *pidgin_blist_theme_get_collapsed_background_color(PidginBlistTheme *theme); /** - * Returns the text font and color to be used with minimized groups + * Returns the text font and color to be used with collapsed groups * * @returns a font and color pair */ -const font_color_pair *pidgin_buddy_list_theme_get_minimized_text_info(PidginBuddyListTheme *theme); +const font_color_pair *pidgin_blist_theme_get_collapsed_text_info(PidginBlistTheme *theme); /** * Returns the 1st color to be used for buddys * * @returns a color */ -const gchar *pidgin_buddy_list_theme_get_buddy_color_1(PidginBuddyListTheme *theme); +const GdkColor *pidgin_blist_theme_get_buddy_color_1(PidginBlistTheme *theme); /** * Returns the 2nd color to be used for buddies * * @returns a color */ -const gchar *pidgin_buddy_list_theme_get_buddy_color_2(PidginBuddyListTheme *theme); +const GdkColor *pidgin_blist_theme_get_buddy_color_2(PidginBlistTheme *theme); /** * Returns the text font and color to be used for online buddies * * @returns a font and color pair */ -const font_color_pair *pidgin_buddy_list_theme_get_online_text_info(PidginBuddyListTheme *theme); +const font_color_pair *pidgin_blist_theme_get_online_text_info(PidginBlistTheme *theme); /** * Returns the text font and color to be used for away and idle buddies * * @returns a font and color pair */ -const font_color_pair *pidgin_buddy_list_theme_get_away_text_info(PidginBuddyListTheme *theme); +const font_color_pair *pidgin_blist_theme_get_away_text_info(PidginBlistTheme *theme); /** * Returns the text font and color to be used for offline buddies * * @returns a font and color pair */ -const font_color_pair *pidgin_buddy_list_theme_get_offline_text_info(PidginBuddyListTheme *theme); +const font_color_pair *pidgin_blist_theme_get_offline_text_info(PidginBlistTheme *theme); /** * Returns the text font and color to be used for buddies with unread messages * * @returns a font and color pair */ -const font_color_pair *pidgin_buddy_list_theme_get_unread_message_text_info(PidginBuddyListTheme *theme); +const font_color_pair *pidgin_blist_theme_get_unread_message_text_info(PidginBlistTheme *theme); /** * Returns the text font and color to be used for a buddy's status message * * @returns a font and color pair */ -const font_color_pair *pidgin_buddy_list_theme_get_status_text_info(PidginBuddyListTheme *theme); +const font_color_pair *pidgin_blist_theme_get_status_text_info(PidginBlistTheme *theme); G_END_DECLS -#endif /* _PIDGIN_BUDDY_LIST_THEME_H_ */ +#endif /* _PIDGIN_BLIST_THEME_H_ */
--- a/pidgin/gtkblist.c Fri Jul 11 19:13:24 2008 +0000 +++ b/pidgin/gtkblist.c Tue Jul 15 06:29:46 2008 +0000 @@ -60,6 +60,8 @@ #include "gtkstatusbox.h" #include "gtkscrollbook.h" #include "gtksmiley.h" +#include "gtkblist-loader.h" +#include "gtkblist-theme.h" #include "gtkutils.h" #include "pidgin/minidialog.h" #include "pidgin/pidgintooltip.h" @@ -124,7 +126,7 @@ */ PidginMiniDialog *signed_on_elsewhere; - PidginBuddyListTheme *current_theme; + PidginBlistTheme *current_theme; } PidginBuddyListPrivate; #define PIDGIN_BUDDY_LIST_GET_PRIVATE(list) \ @@ -5259,7 +5261,7 @@ gtkblist = PIDGIN_BLIST(list); priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); - priv->current_theme = PIDGIN_BUDDY_LIST_THEME(purple_theme_manager_find_theme(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/blist/theme"), "blist")); + priv->current_theme = PIDGIN_BLIST_THEME(purple_theme_manager_find_theme(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/blist/theme"), "blist")); gtkblist->empty_avatar = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 32, 32); gdk_pixbuf_fill(gtkblist->empty_avatar, 0x00000000); @@ -5978,17 +5980,20 @@ GtkTreeIter iter; GtkTreePath *path; gboolean expanded; - GdkColor bgcolor; + GdkColor *bgcolor; GdkPixbuf *avatar = NULL; + PidginBlistTheme *theme; if(!insert_node(list, gnode, &iter)) return; - bgcolor = gtkblist->treeview->style->bg[GTK_STATE_ACTIVE]; - -/* gdk_color_parse("red", &bgcolor); - gdk_colormap_alloc_color(gdk_colormap_get_system(), &bgcolor, TRUE, FALSE); -g_print("\n\n%s\n\n", gdk_color_to_string(&bgcolor));*/ + theme = pidgin_blist_get_theme(); + + if(theme == NULL) + bgcolor = &(gtkblist->treeview->style->bg[GTK_STATE_ACTIVE]); + else if(purple_blist_node_get_bool(gnode, "collapsed")) + bgcolor = (pidgin_blist_theme_get_collapsed_text_info(theme))->color; + else bgcolor = (pidgin_blist_theme_get_expanded_text_info(theme))->color; path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(gtkblist->treeview), path); @@ -7179,19 +7184,21 @@ } void -pidgin_blist_set_theme(PidginBuddyListTheme *theme) +pidgin_blist_set_theme(PidginBlistTheme *theme) { PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); - g_return_if_fail(PIDGIN_IS_BUDDY_LIST_THEME(theme)); + g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme)); purple_prefs_set_string(PIDGIN_PREFS_ROOT "/blist/theme", purple_theme_get_name(PURPLE_THEME(theme))); priv->current_theme = theme; -} - - -PidginBuddyListTheme * + + pidgin_blist_refresh(purple_get_blist()); +} + + +PidginBlistTheme * pidgin_blist_get_theme() { PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
--- a/pidgin/gtkblist.h Fri Jul 11 19:13:24 2008 +0000 +++ b/pidgin/gtkblist.h Tue Jul 15 06:29:46 2008 +0000 @@ -256,14 +256,14 @@ * * @param theme the new theme to use */ -void pidgin_blist_set_theme(PidginBuddyListTheme *theme); +void pidgin_blist_set_theme(PidginBlistTheme *theme); /** * Gets Pidgin's current buddy list theme * * @returns the current theme */ -PidginBuddyListTheme *pidgin_blist_get_theme(void); +PidginBlistTheme *pidgin_blist_get_theme(void); /************************************************************************** * @name GTK+ Buddy List sorting functions
--- a/pidgin/gtkprefs.c Fri Jul 11 19:13:24 2008 +0000 +++ b/pidgin/gtkprefs.c Tue Jul 15 06:29:46 2008 +0000 @@ -74,6 +74,9 @@ static gboolean prefs_themes_unsorted = TRUE; static GtkListStore *prefs_sound_themes; static GtkTreeIter prefs_sound_iter; +static GtkListStore *prefs_blist_themes; +static GtkTreeIter prefs_blist_iter; + /* * PROTOTYPES @@ -568,10 +571,11 @@ GdkPixbuf *pixbuf = NULL; GtkTreeIter iter; gchar *image_full; + const gchar *pref; if (PURPLE_IS_SOUND_THEME(theme)){ - /* TODO: string leaks? */ - const gchar *pref = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/theme"); + + pref = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/theme"); image_full = purple_theme_get_image_full(theme); if (image_full != NULL){ @@ -586,31 +590,56 @@ if (pixbuf != NULL) gdk_pixbuf_unref(pixbuf); - if (pref && strlen(pref) && !strcmp(purple_theme_get_name(theme), pref)) + if (g_str_equal(purple_theme_get_name(theme), pref)) prefs_sound_iter = iter; + } else if (PIDGIN_IS_BLIST_THEME(theme)){ + + pref = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/blist/theme"); + + image_full = purple_theme_get_image_full(theme); + if (image_full != NULL){ + pixbuf = gdk_pixbuf_new_from_file(image_full, NULL); + g_free(image_full); + } + else pixbuf = NULL; + + gtk_list_store_append (prefs_blist_themes, &iter); + gtk_list_store_set (prefs_blist_themes, &iter, 0, pixbuf, 1, purple_theme_get_name(theme), 2, theme, -1); + + if (pixbuf != NULL) + gdk_pixbuf_unref(pixbuf); + + if (g_str_equal(purple_theme_get_name(theme), pref)) + prefs_blist_iter = iter; + } } /* init all the theme variables so that the themes can be sorted later and used by pref pages */ static void -prefs_themes_init(void) +prefs_themes_init() { GdkPixbuf *pixbuf = NULL; gchar *filename; - /* sound themes */ - prefs_sound_themes = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); - filename = g_build_filename(DATADIR, "icons", "hicolor", "16x16", "apps", "pidgin.png", NULL); pixbuf= gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); - gtk_list_store_append (prefs_sound_themes, &prefs_sound_iter); - - gtk_list_store_set (prefs_sound_themes, &prefs_sound_iter, 0, pixbuf, 1, _("(Default)"), 2, NULL, -1); - - gdk_pixbuf_unref (pixbuf); + /* sound themes */ + prefs_sound_themes = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); + + gtk_list_store_append(prefs_sound_themes, &prefs_sound_iter); + gtk_list_store_set(prefs_sound_themes, &prefs_sound_iter, 0, pixbuf, 1, _("(Default)"), 2, NULL, -1); + + /* blist themes */ + prefs_blist_themes = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, PIDGIN_TYPE_BLIST_THEME); + + gtk_list_store_append(prefs_blist_themes, &prefs_blist_iter); + gtk_list_store_set(prefs_blist_themes, &prefs_blist_iter, 0, pixbuf, 1, _("(Default)"), 2, NULL, -1); + + gdk_pixbuf_unref(pixbuf); } /* sets the current sound theme */ @@ -628,7 +657,7 @@ gtk_tree_model_get(GTK_TREE_MODEL(prefs_sound_themes), &prefs_sound_iter, 1, &theme_name, -1); - if (strcmp(theme_name, "(Default)") == 0){ + if (g_str_equal(theme_name, "(Default)")){ g_free(theme_name); theme_name = g_strdup(""); } @@ -1023,6 +1052,21 @@ gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0); } +/* sets the current buddy list theme */ +static void +prefs_set_blist_theme(GtkComboBox *combo_box, gpointer user_data) +{ + PidginBlistTheme *theme; + + g_return_if_fail(gtk_combo_box_get_active_iter(combo_box, &prefs_blist_iter)); + gtk_tree_model_get(GTK_TREE_MODEL(prefs_sound_themes), &prefs_blist_iter, 1, &theme, -1); + + pidgin_blist_set_theme(theme); + + g_object_unref(theme); +} + + static GtkWidget * interface_page(void) { @@ -1030,6 +1074,8 @@ GtkWidget *vbox; GtkWidget *vbox2; GtkWidget *label; + GtkWidget *combo_box; + GtkCellRenderer *cell_rend; GtkSizeGroup *sg; GList *names = NULL; @@ -1038,6 +1084,23 @@ sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + /* Buddy List Themes */ + vbox = pidgin_make_frame(ret, _("Buddy List Theme")); + combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL (prefs_blist_themes)); + gtk_box_pack_start (GTK_BOX (vbox), combo_box, FALSE, FALSE, 0); + + cell_rend = gtk_cell_renderer_pixbuf_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell_rend, FALSE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell_rend, "pixbuf", 0, NULL); + + cell_rend = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell_rend, FALSE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell_rend, "text", 1, NULL); + + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo_box), &prefs_blist_iter); + g_signal_connect(G_OBJECT(combo_box), "changed", (GCallback)prefs_set_blist_theme, NULL); + + /* System Tray */ vbox = pidgin_make_frame(ret, _("System Tray Icon")); label = pidgin_prefs_dropdown(vbox, _("_Show system tray icon:"), PURPLE_PREF_STRING, PIDGIN_PREFS_ROOT "/docklet/show",