]> icculus.org git repositories - dana/obconf.git/blob - src/appearance.c
static func
[dana/obconf.git] / src / appearance.c
1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
2
3    appearance.c for ObConf, the configuration tool for Openbox
4    Copyright (c) 2003-2007   Dana Jansens
5    Copyright (c) 2003        Tim Riley
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    See the COPYING file for a copy of the GNU General Public License.
18 */
19
20 #include "main.h"
21 #include "tree.h"
22 #include "preview_update.h"
23
24 static gboolean mapping = FALSE;
25
26 static RrFont *read_font(GtkFontButton *w, const gchar *place);
27 static RrFont *write_font(GtkFontButton *w, const gchar *place);
28
29 void appearance_setup_tab()
30 {
31     GtkWidget *w;
32     gchar *layout;
33     RrFont *f;
34
35     mapping = TRUE;
36
37     w = get_widget("window_border");
38     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
39                                  tree_get_bool("theme/keepBorder", TRUE));
40
41     w = get_widget("title_layout");
42     layout = tree_get_string("theme/titleLayout", "NLIMC");
43     gtk_entry_set_text(GTK_ENTRY(w), layout);
44     preview_update_set_title_layout(layout);
45     g_free(layout);
46
47     w = get_widget("font_active");
48     f = read_font(GTK_FONT_BUTTON(w), "ActiveWindow");
49     preview_update_set_active_font(f);
50
51     w = get_widget("font_inactive");
52     f = read_font(GTK_FONT_BUTTON(w), "InactiveWindow");
53     preview_update_set_inactive_font(f);
54
55     w = get_widget("font_menu_header");
56     f = read_font(GTK_FONT_BUTTON(w), "MenuHeader");
57     preview_update_set_menu_header_font(f);
58
59     w = get_widget("font_menu_item");
60     f = read_font(GTK_FONT_BUTTON(w), "MenuItem");
61     preview_update_set_menu_item_font(f);
62
63     w = get_widget("font_display");
64     f = read_font(GTK_FONT_BUTTON(w), "OnScreenDisplay");
65     preview_update_set_osd_font(f);
66
67     mapping = FALSE;
68 }
69
70 void on_window_border_toggled(GtkToggleButton *w, gpointer data)
71 {
72     gboolean b;
73
74     if (mapping) return;
75
76     b = gtk_toggle_button_get_active(w);
77     tree_set_bool("theme/keepBorder", b);
78 }
79
80 void on_title_layout_changed(GtkEntry *w, gpointer data)
81 {
82     gchar *layout;
83     gchar *it, *it2;
84     gboolean n, d, s, l, i, m, c;
85
86     if (mapping) return;
87
88     layout = g_strdup(gtk_entry_get_text(w));
89
90     n = d = s = l = i = m = c = FALSE;
91
92     for (it = layout; *it; ++it) {
93         gboolean *b;
94
95         switch (*it) {
96         case 'N':
97         case 'n':
98             b = &n;
99             break;
100         case 'd':
101         case 'D':
102             b = &d;
103             break;
104         case 's':
105         case 'S':
106             b = &s;
107             break;
108         case 'l':
109         case 'L':
110             b = &l;
111             break;
112         case 'i':
113         case 'I':
114             b = &i;
115             break;
116         case 'm':
117         case 'M':
118             b = &m;
119             break;
120         case 'c':
121         case 'C':
122             b = &c;
123             break;
124         default:
125             b = NULL;
126             break;
127         }
128
129         if (!b || *b) {
130             /* drop the letter */
131             for (it2 = it; *it2; ++it2)
132                 *it2 = *(it2+1);
133         } else {
134             *it = toupper(*it);
135             *b = TRUE;
136         }
137     }
138
139     gtk_entry_set_text(w, layout);
140     tree_set_string("theme/titleLayout", layout);
141     preview_update_set_title_layout(layout);
142
143     g_free(layout);
144 }
145
146 void on_font_active_font_set(GtkFontButton *w, gpointer data)
147 {
148     if (mapping) return;
149
150     preview_update_set_active_font(write_font(w, "ActiveWindow"));
151 }
152
153 void on_font_inactive_font_set(GtkFontButton *w, gpointer data)
154 {
155     if (mapping) return;
156
157     preview_update_set_inactive_font(write_font(w, "InactiveWindow"));
158 }
159
160 void on_font_menu_header_font_set(GtkFontButton *w, gpointer data)
161 {
162     if (mapping) return;
163
164     preview_update_set_menu_header_font(write_font(w, "MenuHeader"));
165 }
166
167 void on_font_menu_item_font_set(GtkFontButton *w, gpointer data)
168 {
169     if (mapping) return;
170
171     preview_update_set_menu_item_font(write_font(w, "MenuItem"));
172 }
173
174 void on_font_display_font_set(GtkFontButton *w, gpointer data)
175 {
176     if (mapping) return;
177
178     preview_update_set_osd_font(write_font(w, "OnScreenDisplay"));
179 }
180
181 static RrFont *read_font(GtkFontButton *w, const gchar *place)
182 {
183     RrFont *font;
184     gchar *fontstring, *node;
185     gchar *name, **names;
186     gchar *size;
187     gchar *weight;
188     gchar *slant;
189
190     RrFontWeight rr_weight = RR_FONTWEIGHT_NORMAL;
191     RrFontSlant rr_slant = RR_FONTSLANT_NORMAL;
192
193     mapping = TRUE;
194
195     node = g_strdup_printf("theme/font:place=%s/name", place);
196     name = tree_get_string(node, "Sans");
197     g_free(node);
198
199     node = g_strdup_printf("theme/font:place=%s/size", place);
200     size = tree_get_string(node, "8");
201     g_free(node);
202
203     node = g_strdup_printf("theme/font:place=%s/weight", place);
204     weight = tree_get_string(node, "");
205     g_free(node);
206
207     node = g_strdup_printf("theme/font:place=%s/slant", place);
208     slant = tree_get_string(node, "");
209     g_free(node);
210
211     /* get only the first font in the string */
212     names = g_strsplit(name, ",", 0);
213     g_free(name);
214     name = g_strdup(names[0]);
215     g_strfreev(names);
216
217     /* don't use "normal" in the gtk string */
218     if (!g_ascii_strcasecmp(weight, "normal")) {
219         g_free(weight); weight = g_strdup("");
220     }
221     if (!g_ascii_strcasecmp(slant, "normal")) {
222         g_free(slant); slant = g_strdup("");
223     }
224
225     fontstring = g_strdup_printf("%s %s %s %s", name, weight, slant, size);
226     gtk_font_button_set_font_name(w, fontstring);
227
228     if (!g_ascii_strcasecmp(weight, "Bold")) rr_weight = RR_FONTWEIGHT_BOLD;
229     if (!g_ascii_strcasecmp(slant, "Italic")) rr_slant = RR_FONTSLANT_ITALIC;
230     if (!g_ascii_strcasecmp(slant, "Oblique")) rr_slant = RR_FONTSLANT_OBLIQUE;
231
232     font = RrFontOpen(rrinst, name, atoi(size), rr_weight, rr_slant);
233     g_free(fontstring);
234     g_free(slant);
235     g_free(weight);
236     g_free(size);
237     g_free(name);
238
239     mapping = FALSE;
240
241     return font;
242 }
243
244 static RrFont *write_font(GtkFontButton *w, const gchar *place)
245 {
246     gchar *c;
247     gchar *font, *node;
248     const gchar *size = NULL;
249     const gchar *bold = NULL;
250     const gchar *italic = NULL;
251
252     RrFontWeight weight = RR_FONTWEIGHT_NORMAL;
253     RrFontSlant slant = RR_FONTSLANT_NORMAL;
254
255     if (mapping) return;
256
257     font = g_strdup(gtk_font_button_get_font_name(w));
258     while ((c = strrchr(font, ' '))) {
259         if (!bold && !italic && !size && atoi(c+1))
260             size = c+1;
261         else if (!bold && !italic && !g_ascii_strcasecmp(c+1, "italic"))
262             italic = c+1;
263         else if (!bold && !g_ascii_strcasecmp(c+1, "bold"))
264             bold = c+1;
265         else
266             break;
267         *c = '\0';
268     }
269     if (!bold) bold = "Normal";
270     if (!italic) italic = "Normal";
271
272     node = g_strdup_printf("theme/font:place=%s/name", place);
273     tree_set_string(node, font);
274     g_free(node);
275
276     node = g_strdup_printf("theme/font:place=%s/size", place);
277     tree_set_string(node, size);
278     g_free(node);
279
280     node = g_strdup_printf("theme/font:place=%s/weight", place);
281     tree_set_string(node, bold);
282     g_free(node);
283
284     node = g_strdup_printf("theme/font:place=%s/slant", place);
285     tree_set_string(node, italic);
286     g_free(node);
287
288     if (!g_ascii_strcasecmp(bold, "Bold")) weight = RR_FONTWEIGHT_BOLD;
289     if (!g_ascii_strcasecmp(italic, "Italic")) slant = RR_FONTSLANT_ITALIC;
290     if (!g_ascii_strcasecmp(italic, "Oblique")) slant = RR_FONTSLANT_OBLIQUE;
291
292     return RrFontOpen(rrinst, font, atoi(size), weight, slant);
293
294     g_free(font);
295
296 }