Add missing AUTHORS and ChangeLog.
[gnt.git] / gntcolors.c
blob11cdf62c219f439b85582b5a182fae6d154831e8
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 "gntcolors.h"
28 #include "gntstyle.h"
30 #include <glib.h>
32 #include <stdlib.h>
33 #include <string.h>
35 static gboolean hascolors;
36 static struct
38 short r, g, b;
39 } colors[GNT_TOTAL_COLORS];
41 static void
42 backup_colors()
44 short i;
45 for (i = 0; i < GNT_TOTAL_COLORS; i++)
47 color_content(i, &colors[i].r,
48 &colors[i].g, &colors[i].b);
52 static gboolean
53 can_use_custom_color()
55 return (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color());
58 static void
59 restore_colors()
61 short i;
62 for (i = 0; i < GNT_TOTAL_COLORS; i++)
64 init_color(i, colors[i].r,
65 colors[i].g, colors[i].b);
69 void gnt_init_colors()
71 static gboolean init = FALSE;
72 int defaults;
74 if (init)
75 return;
76 init = TRUE;
78 start_color();
79 if (!(hascolors = has_colors()))
80 return;
81 defaults = use_default_colors();
83 if (can_use_custom_color())
85 backup_colors();
87 /* Do some init_color()s */
88 init_color(GNT_COLOR_BLACK, 0, 0, 0);
89 init_color(GNT_COLOR_RED, 1000, 0, 0);
90 init_color(GNT_COLOR_GREEN, 0, 1000, 0);
91 init_color(GNT_COLOR_BLUE, 250, 250, 700);
92 init_color(GNT_COLOR_WHITE, 1000, 1000, 1000);
93 init_color(GNT_COLOR_GRAY, 699, 699, 699);
94 init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256);
96 /* Now some init_pair()s */
97 init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE);
98 init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_WHITE, GNT_COLOR_BLUE);
99 init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY);
101 init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_BLUE);
102 init_pair(GNT_COLOR_TITLE_D, GNT_COLOR_WHITE, GNT_COLOR_GRAY);
104 init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_WHITE, GNT_COLOR_BLUE);
105 init_pair(GNT_COLOR_HIGHLIGHT_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY);
106 init_pair(GNT_COLOR_DISABLED, GNT_COLOR_GRAY, GNT_COLOR_WHITE);
107 init_pair(GNT_COLOR_URGENT, GNT_COLOR_WHITE, GNT_COLOR_RED);
109 else
111 int bg;
113 if (defaults == OK) {
114 init_pair(GNT_COLOR_NORMAL, -1, -1);
115 bg = -1;
116 } else {
117 init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE);
118 bg = COLOR_WHITE;
120 init_pair(GNT_COLOR_DISABLED, COLOR_YELLOW, bg);
121 init_pair(GNT_COLOR_URGENT, COLOR_GREEN, bg);
123 init_pair(GNT_COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE);
124 init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK);
125 init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLUE);
126 init_pair(GNT_COLOR_TITLE_D, COLOR_WHITE, COLOR_BLACK);
127 init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_WHITE, COLOR_BLUE);
128 init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK);
132 void
133 gnt_uninit_colors()
135 if (can_use_custom_color())
136 restore_colors();
139 #if GLIB_CHECK_VERSION(2,6,0)
140 static int
141 get_color(char *key)
143 int color;
144 gboolean custom = can_use_custom_color();
146 key = g_strstrip(key);
148 if (strcmp(key, "black") == 0)
149 color = custom ? GNT_COLOR_BLACK : COLOR_BLACK;
150 else if (strcmp(key, "red") == 0)
151 color = custom ? GNT_COLOR_RED : COLOR_RED;
152 else if (strcmp(key, "green") == 0)
153 color = custom ? GNT_COLOR_GREEN : COLOR_GREEN;
154 else if (strcmp(key, "blue") == 0)
155 color = custom ? GNT_COLOR_BLUE : COLOR_BLUE;
156 else if (strcmp(key, "white") == 0)
157 color = custom ? GNT_COLOR_WHITE : COLOR_WHITE;
158 else if (strcmp(key, "gray") == 0)
159 color = custom ? GNT_COLOR_GRAY : COLOR_YELLOW; /* eh? */
160 else if (strcmp(key, "darkgray") == 0)
161 color = custom ? GNT_COLOR_DARK_GRAY : COLOR_BLACK;
162 else if (strcmp(key, "magenta") == 0)
163 color = COLOR_MAGENTA;
164 else if (strcmp(key, "cyan") == 0)
165 color = COLOR_CYAN;
166 else
167 color = -1;
168 return color;
171 void gnt_colors_parse(GKeyFile *kfile)
173 GError *error = NULL;
174 gsize nkeys;
175 char **keys = g_key_file_get_keys(kfile, "colors", &nkeys, &error);
177 if (error)
179 g_printerr("GntColors: %s\n", error->message);
180 g_error_free(error);
181 error = NULL;
183 else if (nkeys)
185 gnt_init_colors();
186 while (nkeys--)
188 gsize len;
189 gchar *key = keys[nkeys];
190 char **list = g_key_file_get_string_list(kfile, "colors", key, &len, NULL);
191 if (len == 3)
193 int r = atoi(list[0]);
194 int g = atoi(list[1]);
195 int b = atoi(list[2]);
196 int color = -1;
198 key = g_ascii_strdown(key, -1);
199 color = get_color(key);
200 g_free(key);
201 if (color == -1)
202 continue;
204 init_color(color, r, g, b);
206 g_strfreev(list);
209 g_strfreev(keys);
212 gnt_color_pairs_parse(kfile);
215 void gnt_color_pairs_parse(GKeyFile *kfile)
217 GError *error = NULL;
218 gsize nkeys;
219 char **keys = g_key_file_get_keys(kfile, "colorpairs", &nkeys, &error);
221 if (error)
223 g_printerr("GntColors: %s\n", error->message);
224 g_error_free(error);
225 return;
227 else if (nkeys)
228 gnt_init_colors();
230 while (nkeys--)
232 gsize len;
233 gchar *key = keys[nkeys];
234 char **list = g_key_file_get_string_list(kfile, "colorpairs", key, &len, NULL);
235 if (len == 2)
237 GntColorType type = 0;
238 gchar *fgc = g_ascii_strdown(list[0], -1);
239 gchar *bgc = g_ascii_strdown(list[1], -1);
240 int fg = get_color(fgc);
241 int bg = get_color(bgc);
242 g_free(fgc);
243 g_free(bgc);
244 if (fg == -1 || bg == -1)
245 continue;
247 key = g_ascii_strdown(key, -1);
249 if (strcmp(key, "normal") == 0)
250 type = GNT_COLOR_NORMAL;
251 else if (strcmp(key, "highlight") == 0)
252 type = GNT_COLOR_HIGHLIGHT;
253 else if (strcmp(key, "highlightd") == 0)
254 type = GNT_COLOR_HIGHLIGHT_D;
255 else if (strcmp(key, "shadow") == 0)
256 type = GNT_COLOR_SHADOW;
257 else if (strcmp(key, "title") == 0)
258 type = GNT_COLOR_TITLE;
259 else if (strcmp(key, "titled") == 0)
260 type = GNT_COLOR_TITLE_D;
261 else if (strcmp(key, "text") == 0)
262 type = GNT_COLOR_TEXT_NORMAL;
263 else if (strcmp(key, "disabled") == 0)
264 type = GNT_COLOR_DISABLED;
265 else if (strcmp(key, "urgent") == 0)
266 type = GNT_COLOR_URGENT;
267 else {
268 g_free(key);
269 continue;
271 g_free(key);
273 init_pair(type, fg, bg);
275 g_strfreev(list);
278 g_strfreev(keys);
281 #endif /* GKeyFile */
283 int gnt_color_pair(int pair)
285 return (hascolors ? COLOR_PAIR(pair) :
286 ((pair == GNT_COLOR_NORMAL || pair == GNT_COLOR_HIGHLIGHT_D ||
287 pair == GNT_COLOR_TITLE_D || pair == GNT_COLOR_DISABLED) ? 0 : A_STANDOUT));