Mercurial > pidgin.yaz
diff finch/gntblist.c @ 21691:3ed9b027479d
Add support for colour in gnttreerows, and colourise the blist. Fixes #1490
author | Richard Nelson <wabz@pidgin.im> |
---|---|
date | Fri, 30 Nov 2007 03:17:07 +0000 |
parents | 665e04562de0 |
children | 2de3a2de5f13 |
line wrap: on
line diff
--- a/finch/gntblist.c Thu Nov 29 23:21:14 2007 +0000 +++ b/finch/gntblist.c Fri Nov 30 03:17:07 2007 +0000 @@ -27,6 +27,7 @@ #include <account.h> #include <blist.h> +#include <curses.h> #include <notify.h> #include <request.h> #include <savedstatuses.h> @@ -37,6 +38,7 @@ #include "debug.h" #include "gntbox.h" +#include "gntcolors.h" #include "gntcombobox.h" #include "gntentry.h" #include "gntft.h" @@ -46,6 +48,7 @@ #include "gntmenuitem.h" #include "gntmenuitemcheck.h" #include "gntpounce.h" +#include "gntstyle.h" #include "gnttree.h" #include "gntutils.h" #include "gntwindow.h" @@ -124,6 +127,11 @@ static int blist_node_compare_status(PurpleBlistNode *n1, PurpleBlistNode *n2); static int blist_node_compare_log(PurpleBlistNode *n1, PurpleBlistNode *n2); +static int color_available; +static int color_away; +static int color_offline; +static int color_idle; + static gboolean is_contact_online(PurpleContact *contact) { @@ -615,12 +623,20 @@ node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), contact, NULL); + if (purple_presence_is_idle(purple_buddy_get_presence(buddy))) { - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM); - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, GNT_TEXT_FLAG_DIM); - } else { - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0); - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, 0); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_idle); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_idle); + } else if (purple_presence_is_available(purple_buddy_get_presence(buddy)) && color_available) { + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_available); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_available); + } else if (purple_presence_is_online(purple_buddy_get_presence(buddy)) && + !purple_presence_is_available(purple_buddy_get_presence(buddy)) && color_away) { + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_away); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_away); + } else if (!purple_presence_is_online(purple_buddy_get_presence(buddy)) && color_offline) { + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_offline); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_offline); } } @@ -1557,18 +1573,33 @@ draw_tooltip(ggblist); if (purple_presence_is_idle(purple_buddy_get_presence(buddy))) { - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag | GNT_TEXT_FLAG_DIM); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_idle); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_idle); + if (buddy == purple_contact_get_priority_buddy(contact)) + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_idle); + } else if (purple_presence_is_available(purple_buddy_get_presence(buddy)) && color_available) { + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_available); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_available); if (buddy == purple_contact_get_priority_buddy(contact)) - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag | GNT_TEXT_FLAG_DIM); - else + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_available); + } else if (purple_presence_is_online(purple_buddy_get_presence(buddy)) && + !purple_presence_is_available(purple_buddy_get_presence(buddy)) && color_away) { + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_away); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_away); + if (buddy == purple_contact_get_priority_buddy(contact)) + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_away); + } else if (!purple_presence_is_online(purple_buddy_get_presence(buddy)) && color_offline) { + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color_offline); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_offline); + if (buddy == purple_contact_get_priority_buddy(contact)) + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color_offline); + } + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag); + if (buddy == purple_contact_get_priority_buddy(contact)) + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag); + + if (buddy != purple_contact_get_priority_buddy(contact)) update_buddy_display(purple_contact_get_priority_buddy(contact), ggblist); - } else { - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag); - if (buddy == purple_contact_get_priority_buddy(contact)) - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag); - else - update_buddy_display(purple_contact_get_priority_buddy(contact), ggblist); - } } static void @@ -1736,8 +1767,43 @@ draw_tooltip(ggblist); } +static int +get_color(char *key) +{ +#if GLIB_CHECK_VERSION(2,6,0) + int fg = 0, bg = 0; + gsize n; + char **vals; + vals = gnt_style_get_string_list(NULL, key, &n); + if (vals && n == 2) { + fg = gnt_colors_get_color(vals[0]); + bg = gnt_colors_get_color(vals[1]); + return gnt_color_add_pair(fg, bg); + } + return 0; +#else + return 0; +#endif +} + void finch_blist_init() { + short fg, bg; + if (has_colors()) { + pair_content(GNT_COLOR_NORMAL, &fg, &bg); + color_available = get_color("color-available"); + if (!color_available) + color_available = gnt_color_add_pair(COLOR_GREEN, bg); + color_away = get_color("color-away"); + if (!color_away) + color_away = gnt_color_add_pair(COLOR_BLUE, bg); + color_idle = get_color("color-idle"); + if (!color_idle) + color_idle = gnt_color_add_pair(COLOR_CYAN, bg); + color_offline = get_color("color-offline"); + if (!color_offline) + color_offline = gnt_color_add_pair(COLOR_RED, bg); + } purple_prefs_add_none(PREF_ROOT); purple_prefs_add_none(PREF_ROOT "/size"); purple_prefs_add_int(PREF_ROOT "/size/width", 20); @@ -2550,4 +2616,3 @@ { gnt_widget_set_size(ggblist->window, width, height); } -