Mercurial > pidgin.yaz
diff finch/libgnt/gntcolors.c @ 15818:0e3a8505ebbe
renamed gaim-text to finch
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sun, 18 Mar 2007 19:38:15 +0000 |
parents | |
children | 8410511f4dbb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/libgnt/gntcolors.c Sun Mar 18 19:38:15 2007 +0000 @@ -0,0 +1,256 @@ +#include "config.h" + +#include <ncurses.h> + +#include "gntcolors.h" +#include "gntstyle.h" + +#include <glib.h> + +#include <stdlib.h> +#include <string.h> + +static struct +{ + short r, g, b; +} colors[GNT_TOTAL_COLORS]; + +static void +backup_colors() +{ + short i; + for (i = 0; i < GNT_TOTAL_COLORS; i++) + { + color_content(i, &colors[i].r, + &colors[i].g, &colors[i].b); + } +} + +static gboolean +can_use_custom_color() +{ + return (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color()); +} + +static void +restore_colors() +{ + short i; + for (i = 0; i < GNT_TOTAL_COLORS; i++) + { + init_color(i, colors[i].r, + colors[i].g, colors[i].b); + } +} + +void gnt_init_colors() +{ + static gboolean init = FALSE; + int defaults; + + if (init) + return; + init = TRUE; + + start_color(); + defaults = use_default_colors(); + + if (can_use_custom_color()) + { + backup_colors(); + + /* Do some init_color()s */ + init_color(GNT_COLOR_BLACK, 0, 0, 0); + init_color(GNT_COLOR_RED, 1000, 0, 0); + init_color(GNT_COLOR_GREEN, 0, 1000, 0); + init_color(GNT_COLOR_BLUE, 250, 250, 700); + init_color(GNT_COLOR_WHITE, 1000, 1000, 1000); + init_color(GNT_COLOR_GRAY, 699, 699, 699); + init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256); + + /* Now some init_pair()s */ + init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE); + init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_WHITE, GNT_COLOR_BLUE); + init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); + + init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_BLUE); + init_pair(GNT_COLOR_TITLE_D, GNT_COLOR_WHITE, GNT_COLOR_GRAY); + + init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_WHITE, GNT_COLOR_BLUE); + init_pair(GNT_COLOR_HIGHLIGHT_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_DISABLED, GNT_COLOR_GRAY, GNT_COLOR_WHITE); + init_pair(GNT_COLOR_URGENT, GNT_COLOR_WHITE, GNT_COLOR_RED); + } + else + { + int bg; + + if (defaults == OK) { + init_pair(GNT_COLOR_NORMAL, -1, -1); + bg = -1; + } else { + init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); + bg = COLOR_WHITE; + } + init_pair(GNT_COLOR_DISABLED, COLOR_YELLOW, bg); + init_pair(GNT_COLOR_URGENT, COLOR_GREEN, bg); + + init_pair(GNT_COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE); + init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); + init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLUE); + init_pair(GNT_COLOR_TITLE_D, COLOR_WHITE, COLOR_BLACK); + init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_WHITE, COLOR_BLUE); + init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK); + } +} + +void +gnt_uninit_colors() +{ + if (can_use_custom_color()) + restore_colors(); +} + +static int +get_color(char *key) +{ + int color; + gboolean custom = can_use_custom_color(); + + key = g_strstrip(key); + + if (strcmp(key, "black") == 0) + color = custom ? GNT_COLOR_BLACK : COLOR_BLACK; + else if (strcmp(key, "red") == 0) + color = custom ? GNT_COLOR_RED : COLOR_RED; + else if (strcmp(key, "green") == 0) + color = custom ? GNT_COLOR_GREEN : COLOR_GREEN; + else if (strcmp(key, "blue") == 0) + color = custom ? GNT_COLOR_BLUE : COLOR_BLUE; + else if (strcmp(key, "white") == 0) + color = custom ? GNT_COLOR_WHITE : COLOR_WHITE; + else if (strcmp(key, "gray") == 0) + color = custom ? GNT_COLOR_GRAY : COLOR_YELLOW; /* eh? */ + else if (strcmp(key, "darkgray") == 0) + color = custom ? GNT_COLOR_DARK_GRAY : COLOR_BLACK; + else if (strcmp(key, "magenta") == 0) + color = COLOR_MAGENTA; + else if (strcmp(key, "cyan") == 0) + color = COLOR_CYAN; + else + color = -1; + return color; +} + +#if GLIB_CHECK_VERSION(2,6,0) +void gnt_colors_parse(GKeyFile *kfile) +{ + GError *error = NULL; + gsize nkeys; + char **keys = g_key_file_get_keys(kfile, "colors", &nkeys, &error); + + if (error) + { + g_printerr("GntColors: %s\n", error->message); + g_error_free(error); + error = NULL; + } + else if (nkeys) + { + gnt_init_colors(); + while (nkeys--) + { + gsize len; + gchar *key = keys[nkeys]; + char **list = g_key_file_get_string_list(kfile, "colors", key, &len, NULL); + if (len == 3) + { + int r = atoi(list[0]); + int g = atoi(list[1]); + int b = atoi(list[2]); + int color = -1; + + key = g_ascii_strdown(key, -1); + color = get_color(key); + g_free(key); + if (color == -1) + continue; + + init_color(color, r, g, b); + } + g_strfreev(list); + } + + g_strfreev(keys); + } + + gnt_color_pairs_parse(kfile); +} + +void gnt_color_pairs_parse(GKeyFile *kfile) +{ + GError *error = NULL; + gsize nkeys; + char **keys = g_key_file_get_keys(kfile, "colorpairs", &nkeys, &error); + + if (error) + { + g_printerr("GntColors: %s\n", error->message); + g_error_free(error); + return; + } + else if (nkeys) + gnt_init_colors(); + + while (nkeys--) + { + gsize len; + gchar *key = keys[nkeys]; + char **list = g_key_file_get_string_list(kfile, "colorpairs", key, &len, NULL); + if (len == 2) + { + GntColorType type = 0; + gchar *fgc = g_ascii_strdown(list[0], -1); + gchar *bgc = g_ascii_strdown(list[1], -1); + int fg = get_color(fgc); + int bg = get_color(bgc); + g_free(fgc); + g_free(bgc); + if (fg == -1 || bg == -1) + continue; + + key = g_ascii_strdown(key, -1); + + if (strcmp(key, "normal") == 0) + type = GNT_COLOR_NORMAL; + else if (strcmp(key, "highlight") == 0) + type = GNT_COLOR_HIGHLIGHT; + else if (strcmp(key, "highlightd") == 0) + type = GNT_COLOR_HIGHLIGHT_D; + else if (strcmp(key, "shadow") == 0) + type = GNT_COLOR_SHADOW; + else if (strcmp(key, "title") == 0) + type = GNT_COLOR_TITLE; + else if (strcmp(key, "titled") == 0) + type = GNT_COLOR_TITLE_D; + else if (strcmp(key, "text") == 0) + type = GNT_COLOR_TEXT_NORMAL; + else if (strcmp(key, "disabled") == 0) + type = GNT_COLOR_DISABLED; + else if (strcmp(key, "urgent") == 0) + type = GNT_COLOR_URGENT; + else { + g_free(key); + continue; + } + g_free(key); + + init_pair(type, fg, bg); + } + g_strfreev(list); + } + + g_strfreev(keys); +} + +#endif /* GKeyFile */