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);
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("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);
47 w = get_widget("font_active");
48 f = read_font(GTK_FONT_BUTTON(w), "ActiveWindow");
49 preview_update_set_active_font(f);
51 w = get_widget("font_inactive");
52 f = read_font(GTK_FONT_BUTTON(w), "InactiveWindow");
53 preview_update_set_inactive_font(f);
55 w = get_widget("font_menu_header");
56 f = read_font(GTK_FONT_BUTTON(w), "MenuHeader");
57 preview_update_set_menu_header_font(f);
59 w = get_widget("font_menu_item");
60 f = read_font(GTK_FONT_BUTTON(w), "MenuItem");
61 preview_update_set_menu_item_font(f);
63 w = get_widget("font_display");
64 f = read_font(GTK_FONT_BUTTON(w), "OnScreenDisplay");
65 preview_update_set_osd_font(f);
70 void on_window_border_toggled(GtkToggleButton *w, gpointer data)
76 b = gtk_toggle_button_get_active(w);
77 tree_set_bool("theme/keepBorder", b);
80 void on_title_layout_changed(GtkEntry *w, gpointer data)
84 gboolean n, d, s, l, i, m, c;
88 layout = g_strdup(gtk_entry_get_text(w));
90 n = d = s = l = i = m = c = FALSE;
92 for (it = layout; *it; ++it) {
130 /* drop the letter */
131 for (it2 = it; *it2; ++it2)
139 gtk_entry_set_text(w, layout);
140 tree_set_string("theme/titleLayout", layout);
141 preview_update_set_title_layout(layout);
146 void on_font_active_font_set(GtkFontButton *w, gpointer data)
148 preview_update_set_active_font(write_font(w, "ActiveWindow"));
151 void on_font_inactive_font_set(GtkFontButton *w, gpointer data)
153 preview_update_set_inactive_font(write_font(w, "InactiveWindow"));
156 void on_font_menu_header_font_set(GtkFontButton *w, gpointer data)
158 preview_update_set_menu_header_font(write_font(w, "MenuHeader"));
161 void on_font_menu_item_font_set(GtkFontButton *w, gpointer data)
163 preview_update_set_menu_item_font(write_font(w, "MenuItem"));
166 void on_font_display_font_set(GtkFontButton *w, gpointer data)
168 preview_update_set_osd_font(write_font(w, "OnScreenDisplay"));
171 static RrFont *read_font(GtkFontButton *w, const gchar *place)
174 gchar *fontstring, *node;
175 gchar *name, **names;
180 RrFontWeight rr_weight = RR_FONTWEIGHT_NORMAL;
181 RrFontSlant rr_slant = RR_FONTSLANT_NORMAL;
185 node = g_strdup_printf("theme/font:place=%s/name", place);
186 name = tree_get_string(node, "Sans");
189 node = g_strdup_printf("theme/font:place=%s/size", place);
190 size = tree_get_string(node, "8");
193 node = g_strdup_printf("theme/font:place=%s/weight", place);
194 weight = tree_get_string(node, "");
197 node = g_strdup_printf("theme/font:place=%s/slant", place);
198 slant = tree_get_string(node, "");
201 /* get only the first font in the string */
202 names = g_strsplit(name, ",", 0);
204 name = g_strdup(names[0]);
207 /* don't use "normal" in the gtk string */
208 if (!g_ascii_strcasecmp(weight, "normal")) {
209 g_free(weight); weight = g_strdup("");
211 if (!g_ascii_strcasecmp(slant, "normal")) {
212 g_free(slant); slant = g_strdup("");
215 fontstring = g_strdup_printf("%s %s %s %s", name, weight, slant, size);
216 gtk_font_button_set_font_name(w, fontstring);
218 if (!g_ascii_strcasecmp(weight, "Bold")) rr_weight = RR_FONTWEIGHT_BOLD;
219 if (!g_ascii_strcasecmp(slant, "Italic")) rr_slant = RR_FONTSLANT_ITALIC;
220 if (!g_ascii_strcasecmp(slant, "Oblique")) rr_slant = RR_FONTSLANT_OBLIQUE;
222 font = RrFontOpen(rrinst, name, atoi(size), rr_weight, rr_slant);
234 static RrFont *write_font(GtkFontButton *w, const gchar *place)
238 const gchar *size = NULL;
239 const gchar *bold = NULL;
240 const gchar *italic = NULL;
242 RrFontWeight weight = RR_FONTWEIGHT_NORMAL;
243 RrFontSlant slant = RR_FONTSLANT_NORMAL;
247 font = g_strdup(gtk_font_button_get_font_name(w));
248 while ((c = strrchr(font, ' '))) {
249 if (!bold && !italic && !size && atoi(c+1))
251 else if (!bold && !italic && !g_ascii_strcasecmp(c+1, "italic"))
253 else if (!bold && !g_ascii_strcasecmp(c+1, "bold"))
259 if (!bold) bold = "Normal";
260 if (!italic) italic = "Normal";
262 node = g_strdup_printf("theme/font:place=%s/name", place);
263 tree_set_string(node, font);
266 node = g_strdup_printf("theme/font:place=%s/size", place);
267 tree_set_string(node, size);
270 node = g_strdup_printf("theme/font:place=%s/weight", place);
271 tree_set_string(node, bold);
274 node = g_strdup_printf("theme/font:place=%s/slant", place);
275 tree_set_string(node, italic);
278 if (!g_ascii_strcasecmp(bold, "Bold")) weight = RR_FONTWEIGHT_BOLD;
279 if (!g_ascii_strcasecmp(italic, "Italic")) slant = RR_FONTSLANT_ITALIC;
280 if (!g_ascii_strcasecmp(italic, "Oblique")) slant = RR_FONTSLANT_OBLIQUE;
282 return RrFontOpen(rrinst, font, atoi(size), weight, slant);