Mercurial > pidgin.yaz
comparison 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 |
comparison
equal
deleted
inserted
replaced
15817:317e7613e581 | 15818:0e3a8505ebbe |
---|---|
1 #include "config.h" | |
2 | |
3 #include <ncurses.h> | |
4 | |
5 #include "gntcolors.h" | |
6 #include "gntstyle.h" | |
7 | |
8 #include <glib.h> | |
9 | |
10 #include <stdlib.h> | |
11 #include <string.h> | |
12 | |
13 static struct | |
14 { | |
15 short r, g, b; | |
16 } colors[GNT_TOTAL_COLORS]; | |
17 | |
18 static void | |
19 backup_colors() | |
20 { | |
21 short i; | |
22 for (i = 0; i < GNT_TOTAL_COLORS; i++) | |
23 { | |
24 color_content(i, &colors[i].r, | |
25 &colors[i].g, &colors[i].b); | |
26 } | |
27 } | |
28 | |
29 static gboolean | |
30 can_use_custom_color() | |
31 { | |
32 return (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color()); | |
33 } | |
34 | |
35 static void | |
36 restore_colors() | |
37 { | |
38 short i; | |
39 for (i = 0; i < GNT_TOTAL_COLORS; i++) | |
40 { | |
41 init_color(i, colors[i].r, | |
42 colors[i].g, colors[i].b); | |
43 } | |
44 } | |
45 | |
46 void gnt_init_colors() | |
47 { | |
48 static gboolean init = FALSE; | |
49 int defaults; | |
50 | |
51 if (init) | |
52 return; | |
53 init = TRUE; | |
54 | |
55 start_color(); | |
56 defaults = use_default_colors(); | |
57 | |
58 if (can_use_custom_color()) | |
59 { | |
60 backup_colors(); | |
61 | |
62 /* Do some init_color()s */ | |
63 init_color(GNT_COLOR_BLACK, 0, 0, 0); | |
64 init_color(GNT_COLOR_RED, 1000, 0, 0); | |
65 init_color(GNT_COLOR_GREEN, 0, 1000, 0); | |
66 init_color(GNT_COLOR_BLUE, 250, 250, 700); | |
67 init_color(GNT_COLOR_WHITE, 1000, 1000, 1000); | |
68 init_color(GNT_COLOR_GRAY, 699, 699, 699); | |
69 init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256); | |
70 | |
71 /* Now some init_pair()s */ | |
72 init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE); | |
73 init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_WHITE, GNT_COLOR_BLUE); | |
74 init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); | |
75 | |
76 init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_BLUE); | |
77 init_pair(GNT_COLOR_TITLE_D, GNT_COLOR_WHITE, GNT_COLOR_GRAY); | |
78 | |
79 init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_WHITE, GNT_COLOR_BLUE); | |
80 init_pair(GNT_COLOR_HIGHLIGHT_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY); | |
81 init_pair(GNT_COLOR_DISABLED, GNT_COLOR_GRAY, GNT_COLOR_WHITE); | |
82 init_pair(GNT_COLOR_URGENT, GNT_COLOR_WHITE, GNT_COLOR_RED); | |
83 } | |
84 else | |
85 { | |
86 int bg; | |
87 | |
88 if (defaults == OK) { | |
89 init_pair(GNT_COLOR_NORMAL, -1, -1); | |
90 bg = -1; | |
91 } else { | |
92 init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); | |
93 bg = COLOR_WHITE; | |
94 } | |
95 init_pair(GNT_COLOR_DISABLED, COLOR_YELLOW, bg); | |
96 init_pair(GNT_COLOR_URGENT, COLOR_GREEN, bg); | |
97 | |
98 init_pair(GNT_COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE); | |
99 init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); | |
100 init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLUE); | |
101 init_pair(GNT_COLOR_TITLE_D, COLOR_WHITE, COLOR_BLACK); | |
102 init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_WHITE, COLOR_BLUE); | |
103 init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK); | |
104 } | |
105 } | |
106 | |
107 void | |
108 gnt_uninit_colors() | |
109 { | |
110 if (can_use_custom_color()) | |
111 restore_colors(); | |
112 } | |
113 | |
114 static int | |
115 get_color(char *key) | |
116 { | |
117 int color; | |
118 gboolean custom = can_use_custom_color(); | |
119 | |
120 key = g_strstrip(key); | |
121 | |
122 if (strcmp(key, "black") == 0) | |
123 color = custom ? GNT_COLOR_BLACK : COLOR_BLACK; | |
124 else if (strcmp(key, "red") == 0) | |
125 color = custom ? GNT_COLOR_RED : COLOR_RED; | |
126 else if (strcmp(key, "green") == 0) | |
127 color = custom ? GNT_COLOR_GREEN : COLOR_GREEN; | |
128 else if (strcmp(key, "blue") == 0) | |
129 color = custom ? GNT_COLOR_BLUE : COLOR_BLUE; | |
130 else if (strcmp(key, "white") == 0) | |
131 color = custom ? GNT_COLOR_WHITE : COLOR_WHITE; | |
132 else if (strcmp(key, "gray") == 0) | |
133 color = custom ? GNT_COLOR_GRAY : COLOR_YELLOW; /* eh? */ | |
134 else if (strcmp(key, "darkgray") == 0) | |
135 color = custom ? GNT_COLOR_DARK_GRAY : COLOR_BLACK; | |
136 else if (strcmp(key, "magenta") == 0) | |
137 color = COLOR_MAGENTA; | |
138 else if (strcmp(key, "cyan") == 0) | |
139 color = COLOR_CYAN; | |
140 else | |
141 color = -1; | |
142 return color; | |
143 } | |
144 | |
145 #if GLIB_CHECK_VERSION(2,6,0) | |
146 void gnt_colors_parse(GKeyFile *kfile) | |
147 { | |
148 GError *error = NULL; | |
149 gsize nkeys; | |
150 char **keys = g_key_file_get_keys(kfile, "colors", &nkeys, &error); | |
151 | |
152 if (error) | |
153 { | |
154 g_printerr("GntColors: %s\n", error->message); | |
155 g_error_free(error); | |
156 error = NULL; | |
157 } | |
158 else if (nkeys) | |
159 { | |
160 gnt_init_colors(); | |
161 while (nkeys--) | |
162 { | |
163 gsize len; | |
164 gchar *key = keys[nkeys]; | |
165 char **list = g_key_file_get_string_list(kfile, "colors", key, &len, NULL); | |
166 if (len == 3) | |
167 { | |
168 int r = atoi(list[0]); | |
169 int g = atoi(list[1]); | |
170 int b = atoi(list[2]); | |
171 int color = -1; | |
172 | |
173 key = g_ascii_strdown(key, -1); | |
174 color = get_color(key); | |
175 g_free(key); | |
176 if (color == -1) | |
177 continue; | |
178 | |
179 init_color(color, r, g, b); | |
180 } | |
181 g_strfreev(list); | |
182 } | |
183 | |
184 g_strfreev(keys); | |
185 } | |
186 | |
187 gnt_color_pairs_parse(kfile); | |
188 } | |
189 | |
190 void gnt_color_pairs_parse(GKeyFile *kfile) | |
191 { | |
192 GError *error = NULL; | |
193 gsize nkeys; | |
194 char **keys = g_key_file_get_keys(kfile, "colorpairs", &nkeys, &error); | |
195 | |
196 if (error) | |
197 { | |
198 g_printerr("GntColors: %s\n", error->message); | |
199 g_error_free(error); | |
200 return; | |
201 } | |
202 else if (nkeys) | |
203 gnt_init_colors(); | |
204 | |
205 while (nkeys--) | |
206 { | |
207 gsize len; | |
208 gchar *key = keys[nkeys]; | |
209 char **list = g_key_file_get_string_list(kfile, "colorpairs", key, &len, NULL); | |
210 if (len == 2) | |
211 { | |
212 GntColorType type = 0; | |
213 gchar *fgc = g_ascii_strdown(list[0], -1); | |
214 gchar *bgc = g_ascii_strdown(list[1], -1); | |
215 int fg = get_color(fgc); | |
216 int bg = get_color(bgc); | |
217 g_free(fgc); | |
218 g_free(bgc); | |
219 if (fg == -1 || bg == -1) | |
220 continue; | |
221 | |
222 key = g_ascii_strdown(key, -1); | |
223 | |
224 if (strcmp(key, "normal") == 0) | |
225 type = GNT_COLOR_NORMAL; | |
226 else if (strcmp(key, "highlight") == 0) | |
227 type = GNT_COLOR_HIGHLIGHT; | |
228 else if (strcmp(key, "highlightd") == 0) | |
229 type = GNT_COLOR_HIGHLIGHT_D; | |
230 else if (strcmp(key, "shadow") == 0) | |
231 type = GNT_COLOR_SHADOW; | |
232 else if (strcmp(key, "title") == 0) | |
233 type = GNT_COLOR_TITLE; | |
234 else if (strcmp(key, "titled") == 0) | |
235 type = GNT_COLOR_TITLE_D; | |
236 else if (strcmp(key, "text") == 0) | |
237 type = GNT_COLOR_TEXT_NORMAL; | |
238 else if (strcmp(key, "disabled") == 0) | |
239 type = GNT_COLOR_DISABLED; | |
240 else if (strcmp(key, "urgent") == 0) | |
241 type = GNT_COLOR_URGENT; | |
242 else { | |
243 g_free(key); | |
244 continue; | |
245 } | |
246 g_free(key); | |
247 | |
248 init_pair(type, fg, bg); | |
249 } | |
250 g_strfreev(list); | |
251 } | |
252 | |
253 g_strfreev(keys); | |
254 } | |
255 | |
256 #endif /* GKeyFile */ |