Change the "length of bstream" data type to be a gsize, since it represents
[pidgin-git.git] / finch / libgnt / gntcolors.c
blobceaf895c958c140a0dc283360bba6754d00bfcd9
1 /**
2 * GNT - The GLib Ncurses Toolkit
4 * GNT is the legal property of its developers, whose names are too numerous
5 * to list here. Please refer to the COPYRIGHT file distributed with this
6 * source distribution.
8 * This library is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
23 #include "config.h"
25 #include <ncurses.h>
27 #include "gntinternal.h"
28 #undef GNT_LOG_DOMAIN
29 #define GNT_LOG_DOMAIN "Colors"
31 #include "gntcolors.h"
32 #include "gntstyle.h"
34 #include <glib.h>
36 #include <errno.h>
37 #include <stdlib.h>
38 #include <string.h>
40 static gboolean hascolors;
41 static int custom_type = GNT_COLORS;
42 static struct
44 short r, g, b;
45 } colors[GNT_TOTAL_COLORS];
47 static void
48 backup_colors(void)
50 short i;
51 for (i = 0; i < GNT_TOTAL_COLORS; i++)
53 color_content(i, &colors[i].r,
54 &colors[i].g, &colors[i].b);
58 static gboolean
59 can_use_custom_color(void)
61 return (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color());
64 static void
65 restore_colors(void)
67 short i;
68 for (i = 0; i < GNT_TOTAL_COLORS; i++)
70 init_color(i, colors[i].r,
71 colors[i].g, colors[i].b);
75 void gnt_init_colors()
77 static gboolean init = FALSE;
78 int defaults;
80 if (init)
81 return;
82 init = TRUE;
84 start_color();
85 if (!(hascolors = has_colors()))
86 return;
87 defaults = use_default_colors();
89 if (can_use_custom_color())
91 backup_colors();
93 /* Do some init_color()s */
94 init_color(GNT_COLOR_BLACK, 0, 0, 0);
95 init_color(GNT_COLOR_RED, 1000, 0, 0);
96 init_color(GNT_COLOR_GREEN, 0, 1000, 0);
97 init_color(GNT_COLOR_BLUE, 250, 250, 700);
98 init_color(GNT_COLOR_WHITE, 1000, 1000, 1000);
99 init_color(GNT_COLOR_GRAY, 699, 699, 699);
100 init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256);
102 /* Now some init_pair()s */
103 init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE);
104 init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_WHITE, GNT_COLOR_BLUE);
105 init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY);
107 init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_BLUE);
108 init_pair(GNT_COLOR_TITLE_D, GNT_COLOR_WHITE, GNT_COLOR_GRAY);
110 init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_WHITE, GNT_COLOR_BLUE);
111 init_pair(GNT_COLOR_HIGHLIGHT_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY);
112 init_pair(GNT_COLOR_DISABLED, GNT_COLOR_GRAY, GNT_COLOR_WHITE);
113 init_pair(GNT_COLOR_URGENT, GNT_COLOR_WHITE, GNT_COLOR_RED);
115 else
117 int bg;
119 if (defaults == OK) {
120 init_pair(GNT_COLOR_NORMAL, -1, -1);
121 bg = -1;
122 } else {
123 init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE);
124 bg = COLOR_WHITE;
126 init_pair(GNT_COLOR_DISABLED, COLOR_YELLOW, bg);
127 init_pair(GNT_COLOR_URGENT, COLOR_GREEN, bg);
129 init_pair(GNT_COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE);
130 init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK);
131 init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLUE);
132 init_pair(GNT_COLOR_TITLE_D, COLOR_WHITE, COLOR_BLACK);
133 init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_WHITE, COLOR_BLUE);
134 init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK);
138 void
139 gnt_uninit_colors()
141 if (can_use_custom_color())
142 restore_colors();
145 #if GLIB_CHECK_VERSION(2,6,0)
147 gnt_colors_get_color(char *key)
149 int color;
150 gboolean custom = can_use_custom_color();
152 key = g_strstrip(key);
154 if (strcmp(key, "black") == 0)
155 color = custom ? GNT_COLOR_BLACK : COLOR_BLACK;
156 else if (strcmp(key, "red") == 0)
157 color = custom ? GNT_COLOR_RED : COLOR_RED;
158 else if (strcmp(key, "green") == 0)
159 color = custom ? GNT_COLOR_GREEN : COLOR_GREEN;
160 else if (strcmp(key, "blue") == 0)
161 color = custom ? GNT_COLOR_BLUE : COLOR_BLUE;
162 else if (strcmp(key, "white") == 0)
163 color = custom ? GNT_COLOR_WHITE : COLOR_WHITE;
164 else if (strcmp(key, "gray") == 0)
165 color = custom ? GNT_COLOR_GRAY : COLOR_YELLOW; /* eh? */
166 else if (strcmp(key, "darkgray") == 0)
167 color = custom ? GNT_COLOR_DARK_GRAY : COLOR_BLACK;
168 else if (strcmp(key, "magenta") == 0)
169 color = COLOR_MAGENTA;
170 else if (strcmp(key, "cyan") == 0)
171 color = COLOR_CYAN;
172 else if (strcmp(key, "default") == 0)
173 color = -1;
174 else {
175 g_warning("Invalid color name: %s\n", key);
176 color = -EINVAL;
178 return color;
181 void gnt_colors_parse(GKeyFile *kfile)
183 GError *error = NULL;
184 gsize nkeys;
185 char **keys = g_key_file_get_keys(kfile, "colors", &nkeys, &error);
187 if (error)
189 gnt_warning("%s", error->message);
190 g_error_free(error);
191 error = NULL;
193 else if (nkeys)
195 gnt_init_colors();
196 while (nkeys--)
198 gsize len;
199 gchar *key = keys[nkeys];
200 char **list = g_key_file_get_string_list(kfile, "colors", key, &len, NULL);
201 if (len == 3)
203 int r = atoi(list[0]);
204 int g = atoi(list[1]);
205 int b = atoi(list[2]);
206 int color = -1;
208 key = g_ascii_strdown(key, -1);
209 color = gnt_colors_get_color(key);
210 g_free(key);
211 if (color == -EINVAL) {
212 g_strfreev(list);
213 continue;
216 init_color(color, r, g, b);
218 g_strfreev(list);
221 g_strfreev(keys);
224 gnt_color_pairs_parse(kfile);
227 void gnt_color_pairs_parse(GKeyFile *kfile)
229 GError *error = NULL;
230 gsize nkeys;
231 char **keys = g_key_file_get_keys(kfile, "colorpairs", &nkeys, &error);
233 if (error)
235 gnt_warning("%s", error->message);
236 g_error_free(error);
237 return;
239 else if (nkeys)
240 gnt_init_colors();
242 while (nkeys--)
244 gsize len;
245 gchar *key = keys[nkeys];
246 char **list = g_key_file_get_string_list(kfile, "colorpairs", key, &len, NULL);
247 if (len == 2)
249 GntColorType type = 0;
250 gchar *fgc = g_ascii_strdown(list[0], -1);
251 gchar *bgc = g_ascii_strdown(list[1], -1);
252 int fg = gnt_colors_get_color(fgc);
253 int bg = gnt_colors_get_color(bgc);
254 g_free(fgc);
255 g_free(bgc);
256 if (fg == -EINVAL || bg == -EINVAL) {
257 g_strfreev(list);
258 continue;
261 key = g_ascii_strdown(key, -1);
263 if (strcmp(key, "normal") == 0)
264 type = GNT_COLOR_NORMAL;
265 else if (strcmp(key, "highlight") == 0)
266 type = GNT_COLOR_HIGHLIGHT;
267 else if (strcmp(key, "highlightd") == 0)
268 type = GNT_COLOR_HIGHLIGHT_D;
269 else if (strcmp(key, "shadow") == 0)
270 type = GNT_COLOR_SHADOW;
271 else if (strcmp(key, "title") == 0)
272 type = GNT_COLOR_TITLE;
273 else if (strcmp(key, "titled") == 0)
274 type = GNT_COLOR_TITLE_D;
275 else if (strcmp(key, "text") == 0)
276 type = GNT_COLOR_TEXT_NORMAL;
277 else if (strcmp(key, "disabled") == 0)
278 type = GNT_COLOR_DISABLED;
279 else if (strcmp(key, "urgent") == 0)
280 type = GNT_COLOR_URGENT;
281 else {
282 g_strfreev(list);
283 g_free(key);
284 continue;
286 g_free(key);
288 init_pair(type, fg, bg);
290 g_strfreev(list);
293 g_strfreev(keys);
296 #endif /* GKeyFile */
298 int gnt_color_pair(int pair)
300 return (hascolors ? COLOR_PAIR(pair) :
301 ((pair == GNT_COLOR_NORMAL || pair == GNT_COLOR_HIGHLIGHT_D ||
302 pair == GNT_COLOR_TITLE_D || pair == GNT_COLOR_DISABLED) ? 0 : A_STANDOUT));
305 int gnt_color_add_pair(int fg, int bg)
307 init_pair(custom_type, fg, bg);
308 return custom_type++;