1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 appearance.c for ObConf, the configuration tool for Openbox
4 Copyright (c) 2003-2007 Dana Jansens
5 Copyright (c) 2003 Tim Riley
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.
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.
17 See the COPYING file for a copy of the GNU General Public License.
22 #include "preview_update.h"
24 static gboolean mapping = FALSE;
26 static RrFont *read_font(GtkFontButton *w, const gchar *place, gboolean def);
27 static RrFont *write_font(GtkFontButton *w, const gchar *place);
29 void appearance_setup_tab()
37 w = get_widget("window_border");
38 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
39 tree_get_bool("theme/keepBorder", TRUE));
41 w = get_widget("animate_iconify");
42 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
43 tree_get_bool("theme/animateIconify", TRUE));
45 w = get_widget("title_layout");
46 layout = tree_get_string("theme/titleLayout", "NLIMC");
47 gtk_entry_set_text(GTK_ENTRY(w), layout);
48 preview_update_set_title_layout(layout);
51 w = get_widget("font_active");
52 f = read_font(GTK_FONT_BUTTON(w), "ActiveWindow", TRUE);
53 preview_update_set_active_font(f);
55 w = get_widget("font_inactive");
56 f = read_font(GTK_FONT_BUTTON(w), "InactiveWindow", TRUE);
57 preview_update_set_inactive_font(f);
59 w = get_widget("font_menu_header");
60 f = read_font(GTK_FONT_BUTTON(w), "MenuHeader", TRUE);
61 preview_update_set_menu_header_font(f);
63 w = get_widget("font_menu_item");
64 f = read_font(GTK_FONT_BUTTON(w), "MenuItem", TRUE);
65 preview_update_set_menu_item_font(f);
67 w = get_widget("font_active_display");
68 if (!(f = read_font(GTK_FONT_BUTTON(w), "ActiveOnScreenDisplay", FALSE))) {
69 f = read_font(GTK_FONT_BUTTON(w), "OnScreenDisplay", TRUE);
70 tree_delete_node("theme/font:place=OnScreenDisplay");
72 preview_update_set_osd_active_font(f);
74 w = get_widget("font_inactive_display");
75 f = read_font(GTK_FONT_BUTTON(w), "InactiveOnScreenDisplay", TRUE);
76 preview_update_set_osd_inactive_font(f);
81 void on_window_border_toggled(GtkToggleButton *w, gpointer data)
87 b = gtk_toggle_button_get_active(w);
88 tree_set_bool("theme/keepBorder", b);
91 void on_animate_iconify_toggled(GtkToggleButton *w, gpointer data)
97 b = gtk_toggle_button_get_active(w);
98 tree_set_bool("theme/animateIconify", b);
101 void on_title_layout_changed(GtkEntry *w, gpointer data)
105 gboolean n, d, s, l, i, m, c;
109 layout = g_strdup(gtk_entry_get_text(w));
111 n = d = s = l = i = m = c = FALSE;
113 for (it = layout; *it; ++it) {
151 /* drop the letter */
152 for (it2 = it; *it2; ++it2)
160 gtk_entry_set_text(w, layout);
161 tree_set_string("theme/titleLayout", layout);
162 preview_update_set_title_layout(layout);
167 void on_font_active_font_set(GtkFontButton *w, gpointer data)
171 preview_update_set_active_font(write_font(w, "ActiveWindow"));
174 void on_font_inactive_font_set(GtkFontButton *w, gpointer data)
178 preview_update_set_inactive_font(write_font(w, "InactiveWindow"));
181 void on_font_menu_header_font_set(GtkFontButton *w, gpointer data)
185 preview_update_set_menu_header_font(write_font(w, "MenuHeader"));
188 void on_font_menu_item_font_set(GtkFontButton *w, gpointer data)
192 preview_update_set_menu_item_font(write_font(w, "MenuItem"));
195 void on_font_active_display_font_set(GtkFontButton *w, gpointer data)
199 preview_update_set_osd_active_font(write_font(w, "ActiveOnScreenDisplay"));
202 void on_font_inactive_display_font_set(GtkFontButton *w, gpointer data)
206 preview_update_set_osd_inactive_font
207 (write_font(w, "InactiveOnScreenDisplay"));
210 static RrFont *read_font(GtkFontButton *w, const gchar *place,
211 gboolean use_default)
214 gchar *fontstring, *node;
215 gchar *name, **names;
220 RrFontWeight rr_weight = RR_FONTWEIGHT_NORMAL;
221 RrFontSlant rr_slant = RR_FONTSLANT_NORMAL;
225 node = g_strdup_printf("theme/font:place=%s/name", place);
226 name = tree_get_string(node, use_default ? "Sans" : NULL);
229 if (name[0] == '\0') {
234 node = g_strdup_printf("theme/font:place=%s/size", place);
235 size = tree_get_string(node, "8");
238 node = g_strdup_printf("theme/font:place=%s/weight", place);
239 weight = tree_get_string(node, "");
242 node = g_strdup_printf("theme/font:place=%s/slant", place);
243 slant = tree_get_string(node, "");
246 /* get only the first font in the string */
247 names = g_strsplit(name, ",", 0);
249 name = g_strdup(names[0]);
252 /* don't use "normal" in the gtk string */
253 if (!g_ascii_strcasecmp(weight, "normal")) {
254 g_free(weight); weight = g_strdup("");
256 if (!g_ascii_strcasecmp(slant, "normal")) {
257 g_free(slant); slant = g_strdup("");
260 fontstring = g_strdup_printf("%s %s %s %s", name, weight, slant, size);
261 gtk_font_button_set_font_name(w, fontstring);
263 if (!g_ascii_strcasecmp(weight, "Bold")) rr_weight = RR_FONTWEIGHT_BOLD;
264 if (!g_ascii_strcasecmp(slant, "Italic")) rr_slant = RR_FONTSLANT_ITALIC;
265 if (!g_ascii_strcasecmp(slant, "Oblique")) rr_slant = RR_FONTSLANT_OBLIQUE;
267 font = RrFontOpen(rrinst, name, atoi(size), rr_weight, rr_slant);
279 static RrFont *write_font(GtkFontButton *w, const gchar *place)
283 const gchar *size = NULL;
284 const gchar *bold = NULL;
285 const gchar *italic = NULL;
287 RrFontWeight weight = RR_FONTWEIGHT_NORMAL;
288 RrFontSlant slant = RR_FONTSLANT_NORMAL;
290 if (mapping) return NULL;
292 font = g_strdup(gtk_font_button_get_font_name(w));
293 while ((c = strrchr(font, ' '))) {
294 if (!bold && !italic && !size && atoi(c+1))
296 else if (!bold && !italic && !g_ascii_strcasecmp(c+1, "italic"))
298 else if (!bold && !g_ascii_strcasecmp(c+1, "bold"))
304 if (!bold) bold = "Normal";
305 if (!italic) italic = "Normal";
307 node = g_strdup_printf("theme/font:place=%s/name", place);
308 tree_set_string(node, font);
311 node = g_strdup_printf("theme/font:place=%s/size", place);
312 tree_set_string(node, size);
315 node = g_strdup_printf("theme/font:place=%s/weight", place);
316 tree_set_string(node, bold);
319 node = g_strdup_printf("theme/font:place=%s/slant", place);
320 tree_set_string(node, italic);
323 if (!g_ascii_strcasecmp(bold, "Bold")) weight = RR_FONTWEIGHT_BOLD;
324 if (!g_ascii_strcasecmp(italic, "Italic")) slant = RR_FONTSLANT_ITALIC;
325 if (!g_ascii_strcasecmp(italic, "Oblique")) slant = RR_FONTSLANT_OBLIQUE;
327 return RrFontOpen(rrinst, font, atoi(size), weight, slant);