Mercurial > pidgin
annotate finch/libgnt/gntstyle.c @ 17698:56d2ae9cbb5c
Initial workspace support. refs #51
author | Richard Nelson <wabz@pidgin.im> |
---|---|
date | Fri, 27 Apr 2007 01:51:20 +0000 |
parents | 8a54f74fecdf |
children | 4ea517cb7ceb |
rev | line source |
---|---|
15817 | 1 #include "gntstyle.h" |
2 #include "gntcolors.h" | |
17698
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
3 #include "gntws.h" |
15817 | 4 |
5 #include <ctype.h> | |
6 #include <string.h> | |
7 | |
8 #if GLIB_CHECK_VERSION(2,6,0) | |
9 static GKeyFile *gkfile; | |
10 #endif | |
11 | |
12 static char * str_styles[GNT_STYLES]; | |
13 static int int_styles[GNT_STYLES]; | |
14 static int bool_styles[GNT_STYLES]; | |
15 | |
16 const char *gnt_style_get(GntStyle style) | |
17 { | |
18 return str_styles[style]; | |
19 } | |
20 | |
21 gboolean gnt_style_get_bool(GntStyle style, gboolean def) | |
22 { | |
23 int i; | |
24 const char * str; | |
25 | |
26 if (bool_styles[style] != -1) | |
27 return bool_styles[style]; | |
28 | |
29 str = gnt_style_get(style); | |
30 | |
31 if (str) | |
32 { | |
33 if (strcmp(str, "false") == 0) | |
34 def = FALSE; | |
35 else if (strcmp(str, "true") == 0) | |
36 def = TRUE; | |
37 else if (sscanf(str, "%d", &i) == 1) | |
38 { | |
39 if (i) | |
40 def = TRUE; | |
41 else | |
42 def = FALSE; | |
43 } | |
44 } | |
45 | |
46 bool_styles[style] = def; | |
47 return bool_styles[style]; | |
48 } | |
49 | |
50 static void | |
51 refine(char *text) | |
52 { | |
53 char *s = text, *t = text; | |
54 | |
55 while (*s) | |
56 { | |
57 if (*s == '^' && *(s + 1) == '[') | |
58 { | |
59 *t = '\033'; /* escape */ | |
60 s++; | |
61 } | |
62 else if (*s == '\\') | |
63 { | |
64 if (*(s + 1) == '\0') | |
65 *t = ' '; | |
66 else | |
67 { | |
68 s++; | |
69 if (*s == 'r' || *s == 'n') | |
70 *t = '\r'; | |
71 else if (*s == 't') | |
72 *t = '\t'; | |
73 else | |
74 *t = *s; | |
75 } | |
76 } | |
77 else | |
78 *t = *s; | |
79 t++; | |
80 s++; | |
81 } | |
82 *t = '\0'; | |
83 } | |
84 | |
85 static char * | |
86 parse_key(const char *key) | |
87 { | |
88 return (char *)gnt_key_translate(key); | |
89 } | |
90 | |
17698
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
91 void gnt_style_read_workspaces(GntWM *wm) |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
92 { |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
93 #if GLIB_CHECK_VERSION(2,6,0) |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
94 gchar i; |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
95 gchar *name; |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
96 if (!g_key_file_has_group(gkfile, "Workspaces")) { |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
97 printf("SHIT\n"); |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
98 return; |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
99 } |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
100 |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
101 for (i = '1'; i <= '9'; i++) { |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
102 char key[] = "name-1"; |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
103 key[5] = i; |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
104 name = g_key_file_get_string(gkfile, "Workspaces", key, NULL); |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
105 if (name) { |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
106 GntWS *ws = g_object_new(GNT_TYPE_WS, NULL); |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
107 gnt_ws_set_name(ws, name); |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
108 gnt_wm_add_workspace(wm, ws); |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
109 g_free(name); |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
110 } else { |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
111 return; |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
112 } |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
113 } |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
114 #endif |
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
15964
diff
changeset
|
115 } |
15817 | 116 void gnt_style_read_actions(GType type, GntBindableClass *klass) |
117 { | |
118 #if GLIB_CHECK_VERSION(2,6,0) | |
119 char *name; | |
120 GError *error = NULL; | |
121 | |
122 name = g_strdup_printf("%s::binding", g_type_name(type)); | |
123 | |
124 if (g_key_file_has_group(gkfile, name)) | |
125 { | |
126 gsize len = 0; | |
127 char **keys; | |
128 | |
129 keys = g_key_file_get_keys(gkfile, name, &len, &error); | |
130 if (error) | |
131 { | |
132 g_printerr("GntStyle: %s\n", error->message); | |
133 g_error_free(error); | |
134 g_free(name); | |
135 return; | |
136 } | |
137 | |
138 while (len--) | |
139 { | |
140 char *key, *action; | |
141 | |
142 key = g_strdup(keys[len]); | |
143 action = g_key_file_get_string(gkfile, name, keys[len], &error); | |
144 | |
145 if (error) | |
146 { | |
147 g_printerr("GntStyle: %s\n", error->message); | |
148 g_error_free(error); | |
149 error = NULL; | |
150 } | |
151 else | |
152 { | |
153 const char *keycode = parse_key(key); | |
154 if (keycode == NULL) { | |
155 g_printerr("GntStyle: Invalid key-binding %s\n", key); | |
156 } else { | |
157 gnt_bindable_register_binding(klass, action, keycode, NULL); | |
158 } | |
159 } | |
160 g_free(key); | |
161 g_free(action); | |
162 } | |
163 g_strfreev(keys); | |
164 } | |
165 g_free(name); | |
166 #endif | |
167 } | |
168 | |
169 void gnt_styles_get_keyremaps(GType type, GHashTable *hash) | |
170 { | |
171 #if GLIB_CHECK_VERSION(2,6,0) | |
172 char *name; | |
173 GError *error = NULL; | |
174 | |
175 name = g_strdup_printf("%s::remap", g_type_name(type)); | |
176 | |
177 if (g_key_file_has_group(gkfile, name)) | |
178 { | |
179 gsize len = 0; | |
180 char **keys; | |
181 | |
182 keys = g_key_file_get_keys(gkfile, name, &len, &error); | |
183 if (error) | |
184 { | |
185 g_printerr("GntStyle: %s\n", error->message); | |
186 g_error_free(error); | |
187 g_free(name); | |
188 return; | |
189 } | |
190 | |
191 while (len--) | |
192 { | |
193 char *key, *replace; | |
194 | |
195 key = g_strdup(keys[len]); | |
196 replace = g_key_file_get_string(gkfile, name, keys[len], &error); | |
197 | |
198 if (error) | |
199 { | |
200 g_printerr("GntStyle: %s\n", error->message); | |
201 g_error_free(error); | |
202 error = NULL; | |
203 g_free(key); | |
204 } | |
205 else | |
206 { | |
207 refine(key); | |
208 refine(replace); | |
209 g_hash_table_insert(hash, key, replace); | |
210 } | |
211 } | |
212 g_strfreev(keys); | |
213 } | |
214 | |
215 g_free(name); | |
216 #endif | |
217 } | |
218 | |
219 #if GLIB_CHECK_VERSION(2,6,0) | |
220 static void | |
221 read_general_style(GKeyFile *kfile) | |
222 { | |
223 GError *error = NULL; | |
224 gsize nkeys; | |
225 char **keys = g_key_file_get_keys(kfile, "general", &nkeys, &error); | |
226 int i; | |
227 struct | |
228 { | |
229 const char *style; | |
230 GntStyle en; | |
231 } styles[] = {{"shadow", GNT_STYLE_SHADOW}, | |
232 {"customcolor", GNT_STYLE_COLOR}, | |
233 {"mouse", GNT_STYLE_MOUSE}, | |
234 {"wm", GNT_STYLE_WM}, | |
235 {"remember_position", GNT_STYLE_REMPOS}, | |
236 {NULL, 0}}; | |
237 | |
238 if (error) | |
239 { | |
240 g_printerr("GntStyle: %s\n", error->message); | |
241 g_error_free(error); | |
242 } | |
243 else | |
244 { | |
245 for (i = 0; styles[i].style; i++) | |
246 { | |
247 str_styles[styles[i].en] = | |
15964 | 248 g_key_file_get_string(kfile, "general", styles[i].style, NULL); |
15817 | 249 } |
250 } | |
251 g_strfreev(keys); | |
252 } | |
253 #endif | |
254 | |
255 void gnt_style_read_configure_file(const char *filename) | |
256 { | |
257 #if GLIB_CHECK_VERSION(2,6,0) | |
258 GError *error = NULL; | |
259 gkfile = g_key_file_new(); | |
260 | |
261 if (!g_key_file_load_from_file(gkfile, filename, G_KEY_FILE_NONE, &error)) | |
262 { | |
263 g_printerr("GntStyle: %s\n", error->message); | |
264 g_error_free(error); | |
265 return; | |
266 } | |
267 gnt_colors_parse(gkfile); | |
268 read_general_style(gkfile); | |
269 #endif | |
270 } | |
271 | |
272 void gnt_init_styles() | |
273 { | |
274 int i; | |
275 for (i = 0; i < GNT_STYLES; i++) | |
276 { | |
277 str_styles[i] = NULL; | |
278 int_styles[i] = -1; | |
279 bool_styles[i] = -1; | |
280 } | |
281 } | |
282 | |
283 void gnt_uninit_styles() | |
284 { | |
285 int i; | |
286 for (i = 0; i < GNT_STYLES; i++) | |
287 g_free(str_styles[i]); | |
288 | |
289 #if GLIB_CHECK_VERSION(2,6,0) | |
290 g_key_file_free(gkfile); | |
291 #endif | |
292 } | |
293 |